2012-12-17 18 views
1

我寫了一個非常簡單的語法定義爲一個計算公式:ANTLR:爲什麼無效的輸入可以匹配的語法定義

grammar SimpleCalc; 

options { 
    output=AST; 
} 

tokens { 
    PLUS = '+' ; 
    MINUS = '-' ; 
    MULT = '*' ; 
    DIV = '/' ; 
} 

/*------------------------------------------------------------------ 
* LEXER RULES 
*------------------------------------------------------------------*/ 

ID : ('a'..'z' | 'A' .. 'Z' | '0' .. '9')+ ; 

WHITESPACE : ('\t' | ' ' | '\r' | '\n'| '\u000C')+ { Skip(); } ; 

/*------------------------------------------------------------------ 
* PARSER RULES 
*------------------------------------------------------------------*/ 

start: expr EOF; 

expr : multExpr ((PLUS | MINUS)^ multExpr)*; 

multExpr : atom ((MULT | DIV)^ atom)*; 

atom : ID 
    | '(' expr ')' -> expr; 

我已經試過start無效表達ABC &* DEF但它傳遞。它看起來像&字符被忽略。這裏有什麼問題?

+0

你是怎麼檢查這個語法的?你有沒有試過在AntlrWorks中用這個語法解析表達式? – Andremoniy

+0

我嘗試了生成的代碼,它得到'ABC * DEF'的結果'ABC * DEF'。 –

+0

嗯...請爲我們提供代碼,您可以使用它來調用* start *規則以及用於確定輸出AST結構。 – Andremoniy

回答

1

其實您的無效表達式ABC &= DEF尚未通過;它會導致NoViableAltException

enter image description here

+0

對不起,我在這個問題上犯了一個錯誤。無效表達式是「ABC&* DEF」。它是'*'而不是'='。 –

+0

@JeffreyZhao查看一些關於ANTLR錯誤處理的問題和答案,例如[我回答的這個問題](http://stackoverflow.com/questions/13889941/how-to-stop-antlr-from-suppressing-語法錯誤)關於「消失」的語法錯誤。我的猜測是,ANTLR正在檢測錯誤,寫入'System.err',並刪除錯誤的輸入,但沒有任何細節到達您/用戶。 – user1201210

+0

@JeffreyZhao,這並不重要,與我上面提到的相同的結果是「ABC&* DEF」。你的語法無法用「&」符號解析表達式。你有沒有試過在ANTLRWorks中測試這個語法? – Andremoniy