2012-12-10 128 views
2

這應該是一個簡單的問題。鑑於此解析器規則:ANTLR規則不匹配

ifStatement :expr3b = IF logical(〜(THEN))expression *(ELSE expression *)? ENDIF //缺少那麼 ;

爲什麼這不符合這個字符串?

「IF代碼= \」 10 \ 「DUE_DATE < YESTERDAY ENDIF」

(IF,THEN,ELSE,ENDIF和令牌被定義你承擔什麼他們。邏輯和表達的其他規則)。

Jason

+1

沒有看到邏輯和表達式的產物,我的猜測是'CODE =「10」'是一個錯誤的表達式,可能在''10「的詞法處理中。但是你所知道的信息太少了。 – msw

回答

1

我假設以下行是從您的語法verbatum。

ifStatement : expr3b=IF logical (~(THEN)) expression* (ELSE expression *)? ENDIF; 

如果是這樣的話,那麼你會希望把它改成這樣:

ifStatement : expr3b=IF logical expression* (ELSE expression *)? ENDIF; 

正因爲如此,(~(THEN))說:「與任何一個道理,只要它不是THEN 「。 logical完成後的第一個標記爲ID(或相似)DUE_DATEifStatement消耗它來履行(~(THEN))。這使得< YESTERDAY履行expression,失敗。

下面輸入將由ifStatement你的問題被接受,因爲ENDIF滿足(~(THEN))

IF CODE=\"10\" ENDIF DUE_DATE < YESTERDAY ENDIF 

因爲第一ENDIF被消耗預期這將只工作匹配(~(THEN))

+0

是的,它做到了。感謝您的幫助(再次)。 – Jason