Parsing Antlr v3语法分析器/词法分析器规则错误
我的Antlr语法有问题。我正在尝试为“typedident”编写一个解析器规则,它可以接受以下输入: “int a”或“char a” 变量名“a”来自我的lexer规则“IDENT”,定义如下: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'..'
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'\'\'\';有人知道情况是否如此吗?我很好奇为什么这个问题现在已经解决了。