[英]How can I eliminate the 'main' routine of the flex & bison so I can put the lexing and parsing process into a library?
[英]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.