这个弹性代码有什么问题?

时间:2018-05-04 13:14:59

标签: compiler-construction flex-lexer

我正在尝试编译此flex代码。

  %{

#include <stdlib.h>
#include "y.tab.h"

%}
digit [0-9]
letter [A-Za-z]
point [.]

%%
{digit}+{{point}{digit+}}?   {printf("Number\n");}
{letter}+   {printf("ID\n");}
("hi"|"oi"|"swagatam")"\n"    { printf("START\n"); /*return HI;*/  }
("tchau"|"bye"|"biday")"\n"   { printf("END\n"); /*return BYE;*/ }
%.                    { yyerror();  }

%%

int main(void)
{
   //yyparse();
   yylex();
   return 0;
}

int yywrap(void)
{  
   return 0;
}

int yyerror(void)
{
    printf("Error\n");
    exit(1);
}

当我编译此代码时,它显示&#34; hello.l&#34;,第12行:无法识别的规则 在第12行,代码是 -

 {digit}+{{point}{digit+}}?   {printf("Number\n");}

这一部分。谁能告诉我这里有什么问题?

1 个答案:

答案 0 :(得分:0)

{digit}+{{point}{digit+}}?   {printf("Number\n");}

{}用于表示定义,不用于分组。他们应该包含定义的名称,而不是别的。因此{{point}{digit+}}格式错误,因为{point}{digit+}不是定义的有效名称。

因此外部{}应该是()+ digit应该在{}之外:

{digit}+({point}{digit}+)?   {printf("Number\n");}