2012-04-23 3 views
1

무시 밑줄 문자 i는 다음과 같은 문법 인터프리터에서 "___sad"를 실행하려고하면

grammar identTest; 
options  

{ 
    language = Java; 
    output=AST; 
} 


goal: identifier; 

fragment Letter: (('a'..'z') | ('A'..'Z')); 
fragment Digit : '0' .. '9'; 
identifier :IDENTIFIER; 


IDENTIFIER: Letter+; 
WS:(' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}; 

가 통역 출력

: interpreter 디버거 출력 : debugger

통역은 밑줄 문자와 디버거를 포함 보인다 그냥 무시해! 이 경우에는 ('A'- 'z'문자 만 문법에 정의되어 있기 때문에) 어떤 종류의 예외가 생길 것으로 예상됩니다. 문법에 어떤 문제가 있습니까?

답변

1

인터프리터를 사용하지 마십시오. 버그가 있습니다.

디버거를 사용하면 출력 버튼 (왼쪽 아래 모서리)을 누른 후 파서가 생성하는 경고/오류/예외를 볼 수 있습니다.

.../__Test___input.txt line 1:0 no viable alternative at character '_' 
.../__Test___input.txt line 1:1 no viable alternative at character '_' 
.../__Test___input.txt line 1:2 no viable alternative at character '_' 

파서는 단순히 밑줄에서 회복과 해석을 계속 : 이렇게하면 다음 볼 수 있습니다.

당신이 당신의 렉서는 어떤 대안 경고에서 복구하지 않으려면

는 단순히 가을 통해 렉서 규칙 ( OTHER라는)를 만들고 그것에서 예외가 던져 :

grammar identTest; 

options  
{ 
    language = Java; 
    output=AST; 
} 


goal  : identifier; 
identifier : IDENTIFIER; 

IDENTIFIER : Letter+; 
WS   : (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=HIDDEN;}; 
OTHER  : . {throw new RuntimeException("unknown char: '" + $text + "'");}; 

fragment Letter : (('a'..'z') | ('A'..'Z')); 
fragment Digit : '0' .. '9';