簡體   English   中英

Jflex歧義

[英]Jflex ambiguity

我有來自 jflex 代碼的這兩條規則:

Bool = true
Ident = [:letter:][:letterdigit:]*

例如,如果我嘗試分析單詞“ trueStat ”,它會被識別為 Ident 表達式而不是 Bool。 我怎樣才能在 Jflex 中避免這種類型的歧義?

在幾乎所有語言中,只有當關鍵字是一個完整的詞時,它才會被識別為關鍵字。 否則,您將最終禁止諸如formatdowntimeendurance之類的標識符(它們將分別以關鍵字fordoend開頭)。 這對程序員來說是相當混亂的,盡管這並非聞所未聞。 詞法掃描器生成器,如 Flex 和 JFlex,通常試圖使常見情況變得簡單; 因此,您提供的片段將trueStat識別為標識符。 但是如果你真的想將它識別為一個關鍵字后跟一個標識符,你可以通過為所有關鍵字添加尾隨上下文來實現:

Bool = true/[:letterdigit:]*
Ident = [:letter:][:letterdigit:]*

對於那對模式, true將匹配Bool規則,即使它以trueStat的形式出現。 該模式匹配true和緊隨其后的任何字母數字字符串,然后倒回輸入 cursor 以便匹配的標記正好為true

請注意,與 Lex 和 Flex 一樣,JFlex 接受當前輸入 position 處的最長匹配; 如果有多個規則接受此匹配項,則執行與第一個此類規則對應的操作。 (有關匹配算法的稍微更長的解釋,請參閱手冊“如何匹配輸入”部分。)出於此規則的目的,尾隨上下文被視為匹配的一部分(但是,如上所述,然后從匹配中刪除).

此規則的結果是您應該始終將更具體的模式放在它們可能覆蓋的一般模式之前,無論特定模式是否使用尾隨上下文。 所以Bool規則必須在Ident規則之前。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM