忽略了下划线字母

时间:2012-04-23 11:15:49

标签: antlr antlrworks

如果我尝试在解释器中运行“___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 个答案:

答案 0 :(得分:2)

不要使用解释器:它是错误的。

使用调试器,您可以在按下 Output 按钮(左下角)后查看解析器产生的警告/错误/异常。执行此操作时,您将看到以下内容:

.../__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 '_'

解析器只是从下划线中恢复并继续解析。

如果您不希望词法分析器从没有可行的替代警告中恢复,只需创建一个 fall through 词法分析器规则(称为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';