1

我试图找出这个错误。目前,当我提供几个不同的输入时,我要么得到正确的结果,要么得到 ANTLRWorks 调试器无限循环。

1) {v0, p1} = Infinite loop or mismatched token exception
2) {v0..v1} Works!
3) {v0,p1} Works? Why?! Notice the lack of space?

如果有人可以帮助我理解为什么这是模棱两可的,我将不胜感激。我已经尝试过更改运算符优先级,但我仍然无法让它按照我认为的方式工作。谢谢!

    WHITESPACE    :  ( '\t' | ' ' | '\r' | '\n'| '\u000C' )+ { $channel = HIDDEN; };
    LEFTCURL      : '{';
    RIGHTCURL     : '}';
    REGISTER      : ('v'|'p') NUMBER+;

    REGISTERLIST  : LEFTCURL REGISTER (',' REGISTER)* RIGHTCURL;
    REGISTERANGE  : LEFTCURL REGISTER '..' REGISTER RIGHTCURL;
4

1 回答 1

2

WHITESPACEs 只放在HIDDEN解析器规则内的通道上。正如您所注意到的,由于REGISTERLISTREGISTERANGE都是词法分析器规则,因此空格不会被隐藏。这些规则看起来更适合作为解析器规则,而不是考虑这些规则中的空间:

registerList  : LEFTCURL REGISTER (',' REGISTER)* RIGHTCURL;
registerRange : LEFTCURL REGISTER '..' REGISTER RIGHTCURL;
于 2013-09-18T07:46:41.727 回答