我的解析器生成器有問題(使用 javaCC)我有這個錯誤:Warning: Choice conflict involving two expansions at line 119, column 3 and line 119, column 43 respectively. A common prefix is: <CONSTANT> Consider using a lookahead of 2 for earlier expansion.Warning: Choice conflict involving two expansions at line 119, column 3 and line 119, column 43 respectively. A common prefix is: <CONSTANT> Consider using a lookahead of 2 for earlier expansion.因為我的這部分代碼:TOKEN : /* OPERATORS */{ < POINT : "." >| < VIRGULE : "," >}TOKEN :{ < CONSTANT : (< DIGIT >)+ >| < STRING : ( ["A"-"Z","a"-"z"] )+ >| < #DIGIT : [ "0"-"9" ] >}void number() :{}{ (< CONSTANT > < POINT > < CONSTANT >) | (< CONSTANT >)}也許是因為我的表達式“|”兩邊都有 2 CONSTANT我已經看到我可以使用 LOOKAHEAD 但不明白他的用途是什么感謝您的幫助,因為我不明白:(
1 回答

天涯盡頭無女友
TA貢獻1831條經驗 獲得超9個贊
自上而下的解析器,例如 JavaCC 構建的解析器,需要根據下一個標記或接下來的幾個標記提前知道要采取的選擇。檢查以做出此決定的令牌是“前瞻令牌”。
理想情況下,可以使用緊隨其后的令牌做出決定;如果沒有,解析器需要緩沖以下標記,并且還需要有一個更大的決策表。沒有算法可以預測需要多少前瞻令牌,因此 JavaCC 要求您告訴它。這就是那些錯誤消息要求您執行的操作。
如果兩個適用的選項以相同的標記開頭,那么該標記無法幫助解析器決定采用哪個選項,因此它需要至少再查看一個標記。顯然,除了初始數字之后的任何其他內容都POINT
表示NUMBER
必須匹配第二個選擇。假設 anumber
后面不能跟 a POINT
,那么POINT
在初始數字后面的 a 表示NUMBER
。在這種情況下,前瞻 2 就足夠了。但是,如果 a后面number
可以跟 a POINT
,那么解析器將不得不進一步向前看才能做出決定。
添加回答
舉報
0/150
提交
取消