Parsing Antlr v3语法分析器/词法分析器规则错误

Parsing Antlr v3语法分析器/词法分析器规则错误,parsing,antlr3,lexer,Parsing,Antlr3,Lexer,我的Antlr语法有问题。我正在尝试为“typedident”编写一个解析器规则,它可以接受以下输入: “int a”或“char a” 变量名“a”来自我的lexer规则“IDENT”,定义如下: IDENT : (('a'..'z'|'A'..'Z') | '_') (('a'..'z'|'A'..'Z')|('0'..'9')| '_')*; typedident : (INT|CHAR) IDENT; 我的“typedident”解析器规则如下所示: IDENT : (('a'..'

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

“int a”或“char a”

变量名“a”来自我的lexer规则“IDENT”,定义如下:

IDENT : (('a'..'z'|'A'..'Z') | '_') (('a'..'z'|'A'..'Z')|('0'..'9')| '_')*;
typedident : (INT|CHAR) IDENT;
我的“typedident”解析器规则如下所示:

IDENT : (('a'..'z'|'A'..'Z') | '_') (('a'..'z'|'A'..'Z')|('0'..'9')| '_')*;
typedident : (INT|CHAR) IDENT;
INT和CHAR被定义为标记

我遇到的问题是,当我测试“typedident”时,变量名必须不止一个字符。例如:

不接受“int a”,而接受“int ab”

我得到的输出错误是:

不匹配的TokenException:不匹配的输入“a”应为“$”

知道我为什么会犯这个错误吗?我是Antlr的新手,如果错误很小,我深表歉意

编辑


我真的只是让它工作了,我不知道为什么。我还有另外两条lexer规则,定义如下:

ALPH : ('a'..'z'|'A'..'Z'); 
DIGIT : ('0'..'9'); 
我意识到这些根本没有被使用,所以我删除了它们,现在一切都正常了!我想这是因为ALPH和DIGIT凌驾于我的其他Lexer规则之上:

NUMBER : ('0'..'9')+; 
CHARACTER : '\'' (~('\n' | '\r' |'\'')) '\''; 
有人知道情况是否如此吗?我很好奇为什么这个问题现在已经解决了

不接受“int a”,而接受“int ab”。 ... 我猜这之所以有效是因为ALPH和DIGIT被覆盖了

是的,似乎ALPH是在IDENT规则之前定义的,在这种情况下,单个字母被标记为ALPH标记。如果IDENT是在ALPH之前定义的,那么在您的情况下应该一切正常

要总结ANTLR的lexer规则是如何工作的:

lexer规则匹配尽可能多的字符; 如果两个或多个lexer规则匹配相同的输入,则首先定义的规则将获胜。 您必须认识到,lexer不会根据解析器当时需要的内容生成标记。lexer独立于解析器进行操作

不接受“int a”,而接受“int ab”。 ... 我猜这之所以有效是因为ALPH和DIGIT被覆盖了

是的,似乎ALPH是在IDENT规则之前定义的,在这种情况下,单个字母被标记为ALPH标记。如果IDENT是在ALPH之前定义的,那么在您的情况下应该一切正常

要总结ANTLR的lexer规则是如何工作的:

lexer规则匹配尽可能多的字符; 如果两个或多个lexer规则匹配相同的输入,则首先定义的规则将获胜。
您必须认识到,lexer不会根据解析器当时需要的内容生成标记。lexer独立于解析器运行。

我只是让它正常工作,我不知道为什么。我还有另外两个lexer规则定义如下:ALPH:'a''z'|'a''z';数字:“0”…'9';我意识到这些根本没有被使用,所以我删除了它们,现在一切都正常了!我猜这是因为ALPH和DIGIT覆盖了我的其他Lexer规则:NUMBER:'0'.'9'+;字符:'\~'\n'\''\r'\'\'\';有人知道情况是否如此吗?我很好奇为什么这个问题现在已经解决了。我真的只是让它工作了,我不知道为什么。我还有另外两个lexer规则定义如下:ALPH:'a''z'|'a''z';数字:“0”…'9';我意识到这些根本没有被使用,所以我删除了它们,现在一切都正常了!我猜这是因为ALPH和DIGIT覆盖了我的其他Lexer规则:NUMBER:'0'.'9'+;字符:'\~'\n'\''\r'\'\'\';有人知道情况是否如此吗?我很好奇为什么这个问题现在已经解决了。