我的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'时,变量名必须是多个字符 . 例如:
接受 'int ab'
时不接受 'int a'
.
我得到的输出错误是:
“MismatchedTokenException:输入不匹配''期待'$'”
知道我为什么会收到这个错误吗?如果错误是微不足道的话,我对Antlr很新,所以道歉 .
EDIT
我确实让它运转了,我不知道为什么 . 我还有另外两个词法规则定义如下:
ALPH : ('a'..'z'|'A'..'Z');
DIGIT : ('0'..'9');
我意识到这些都没有被使用所以我删除了它们,现在一切正常!我猜这可行的原因是因为 ALPH
和 DIGIT
覆盖了我的其他Lexer规则:
NUMBER : ('0'..'9')+;
CHARACTER : '\'' (~('\n' | '\r' |'\'')) '\'';
有谁知道是否是这种情况?我很好奇为什么这个问题现在已经解决了 .
1 回答
是的,似乎
ALPH
在IDENT
规则之前定义,在这种情况下,单个字母被标记为ALPH
标记 . 如果在ALPH
之前定义IDENT
,它应该都可以(在您的情况下) .总结ANTLR的词法分析器规则是如何工作的:
lexer规则匹配尽可能多的字符(贪婪);
如果2个(或更多)词法分析器规则匹配相同的输入,则首先定义的规则将为"win" .
您必须意识到词法分析器不会根据解析器(当时)需要生成令牌 . 词法分析器独立于解析器运行 .