【问题标题】:Antlr v3 error with parser/lexer rules解析器/词法分析器规则的 Antlr v3 错误
【发布时间】: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;

INTCHAR 已被定义为令牌。

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

'int a' 不被接受,'int ab' 被接受。

我得到的输出错误是:

"MismatchedTokenException: 不匹配的输入 'a' 期望 '$'"

知道为什么我会收到此错误吗?我对 Antlr 还很陌生,如果错误是微不足道的,我深表歉意。

编辑

我真的只是让它工作,我不知道为什么。我还定义了另外两个词法分析器规则,如下所示:

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

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

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

有人知道是不是这样吗?我很好奇为什么这个问题现在已经解决了。

【问题讨论】:

  • 我刚刚开始工作,但我不知道为什么。我还定义了另外两个词法分析器规则,如下所示: ALPH : ('a'..'z'|'A'..'Z');数字:('0'..'9');我意识到这些根本没有被使用,所以我删除了它们,现在一切正常!我猜为什么这行得通是因为 ALPH 和 DIGIT 覆盖了我的其他 Lexer 规则: NUMBER : ('0'..'9')+;字符:'\'' (~('\n' | '\r' |'\'')) '\'';有谁知道是否是这种情况?我很好奇为什么这个问题现在已经解决了。

标签: parsing antlr3 lexer


【解决方案1】:

'int a' 不被接受,而 'int ab' 被接受。 ... 我猜为什么这行得通是因为 ALPH 和 DIGIT 是压倒一切的......

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

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

  • 词法分析器规则匹配尽可能多的字符(贪心);
  • 如果 2 个(或更多)词法分析器规则匹配相同的输入,则首先定义的规则将“win”

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 2014-06-29
    • 1970-01-01
    • 2020-09-14
    • 2014-03-25
    • 1970-01-01
    相关资源
    最近更新 更多