命名变量与其他标记标识符不明确
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 三个标记:NAME
、QUIT
、AND
。如果您先放置 NAME
模式,那么您将获得三个 NAME
标记。 (不需要在 flex 模式中引用字母数字字符。需要引用的是正则表达式运算符。)
memcpy
不是一个好主意。我修改了它以避免对 strlen
的冗余调用,这确实是最不重要的问题。我假设您将它与 yylval.name
的声明结合起来作为固定长度的字符数组。如果是这样,您应该验证 NAME 不会太长以适应所提供的 space。但这仍然是一个坏主意,因为 bison 生成的解析器假定堆叠值不会太大;当生成的代码更方便时,它不会尝试避免复制它们。
我正在使用需要能够识别命名变量和关键字之间差异的词法分析器。
详细说明,在我的 .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 三个标记:NAME
、QUIT
、AND
。如果您先放置 NAME
模式,那么您将获得三个 NAME
标记。 (不需要在 flex 模式中引用字母数字字符。需要引用的是正则表达式运算符。)
memcpy
不是一个好主意。我修改了它以避免对 strlen
的冗余调用,这确实是最不重要的问题。我假设您将它与 yylval.name
的声明结合起来作为固定长度的字符数组。如果是这样,您应该验证 NAME 不会太长以适应所提供的 space。但这仍然是一个坏主意,因为 bison 生成的解析器假定堆叠值不会太大;当生成的代码更方便时,它不会尝试避免复制它们。