compiler-construction - 了解 lex 代码语法

标签 compiler-construction bison flex-lexer lex

在下面的 lex 代码中,我不明白尖括号 的使用。 {DEFINITION} 语法如何工作?

     %{
    #include<stdio.h>
    int c=0;
    %}
    START "/*"
    END "*/"
    SIMPLE [^*]
    SPACE [ \t\n]
    COMPLEX "*"[^/]
    %s newstate
    %%
    "//"(.*[ \t]*.*)*[\n]+    {c++; fprintf(yyout," ");}
    {START}                    {yymore();BEGIN newstate;}
     <newstate>{SIMPLE}        {yymore();BEGIN newstate;}
     <newstate>{COMPLEX}      {yymore();BEGIN newstate;}
     <newstate>{SPACE}        {yymore();BEGIN newstate;}
     <newstate>{END}  {c++;fprintf(yyout," ");BEGIN 0;}
    %%
    main()
    {//program to remove comment lines
    yyin=fopen("file4","r");
    yyout=fopen("fileout4","w");system("cat file4");
    yylex();system("cat fileout4");
    printf("no.of comments=%d",c);
    fclose(yyin);
    fclose(yyout);
    }
    `

最佳答案

使用此“%s newstate”,您将声明一个启动条件名称,在您的情况下,名称为“newstate”;您可以使用 %s 、%S 或 %Start 来声明开始条件。

可以在规则的开头用 <> 括号引用条件。

例如:引用 newstate 作为第一条规则的开始条件:

                <newstate> {SIMPLE}       { yymore(); BEGIN newstate; }

只有当 Lex 处于名为“newstate”的启动条件时,您的上述规则才会被识别。您将通过执行操作语句来输入此开始条件

                          BEGIN newstate;

让我给你一个示例来理解它的用法: 在此示例中,我将使用三个开始条件,每个条件代表某种事物:AN= 动物、PT= 行星和 BR= 鸟类。

这个 Flex 示例将帮助您判断您输入的名称后跟“是?”属于哪个类别。属于。我们分为三个类别:动物、行星和鸟类。 (为了简单起见,我只处理猴子、马、木星和天鹅)。

                     %{
                     #include<stdio.h>
                     %}

                     %START AN PT BR

                     %%
                     ^monkey             {ECHO; BEGIN AN;}
                     ^horse              {ECHO; BEGIN AN;}
                     ^Jupiter            {ECHO; BEGIN PT ;}
                     ^swan               {ECHO; BEGIN BR;}
                     \n                  {ECHO; BEGIN 0;}
                     <AN>is?             printf(" is an Animal.!");
                     <PT>is?            printf(" is a Planet in our solar system.!");
                     <BR>is?            printf(" is a Bird.!");
                     . ;
                     %%

                     main()
                     {
                     yylex();
                     }

对于以下输入,我们将替换“is ?”基于前缀:

                 input  ->          monkey is ?
                 output ->          monkey is an Animal.!

这里我们替换“是?”与“是一种动物。!”通过将词法分析器重定向到“AN”开始条件,因此关联的规则“is? printf(”is an Animal.!”);”将被执行。

                 input  ->          swan is ?
                 output ->          swan is Bird.!

这里我们替换“是?”与“是一只鸟。!”通过将词法分析器重定向到“BR”开始条件,因此关联的规则“is? printf("is a Bird.!");”将被执行。

                 input  ->          horse is ?
                 output ->          horse is an Animal.!

这里我们替换“是?”与“是一种动物。!”通过将词法分析器重定向到“AN”开始条件,因此关联的规则“is? printf(”is an Animal.!”);”将被执行。

                 input  ->          Jupiter is ?
                 output ->          Jupiter is a Planet in our solar system.!

这里我们替换“是?”与“是我们太阳系中的一颗行星。!”通过将词法分析器重定向到“PT”开始条件,因此关联的规则“is? printf(”is a Planet in our sun system.!”);”将被执行。

所以在这个例子中你看到我们正在替换“是?”基于前缀。如果前缀是 Jupiter,我们会回显“Jupiter”并将词法分析器重定向到“PT”起始条件,因此将执行关联的规则。

希望这有助于您理解,如果您对解释有任何疑问,请告诉我!

关于compiler-construction - 了解 lex 代码语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46954028/

相关文章:

gcc - 有没有办法从我不使用的目标文件中删除所有函数?

compiler-construction - 从什么地方调用Compiler-RT?

c# - 你能使 VB.NET 编译像 C# 一样严格吗?

c - Bison 抛出语法错误,但我看不到我的错误

c - Flex 和 Bison 计算器(如果出现问题)

antlr - 与 Flex/Bison 相比,使用 ANTLR 有哪些缺点?

无法让 flex 识别关键字字符串

c - 被调用的函数在被调用后如何返回给调用者?

c - Flex Bison 计算器不打印结果

c - 从 yylex 返回 "non-ints"