当我运行输入
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
在放置控制字符时是否出现相同的错误。如果不是文件编码,那么我真的会遍历您的表达式规则和词法分析器,以确保它们没有问题。因为您没有发布它们,所以我们无法帮助您进行验证。