약간의 문제가 발생했습니다. 내 작은 사용자 정의 DSL에서 필드간에 비교 작업을 수행 할 수 있기를 원합니다. 세 가지 필드 형식 (String, Int, Identifier)이 있는데 식별자는 변수 이름입니다. 큰 스펙을 만들었지 만, 문제를 더 작은 문법으로 축소했습니다.Antlr 문자열이 일치하지 않습니다.
문제는 antlrworks를 사용하여 문법에 추가 할 수있는 문자열 문법 표기법을 사용하려고 할 때 내 문자열이 식별자로 간주된다는 것입니다. 나는 그것은 내가 아무튼 식별자에 문자열 내 식별자를 생각해야한다고 생각 무엇을 구문 분석이이
<grammar test>
|
x
|
----------------------------
| | |
FROM field_value !
|
identifier
|
"Hello
같은 파스 트리를 반환 문자열 FROM "Hello!"
다음 구문 분석 할 때
grammar test;
x
: 'FROM' field_value EOF
;
field_value
: STRING
| INT
| identifier
;
identifier
: ID (('.' '`' ID '`')|('.' ID))?
| '`' ID '`' (('.' '`' ID '`')|('.' ID))?
;
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
INT : '0'..'9'+
;
STRING
: '"' (ESC_SEQ | ~('\\'|'"'))* '"'
;
fragment
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;
fragment
ESC_SEQ
: '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
| UNICODE_ESC
| OCTAL_ESC
;
fragment
OCTAL_ESC
: '\\' ('0'..'3') ('0'..'7') ('0'..'7')
| '\\' ('0'..'7') ('0'..'7')
| '\\' ('0'..'7')
;
fragment
UNICODE_ESC
: '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
;
: 이것은 내 문법이다 이중 과자에 관해서는 아무 말도하지 않아야합니다.
게다가 나는 문자열에 대한 내 정의가 잘못되었다고 생각합니다. antlrworks가 그것을 생성했지만. 왜 이런 일이 일어나는 지 아는 사람이 있습니까?
건배!
글쎄 ... 난 당신의 솔루션을 때를 확인할 수 있습니다 자바 컴파일러에 대한 액세스 권한이없는 내 현재 위치에서 문제 ...가 나는 컴파일러가있는 컴퓨터에 도달한다. 건배! – bkwint
@bkwint, 아마도 큰 문법에는 문제가 있지만 게시 한 문법에는 전혀 문제가 없습니다. –
큰 문법은 field_value를 읽었을 때까지 잘 작동합니다 ... 정확히 같은 형식으로 잘못되었습니다. 그래서 이것이 발생할 유일한 문제라고 기대하고 있습니다! 평판이 나타나면 해결책이 정확한지 알 수 있습니다! – bkwint