2016-07-02 108 views
0

我有以下簡單ANTLR語法:簡單的語法無法解析

grammar Grammar; 

grammarRules : grammarRule+ ; 

grammarRule: 
    lhs '->' WORD+ 
    ; 

lhs: ID ; 

WORD : LETTER+ ; 

ID : LETTER (LETTER|'0'..'9')* ; 

fragment 
LETTER : [a-zA-Z\u0080-\u00FF_] ; 

WS : [ \t] -> skip ; 

當我嘗試解析字符串「網頁 - >谷歌搜索」,我得到的錯誤:

line 1:0 mismatched input 'webpage' expecting ID 

回答

0

你的語法被破壞了。 WORD的定義匹配webpage。這就是詞法分析器返回的結果,所以解析器抱怨沒有看到ID

如果您嘗試解析webpage1 -> google search它應該工作,因爲webpage1不是WORD

語法不是LL(*)。鑑於例如輸入a - > b c d - > e f時,語法分析器將需要向前看第二個->以便將信息反饋給詞法分析器,導致將d識別爲ID而不是WORD。 ANTLER不這樣做。 (你可能不希望它,因爲這可能會複雜化,並因此大大減慢詞法分析器的速度。)

您可以通過在語言中添加語句終止符(如換行符或分號)來解決問題。

+0

好吧,看起來更大的一點是,詞法分析器作爲完全不同於解析器步驟的自己的層運行,因此詞法分析器有責任確定在出現歧義時應該怎麼做。在這方面,我很好奇爲什麼添加一個語句終結者來解決歧義問題。 –

+0

@DanielBigham你是對的。這可能還不夠。你必須做一些事情,比如'lhs - > ID | WORD'。由於ANTLR解析器是LL(*),所以您可能不需要行終止符。 (如果他們只是LL(1)) – Gene

+0

對於後來可能會發現這種情況的其他人 - 我用Antlr拉着我的頭髮出現各種奇怪的行爲,然後我讀了一些關於重構我的語法的東西,以便主要語法包含在一個單一的規則中,而不是用不同的符號分解成許多規則。這顯然可以使語法的左遞歸得到更好的處理。 Presto現在運行良好。 –