如果我尝试在解释器中运行“___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;};
译员输出: 调试器输出:
口译员包括下划线字母和调试器似乎只是忽略它!我期望在这种情况下得到某种异常(因为在语法中只定义'A' - 'z'字母)。我的语法出了什么问题?
答案 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';