Что не так с этим гибким кодом? - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь скомпилировать этот гибкий код.

  %{

#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);
}

когда я скомпилировал этот код, он показывает "hello.l", строка 12: нераспознанное правило в строке 12 код -

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

эта часть. Может кто-нибудь сказать мне, что здесь не так?

1 Ответ

0 голосов
/ 04 мая 2018
{digit}+{{point}{digit+}}?   {printf("Number\n");}

{} используется для обозначения определений, а не для группировки. Предполагается, что они содержат название определения и ничего больше. Таким образом, {{point}{digit+}} неверно сформирован, потому что {point}{digit+} не является допустимым именем для определения.

Таким образом, внешний {} должен быть (), а + для digit должен быть вне {}:

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