lex 中的 C 关键字标识符
C keyword identifier in lex
我刚开始编写 lex 文件,我不确定我是否正确地格式化了我的文件。我正在尝试从 C 源文件中捕获 C 关键字并使用带前缀的格式字符串将它们打印出来。
我的尝试是(显示部分关键字列表):
%%
auto|do|goto|short printf("%s%s", "formatting", yytext);
在我看过的一些示例中,第一列中的单词用双引号括起来。是否有必要,或者我是否正确地格式化了我的 lex 文件以捕获我列出的关键字?
也就是说,我应该改为:
"auto"|"do"|"goto"|"short" printf("%s%s", "formatting", yytext);
什么时候需要双引号?
当模式文本包含正则表达式运算符或空格时,需要双引号。每当模式文本不仅仅由字母和数字组成时,使用它们可能是个好主意。
对于简单的字母关键字,显然没有必要。如果模式文本已经用 \ 转义,则也没有必要使用它们,因此您可以编写 \n
不带引号。
其实,双引号并不是必需的。有多种转义字符的方法,但双引号的优点是可以引用几个连续的字符。但是,以下内容也可以:
[a][u][t][o]|[d][o]...
有时用于手册 case-insensitivity:
[aA][uU][tT][oO]|[dD][oO]...
Flex 允许您使用标记语法为模式段指定 case-insensitivity -- (?i:auto|do|goto|short)
-- 但这是一个 flex 扩展,因此您仍然会看到与上面类似的模式。
我刚开始编写 lex 文件,我不确定我是否正确地格式化了我的文件。我正在尝试从 C 源文件中捕获 C 关键字并使用带前缀的格式字符串将它们打印出来。
我的尝试是(显示部分关键字列表):
%%
auto|do|goto|short printf("%s%s", "formatting", yytext);
在我看过的一些示例中,第一列中的单词用双引号括起来。是否有必要,或者我是否正确地格式化了我的 lex 文件以捕获我列出的关键字?
也就是说,我应该改为:
"auto"|"do"|"goto"|"short" printf("%s%s", "formatting", yytext);
什么时候需要双引号?
当模式文本包含正则表达式运算符或空格时,需要双引号。每当模式文本不仅仅由字母和数字组成时,使用它们可能是个好主意。
对于简单的字母关键字,显然没有必要。如果模式文本已经用 \ 转义,则也没有必要使用它们,因此您可以编写 \n
不带引号。
其实,双引号并不是必需的。有多种转义字符的方法,但双引号的优点是可以引用几个连续的字符。但是,以下内容也可以:
[a][u][t][o]|[d][o]...
有时用于手册 case-insensitivity:
[aA][uU][tT][oO]|[dD][oO]...
Flex 允许您使用标记语法为模式段指定 case-insensitivity -- (?i:auto|do|goto|short)
-- 但这是一个 flex 扩展,因此您仍然会看到与上面类似的模式。