命名变量与其他标记标识符不明确

named variables ambiguous with other token identifiers

我正在使用需要能够识别命名变量和关键字之间差异的词法分析器。

详细说明,在我的 .l 文件中,我有一些定义,例如

"QUIT" {return QUIT;}
"AND"  {return AND;}
"XOR"  {return XOR;}

我还有一个名字的定义(对于一个变量)

[a-zA-Z][a-zA-Z0-9]* {memcpy(yylval.name, yytext, strlen(yytext) + 1); return NAME;}

我的问题是我的关键字,如 QUIT、AND、XOR 都满足 NAME 的规则,这让我遇到了歧义问题。

我该如何解决这个问题?

先放关键词。

Flex 生成的扫描仪总是 select 最长匹配;如果可以应用多个模式,则第一个是 selected。所以如果你有:

QUIT {return QUIT;}
AND  {return AND;}
XOR  {return XOR;}
[a-zA-Z][a-zA-Z0-9]* { memcpy(yylval.name, yytext, yyleng + 1); return NAME; }
[[:space:]]+  /* Ignore */

您的输入是:

QUITAND QUIT AND

然后您的扫描仪将 return 三个标记:NAMEQUITAND。如果您先放置 NAME 模式,那么您将获得三个 NAME 标记。 (不需要在 flex 模式中引用字母数字字符。需要引用的是正则表达式运算符。)


memcpy 不是一个好主意。我修改了它以避免对 strlen 的冗余调用,这确实是最不重要的问题。我假设您将它与 yylval.name 的声明结合起来作为固定长度的字符数组。如果是这样,您应该验证 NAME 不会太长以适应所提供的 space。但这仍然是一个坏主意,因为 bison 生成的解析器假定堆叠值不会太大;当生成的代码更方便时,它不会尝试避免复制它们。