2013-06-19 138 views
0

,当我在我的语法运行输入ANTLR,missmatched令牌例外,预计 u000F

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)* 
    ; 

我从输入missmatched人品3令牌例外,预计\u000F。当我从输入中删除行integer x;,一切工作正常。任何想法\u000F意味着什么以及为什么它是预期的?

我试着重写每一条规则,没有什么帮助。

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

谢谢。

+0

当您从语法中生成词法分析器和分析器时,ANTLR会产生任何输出吗? –

+0

是的,一切都按照它应该的匹配,直到输入字符'3' –

+0

我指的是在编译'.g'文件到一个或多个'.java'文件之前的过程。 –

回答

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来创建它,看看你是否给你同样的错误,你在哪里把控制角色。

如果它不是文件编码,那么我会仔细检查你的表达规则和词法分析器语法,以确保它们没有错。因为你没有发布他们,所以我们不能帮助验证。

+0

当我在十六进制编辑器中打开语法,我在找什么?我编辑了这篇文章,表达规则包含在 –

+1

@Milos中,你会寻找Unicode字符'\ u00F'。基本上你会在你的第三和第四行寻找任何不是“3”或“+”的东西。 – chollida

+0

所以你认为,人物是在输入,而不是在规则?这里是十六进制编辑器中的规则http://i.imgur.com/J4DNLXZ.png –