Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 命名变量与其他令牌标识符不明确_Regex_Yacc_Flex Lexer_Lex - Fatal编程技术网

Regex 命名变量与其他令牌标识符不明确

Regex 命名变量与其他令牌标识符不明确,regex,yacc,flex-lexer,lex,Regex,Yacc,Flex Lexer,Lex,我使用一个lexer,需要能够识别命名变量和关键字之间的差异 更详细地说,在我的.l文件中,我有如下定义 "QUIT" {return QUIT;} "AND" {return AND;} "XOR" {return XOR;} 还有一个名称的定义(对于变量) 我的问题是,我的关键字,如QUIT、AND、XOR,每一个都满足名称规则,这就给我留下了模棱两可的问题 我如何解决这个问题?将关键字放在第一位 Flex生成的扫描仪始终选择最长的匹配;如果可以应用多个图案,则选择第一个图案。因此,如

我使用一个lexer,需要能够识别命名变量和关键字之间的差异

更详细地说,在我的.l文件中,我有如下定义

"QUIT" {return QUIT;}
"AND"  {return AND;}
"XOR"  {return XOR;}
还有一个名称的定义(对于变量)

我的问题是,我的关键字,如QUIT、AND、XOR,每一个都满足名称规则,这就给我留下了模棱两可的问题


我如何解决这个问题?

将关键字放在第一位

Flex生成的扫描仪始终选择最长的匹配;如果可以应用多个图案,则选择第一个图案。因此,如果你有:

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
然后,扫描仪将返回三个令牌:
NAME
QUIT
。如果您先放置
NAME
模式,那么您将得到三个
NAME
令牌。(在flex模式中不需要引用字母数字字符。需要引用的是正则表达式运算符。)



memcpy
不是一个好主意。我修改了它以避免对strlen的冗余调用,这实际上是最小的问题。我假设您将它与
yylval.name
声明组合为一个固定长度的字符数组。如果是这样,您应该验证名称是否太长,无法放入提供的空间中。但这仍然是一个坏主意,因为bison生成的解析器假定堆叠的值不是太大;当生成的代码更方便时,它不会试图避免复制它们。

谢谢!这就是我要找的!
QUITAND QUIT AND