2012-04-23 221 views
1

,如果我尝试在解释器中运行“___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';