2012-08-10 2 views
1

약간의 문제가 발생했습니다. 내 작은 사용자 정의 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가 그것을 생성했지만. 왜 이런 일이 일어나는 지 아는 사람이 있습니까?

건배!

답변

1

문법에 문제가 없습니다. 너를 위해 엉망이되는 것들은 아마도 ANTLRWorks의 통역관을 사용하고 있다는 사실 일 것이다. 하지마. 통역사가 잘 작동하지 않습니다.

사용 ANTLRWorks '디버거 대신 마법처럼 작동, (문법에서, CTRL + D를 누름). 이 디버거가 FROM "Hello!"를 분석 한 후 보여줍니다 것입니다 :

enter image description here

+0

글쎄 ... 난 당신의 솔루션을 때를 확인할 수 있습니다 자바 컴파일러에 대한 액세스 권한이없는 내 현재 위치에서 문제 ...가 나는 컴파일러가있는 컴퓨터에 도달한다. 건배! – bkwint

+0

@bkwint, 아마도 큰 문법에는 문제가 있지만 게시 한 문법에는 전혀 문제가 없습니다. –

+0

큰 문법은 field_value를 읽었을 때까지 잘 작동합니다 ... 정확히 같은 형식으로 잘못되었습니다. 그래서 이것이 발생할 유일한 문제라고 기대하고 있습니다! 평판이 나타나면 해결책이 정확한지 알 수 있습니다! – bkwint