Lex:识别文件中的数据类型

时间:2014-05-24 19:52:52

标签: c lex

我是lex的初学者。我的程序是读取文件并识别数据类型。 我通过在Windows命令行中编写“gcc -c lex.yy.c”来获取此错误: -

code1.l:在函数'yylex'中:

code1.l:8:2:错误:预期';'在'{'令牌

之前

我的输入文件是:

#include <stdio.h> 
int main()
{
    int a;
    float b;
    long int c;
    long long int d;

    return 0;
}

我的lex代码是

    %{
    #include <stdio.h>
    #include <stdlib.h>
%}

%%
    "int"
    {
        printf("%s ->Intger data type\n", yytext);
    }
    "float"
    {
        printf("%s ->Floating point data type\n", yytext);
    }
    "double"
    {
        printf("%s ->double data type\n", yytext);
    }
    "char"
    {
        printf("%s ->character data type\n", yytext);
    }
    "void"
    {
        printf("%s ->void data type\n", yytext);
    }
    "bool"
    {
        printf("%s ->boolean data type\n", yytext);
    }
    "long"([ ])([ ])* "int"
    {
        printf("%s ->long int data type\n", yytext);
    }
    "long"([ ])([ ])* "long"([ ])([ ])* "int"
    {
        printf("%s ->long long int data type\n", yytext);
    }
    ([a-z])* 
    {
        printf("%s ->Not a data type\n", yytext);
    }
    ([0-9])* 
    {
        printf("%s ->Not a data type\n", yytext);
    }

%%

int yywrap()
{
    return 1;
}

int main()
{
    FILE *fp = fopen("sampleIO.txt","r");
    yyin=fp;
    yylex();
    return 0;
}

我找不到错误。任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:1)

lex/flex中,模式必须从一行的开头开始,如flex manual中所述:

flex输入的rules部分包含一系列表单规则:
pattern action
模式必须是未缩进的,并且动作必须在同一行上开始。

此外,

  

任何缩进的文本......都会逐字复制到输出中。

因此,从gcc错误消息中指示的第8行开始,您的缩进模式直接传递到lex.yy.c文件,因为它们无效C而无法编译。

此外,模式不能有不带引号的空格。因此,即使使用正确的缩进,模式:

"long"([ ])([ ])* "int"

需要写

"long"([ ])([ ])*"int"

使用额外的空间,它看起来像模式("long"([ ])([ ])*)和动作("int")一样弯曲。没有必要在方括号周围放括号;这只会掩盖模式。 flex包括*正则表达式运算符(0次或更多次重复)和+运算符(1次或多次重复),因此该模式可以写为:

"long"[ ]+"int"

更清楚,但实际上并不正确;单词longint可以用制表符或换行符分隔(或者,就像它发生的那样,注释,但我们还没有进入那个)。所以一个更好但仍然不完美的模式可能是:

"long"[[:space:]]+"int"

答案 1 :(得分:0)

为你修好了。它现在编译好了。 更新我的源空白正确性。

%{
    #include <stdio.h>
    #include <stdlib.h>
%}

%option noyywrap

%%
"int"       { printf("%s ->Intger data type\n", yytext);             }
"float"     { printf("%s ->Floating point data type\n", yytext);     }
"double"    { printf("%s ->double data type\n", yytext);             }
"char"      { printf("%s ->character data type\n", yytext);          }
"void"      { printf("%s ->void data type\n", yytext);               }
"bool"      { printf("%s ->boolean data type\n", yytext);       }
"long"[[:space:]]+"int"                    { printf("%s ->long int data type\n", yytext);    }
"long"[[:space:]]+"long"[[:space:]]+"int"  { printf("%s ->long long int data type\n", yytext); }
.           { printf("%s ->Not a data type\n", yytext);         } // I would omit printf here..


%%
int main()
{
    FILE *fp = fopen("sampleIO.txt","r");
    yyin=fp;
    yylex();
    return 0;
}