我不明白为什么,在2个功能完全相同的源文件中,只有1个通过编译阶段flex
而另一个会产生有关use of undeclared identifier
的错误。
这个是好的(我通常不会在我的编辑器中使用制表符,这些都是空格)
int num_lines = 0, num_chars = 0;
%%
\n ++num_lines; ++num_chars;
. ++num_chars;
%%
int main()
{
yylex();
printf( "# of lines = %d, # of chars = %d\n",
num_lines, num_chars );
}
这个flex
不接受它,除了错误之外不会生成任何内容
int num_lines = 0, num_chars = 0;
%%
\n ++num_lines; ++num_chars;
. ++num_chars;
%%
int main()
{
yylex();
printf( "# of lines = %d, # of chars = %d\n", num_lines, num_chars );
}
如果我想用flex
编译我的扫描仪,我是否必须遵循一些特定的约定?
答案 0 :(得分:0)
是的,lex / flex中有格式规则,你违反了它们。
我会总结一下。 lex / flex输入程序有三个主要部分,由第一列中的%%
分隔符分隔(在行的开头)。最后一部分是可选的。第一部分是词汇声明;在本节中,可以命名正则表达式。第二部分指定要对模式执行的操作,第三部分(可选)部分用于要转录到输出文件的(C)代码。它用于定义操作部分中使用的函数。
第一个(lex声明)部分的标准格式是:
name pattern
名称必须从第一列(行首)开始,并且图案在同一行上由空格分隔。
第二个(动作)部分的格式类似:
pattern action
模式必须从第一列(行首)开始,动作在同一行上用空格分隔。模式可以在多行上继续,但必须用空格缩进,否则它将被解释为新模式。
第三部分没有布局限制,因为只是跳过了代码。
有一个有用的最终语法功能。在第一部分中,未指定应复制到输出的词法模式的代码可以在行的开头用%{
和%}
表示。此外,在动作(第二)部分中,任何没有模式且只有动作的代码都会被复制到输出中。
使用 C 中的变量声明启动文件会违反这些规则。如果从左侧开始,则将其视为词汇定义。
如果要在 C 中声明一些应该复制到输出的变量,可以按以下方式进行:
%{
int num_lines = 0, num_chars = 0;
%}
%%
\n ++num_lines; ++num_chars;
. ++num_chars;
或者,或者像这样:
%%
int num_lines = 0, num_chars = 0;
\n ++num_lines; ++num_chars;
. ++num_chars;