【发布时间】:2012-03-04 07:05:53
【问题描述】:
我的 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 a' 不被接受,'int ab' 被接受。
我得到的输出错误是:
"MismatchedTokenException: 不匹配的输入 'a' 期望 '$'"
知道为什么我会收到此错误吗?我对 Antlr 还很陌生,如果错误是微不足道的,我深表歉意。
编辑
我真的只是让它工作,我不知道为什么。我还定义了另外两个词法分析器规则,如下所示:
ALPH : ('a'..'z'|'A'..'Z');
DIGIT : ('0'..'9');
我意识到这些根本没有被使用,所以我删除了它们,现在一切正常!我猜为什么会这样是因为 ALPH 和 DIGIT 覆盖了我的其他 Lexer 规则:
NUMBER : ('0'..'9')+;
CHARACTER : '\'' (~('\n' | '\r' |'\'')) '\'';
有人知道是不是这样吗?我很好奇为什么这个问题现在已经解决了。
【问题讨论】:
-
我刚刚开始工作,但我不知道为什么。我还定义了另外两个词法分析器规则,如下所示: ALPH : ('a'..'z'|'A'..'Z');数字:('0'..'9');我意识到这些根本没有被使用,所以我删除了它们,现在一切正常!我猜为什么这行得通是因为 ALPH 和 DIGIT 覆盖了我的其他 Lexer 规则: NUMBER : ('0'..'9')+;字符:'\'' (~('\n' | '\r' |'\'')) '\'';有谁知道是否是这种情况?我很好奇为什么这个问题现在已经解决了。