解析器/词法分析器规则的Antlr v3错误

时间:2012-02-12 17:40:55

标签: parsing antlr3 lexer

我的Antlr语法有问题。我正在尝试为'typedident'编写一个解析器规则,它可以接受以下输入:

'int a'或'char a'

变量名'a'来自我的词法分析器'IDENT',其定义如下:

IDENT : (('a'..'z'|'A'..'Z') | '_') (('a'..'z'|'A'..'Z')|('0'..'9')| '_')*;

我的'typedident'解析器规则如下:

typedident : (INT|CHAR) IDENT;

INTCHAR已定义为令牌。

我遇到的问题是,当我测试'typedident'时,变量名必须是多个字符。例如:

<{1}}被接受时,

'int a'不被接受。

我得到的输出错误是:

  

“MismatchedTokenException:输入不匹配'a'期待'$'”

知道我为什么会收到此错误?如果错误是微不足道的话,我对Antlr很新,所以道歉。

修改

我确实让它运转了,我不知道为什么。我还有另外两个词法规则定义如下:

'int ab'

我意识到这些都没有被使用所以我删除了它们,现在一切正常!我猜这可行的原因是ALPH : ('a'..'z'|'A'..'Z'); DIGIT : ('0'..'9'); ALPH覆盖了我的其他Lexer规则:

DIGIT

有谁知道是否是这种情况?我很好奇为什么这个问题现在已经解决了。

1 个答案:

答案 0 :(得分:0)

  接受'int ab'时,

'int a'不被接受。   ...   我猜这可行的原因是因为ALPH和DIGIT最重要......

是的,在ALPH规则之前定义了IDENT,在这种情况下,单个字母被标记为ALPH令牌。如果IDENTALPH之前定义了,那么一切都会好起来(在您的情况下)。

总结ANTLR词法分析器规则的工作原理:

  • lexer规则匹配尽可能多的字符(贪婪);
  • 如果2个(或更多)词法分析器规则与同一输入匹配,则首先定义的规则将“win”

您必须意识到词法分析器不会根据解析器(当时)的需要生成令牌。词法分析器独立于解析器运行。