繁体   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