当我运行输入
时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只能是数字。表达式是整数,它们之间是“+”或“ - ”。
感谢。
答案 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
在放置控制字符时是否给出了相同的错误。
如果它不是文件编码,那么我真的会查看你的表达式规则和词法分析器语法,以确保它们没有任何问题。因为你没有发布它们我们无法验证。