2014-04-25 23 views
2

假設我有一個規則:PEGKit不斷嘗試規則

myCoolRule: 
    Word 
    | 'myCoolToken' Word otherRule 

我公司供應作爲輸入myCoolToken something else now它試圖解析它貪婪地匹配myCoolToken作爲一個單詞,然後打something並說唔我預計EOF,如果我安排規則,以便它試圖匹配myCoolToken首先,對於該輸入,所有的都是很好的並且完美地解析。

我想知道它是否有可能繼續嘗試所有的規則在該聲明中看看是否有作品。所以它匹配Word失敗,回來,然後嘗試下一個規則。

下面是實際的語法規則導致的問題:

columnName = Word; 
typeName = Word; 

//accepts CAST and cast 
cast = { MATCHES_IGNORE_CASE(LS(1), @"CAST") }? Word ; 

checkConstraint = 'CHECK' '('! expr ')'!; 

expr  = requiredExp optionalExp*; 

requiredExp = (columnName 
       | cast '(' expr as typeName ')' 
       ... more but not important 
optionalExp ...not important 

CHECK(CAST(abcd as defy))導致它失敗,即使它有效

是否有一個結構或以其他方式使其驗證所有輸入放棄之前的規則。

回答

1

PEGKit的創建者在這裏。

如果我理解你的問題,不,這是不可能的。但這是PEGKit的一個特性,不是bug。

你的問題涉及到「確定性」與「不確定性」。 PEGKit是一個「確定性」工具包(被廣泛認爲是解析編程語言的理想功能)。

看來你正在尋找一種更「不確定」的行爲在這種情況下,但我不認爲你應該是:)。

PEGKit允許通過在其中交替選項列的順序指定的替代選項優先級。所以:

foo = highPriority 
    | lowerPriority 
    | lowestPriority 
    ; 

如果highPriority選項當前輸入匹配,lowerPrioritylowestPriority選項將有機會嘗試匹配,即使他們莫名其妙地「更好」的比賽(即它們匹配比highPriority更多的令牌)。

此外,這與「確定性」(highPriority保證被賦予優先級)相關,並且在解析編程語言時被廣泛認爲是理想的特性。

所以,如果你希望你的cast()表現有更高的優先級比columnName,簡單地列出cast()表達columnName選項前一個選項

requiredExp = (cast '(' expr as typeName ')' 
       | columnName 
       ... more but not important 


好了,這需要照顧的語法細節。但是,如果你有更高層次的語義約束這可能會影響哪些替代方案應該具有最高優先級分析時的決定,你應該使用語義謂詞,如:

foo = { shouldChooseOpt1() }? opt1 
    | { shouldChooseOpt2() }? opt2 
    | defaultOpt 
    ; 

More details on Semantic Predicates here