2013-06-19 105 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 –