2013-07-28 60 views
2

使用語法爲什麼這個掛鉤語法不能識別42?

start 
    = b 
/a 

a 
    = "4" "2" 

b 
    = "4" 

peg.js識別4但不42在這種情況下,誤差

「1行,第2列:輸入預期目的,而是 」2「 找到」。

被報告。很明顯,解析器完成了消耗「4」的start -> b規則,然後不知道如何處理「2」。但是爲什麼不碰a的其他規則,當它遇到錯誤?

回答

3

在一個PEG語法中,選擇操作符被稱爲「優先選擇」,並且替代方式意味着按照語法中的外觀順序進行處理。在運行時,PEG解析器將開始處理第一個選擇。當失敗時,解析器會回溯到解析該替代解析器之前的狀態,然後繼續執行下一個解析器。然而,一旦成功,則假設替代方案是正確解析的一部分,並且對於當前的選擇,不考慮任何剩餘的替代方案。

對於您的語法,這意味着第二個選擇從未嘗試過,因爲第一個選項形成了它的前綴。如果您重新排列替代品,它應該按照您的預期工作。