亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何修復解析錯誤(使用 LOOKAHEAD)

如何修復解析錯誤(使用 LOOKAHEAD)

胡說叔叔 2022-10-20 15:13:27
我的解析器生成器有問題(使用 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,那么解析器將不得不進一步向前看才能做出決定。


查看完整回答
反對 回復 2022-10-20
  • 1 回答
  • 0 關注
  • 86 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號