当我运行输入

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只能是数字。表达式是整数,它们之间是“ +”或“-”。

谢谢。

最佳答案

有两件事要检查。

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

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

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


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

我经常使用十六进制编辑器来验证文件格式是否确实符合我的想法。文本文件绝不能位于十六进制编辑器中:)

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

如果不是文件编码,那么我真的会遍历您的表达式规则和词法分析器,以确保它们没有问题。因为您没有发布它们,所以我们无法帮助您进行验证。

10-02 00:54