我的Antlr语法有问题。我正在尝试为'typedident'编写一个解析器规则,它可以接受以下输入:
'int a'或'char a'
变量名'a'来自我的词法分析器'IDENT',其定义如下:
IDENT : (('a'..'z'|'A'..'Z') | '_') (('a'..'z'|'A'..'Z')|('0'..'9')| '_')*;
我的'typedident'解析器规则如下:
typedident : (INT|CHAR) IDENT;
INT
和CHAR
已定义为令牌。
我遇到的问题是,当我测试'typedident'时,变量名必须是多个字符。例如:
<{1}}被接受时, 'int a'
不被接受。
我得到的输出错误是:
“MismatchedTokenException:输入不匹配'a'期待'$'”
知道我为什么会收到此错误?如果错误是微不足道的话,我对Antlr很新,所以道歉。
修改
我确实让它运转了,我不知道为什么。我还有另外两个词法规则定义如下:
'int ab'
我意识到这些都没有被使用所以我删除了它们,现在一切正常!我猜这可行的原因是ALPH : ('a'..'z'|'A'..'Z');
DIGIT : ('0'..'9');
和ALPH
覆盖了我的其他Lexer规则:
DIGIT
有谁知道是否是这种情况?我很好奇为什么这个问题现在已经解决了。
答案 0 :(得分:0)
接受'int ab'时,'int a'不被接受。 ... 我猜这可行的原因是因为ALPH和DIGIT最重要......
是的,在ALPH
规则之前定义了IDENT
,在这种情况下,单个字母被标记为ALPH
令牌。如果IDENT
在 ALPH
之前定义了,那么一切都会好起来(在您的情况下)。
总结ANTLR词法分析器规则的工作原理:
您必须意识到词法分析器不会根据解析器(当时)的需要生成令牌。词法分析器独立于解析器运行。