簡體   English   中英

Flex / Bison:歧義標記詞匯化

[英]Flex/Bison: lexing ambiguous tokens

我正在處理flex / bison lexer / parser中的一個棘手問題。

以下是一些適用於羅馬數字和任意標識符的伸縮規則:

"I"|"II"|"III"|"IV"|"V"|"VI"|"VII"|"i"|"ii"|"iii"|"iv"|"v"|"vi"|"vii" { return NUMERAL; }

"foobar" { return FOOBAR; }

[A-Za-z0-9_]+ { return IDENTIFIER; }

現在,考慮以下簡單語法:

%token <numeral> NUMERAL
%token <foobar> FOOBAR
%token <identifier> IDENTIFIER

program 
  : numeral foobar { }
  ;

最后,這是一個示例輸入:

IVfoobar

我打算將此作為編號IV,然后是FOOBAR。 但是,如何防止將其作為數字后跟標識符“ Vfoobar”或僅標識符“ IVfoobar”的詞法轉換為都是無效的?

如果您真的想在詞法分析器級別處理此問題,則必須確保IDENTIFIER的規則與羅馬數字(I,II,... vii ...)開頭的字符串不匹配。

這是因為Lex選擇了與最長輸入匹配的規則。

也許從IDENTIFIER的第一個字符中排除羅馬數字字母會構成令人滿意的有效標識符集?

{?i:[a-z0-9_]{-}[ivxlcdm]}{?i:[a-z0-9_]}* { return IDENTIFIER; }

暫無
暫無

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

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