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;};

解释器输出: 口译员 调试器输出: 调试器

解释器包含下划线字母,而调试器似乎只是忽略了它!我希望在这种情况下会出现某种异常(因为语法中只定义了“A”-“z”字母)。我的语法有什么问题?

4

1 回答 1

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 '_'

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

如果您不希望您的词法分析器从这种没有可行的替代警告中恢复,只需创建一个通过词法分析器规则(称为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';
于 2012-04-23T11:31:52.917 回答