ANTLR,不匹配的令牌异常,预期\ u000F

时间:2013-06-19 13:51:31

标签: java antlr grammar antlr3

当我运行输入

integer function () :
2+2+2;
integer x;
3-1-2;
end.

我的语法:

evaluator
   :    type 'function' '(' ')' ':'
        (expression ';' | declaration ';')*
        'end' '.'
        EOF
   ;


declaration
    :   type IDENT (':=' expression)? ';'
    ;

type
    :   'integer'
    |   'double'
    |   'boolean'
    |   'void'
    ;

term
    :   IDENT
    |   '(' expression ')'
    |   INTEGER
    ;

unary
    :   ('+' | '-')* term
    ;

mult
    :   unary (('*' | '/' | 'mod') unary)*
    ;

expression
    :   mult (('+' | '-') mult)*
    ;

我从预期3的输入中获得字符\u000F上的错误匹配令牌例外。当我从输入中删除行integer x;时,一切正常。知道\u000F意味着什么以及预期的原因吗?

我尝试重写每条规则,没有任何帮助。

IDENT只能是字母,INTEGER只能是数字。表达式是整数,它们之间是“+”或“ - ”。

感谢。

1 个答案:

答案 0 :(得分:1)

要检查两件事。

我想我看到了问题。您的declaration规则会占用;,但您的主要规则(expression ';' | declaration ';')*也希望获得半冒号。从声明规则中删除;

即将您的声明规则重写为:

declaration
    :   type IDENT (':=' expression)?  <- don't parse the semi colon here
    ;

一个检查文件的来源。 Unicode字符\u000F是SHIFT IN,它不常见但可以在irc环境中用于删除格式。 See this link

我经常使用十六进制编辑器来验证文件格式实际上是我认为的。文本文件永远不会出现在十六进制编辑器中:)

如果要在aonther文件中进行验证,通常可以通过在文件中的其他位置键入ALT 15来创建它,以查看ANTLR在放置控制字符时是否给出了相同的错误。

如果它不是文件编码,那么我真的会查看你的表达式规则和词法分析器语法,以确保它们没有任何问题。因为你没有发布它们我们无法验证。