我是编写lex文件的新手,我不确定我是否正确格式化文件。我尝试从C源文件中捕获C关键字,然后使用前缀格式字符串将其打印出来。
我的尝试是(显示部分关键字列表):
%%
auto|do|goto|short printf("%s%s", "formatting", yytext);
在我看过的一些例子中,第一列中的单词被双引号括起来。这是必要的,还是我正确格式化了我的lex文件以捕获我列出的关键字?
那就是我应该写的:
"auto"|"do"|"goto"|"short" printf("%s%s", "formatting", yytext);
何时需要双引号?
答案 0 :(得分:2)
当模式文本包含正则表达式运算符或空格时,必须使用双引号。每当模式文本不仅仅包含字母和数字时,使用它们可能是个好主意。
对于简单的字母关键字,它们显然不是必需的。如果模式文本已经使用 \ 进行了转义,也没有必要使用它们,因此您可以在不加引号的情况下编写\n
。
实际上,双引号不是必需的。有几种方法可以转义字符,但双引号的优点是能够引用几个连续的字符。但是,以下情况也可以:
[a][u][t][o]|[d][o]...
有时用于手动不区分大小写:
[aA][uU][tT][oO]|[dD][oO]...
Flex允许您使用标记语法 - (?i:auto|do|goto|short)
指定模式段的不区分大小写 - 但这是一个flex扩展,因此您仍然可以看到如上所述的模式。