使用flex时需要遵循格式规则吗?

时间:2016-11-19 20:10:52

标签: flex-lexer lexical-analysis scanning

我不明白为什么,在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编译我的扫描仪,我是否必须遵循一些特定的约定?

1 个答案:

答案 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;