首页 文章

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

提问于
浏览
2

我的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'时,变量名必须是多个字符 . 例如:

接受 'int ab' 时不接受 'int a' .

我得到的输出错误是:

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

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

EDIT

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

ALPH : ('a'..'z'|'A'..'Z'); 
DIGIT : ('0'..'9');

我意识到这些都没有被使用所以我删除了它们,现在一切正常!我猜这可行的原因是因为 ALPHDIGIT 覆盖了我的其他Lexer规则:

NUMBER : ('0'..'9')+; 
CHARACTER : '\'' (~('\n' | '\r' |'\'')) '\'';

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

1 回答

  • 0

    'int ab'被接受时,'int a'不被接受 . ...我的猜测为什么这个有效是因为ALPH和DIGIT凌驾于......

    是的,似乎 ALPHIDENT 规则之前定义,在这种情况下,单个字母被标记为 ALPH 标记 . 如果在 ALPH 之前定义 IDENT ,它应该都可以(在您的情况下) .

    总结ANTLR的词法分析器规则是如何工作的:

    • lexer规则匹配尽可能多的字符(贪婪);

    • 如果2个(或更多)词法分析器规则匹配相同的输入,则首先定义的规则将为"win" .

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

相关问题