Правило не может быть найдено при использовании flex "||" - PullRequest
0 голосов
/ 31 октября 2018

Если я удалю строку 41, тогда это не было предупреждением

"lex.l", строка 41: предупреждение, правило не может быть найдено

строка 41: "||" {Е ( "26, \" % S \ "\ п", yytext);}

digit [0-9]
letter [A-Za-z]
id ({letter}|[_])({letter}|{digit}|[_])*
%%
[ |\t|\n]+
"var" {printf("28,\"%s\"\n",yytext);}
"if" {printf("29,\"%s\"\n",yytext);}
"then" {printf("30,\"%s\"\n",yytext);}
"else" {printf("31,\"%s\"\n",yytext);}
"while" {printf("32,\"%s\"\n",yytext);}
"for" {printf("33,\"%s\"\n",yytext);}
"begin" {printf("34,\"%s\"\n",yytext);}
"writeln" {printf("35,\"%s\"\n",yytext);}
"procedure" {printf("36,\"%s\"\n",yytext);}
"end" {printf("37,\"%s\"\n",yytext);}
{id} {printf("1,\"%s\"\n",yytext);}
{digit}+ {printf("2,\"%s\"\n",yytext);}

...

"+=" {printf("23,\"%s\"\n",yytext);}
"-=" {printf("24,\"%s\"\n",yytext);}
"==" {printf("25,\"%s\"\n",yytext);}
"||" {printf("26,\"%s\"\n",yytext);}
"&&" {printf("27,\"%s\"\n",yytext);}
%%
#include <ctype.h>
int main(){
    yylex ( );
    return 0 ;
}
yywrap(){
    return 1;
}

1 Ответ

0 голосов
/ 31 октября 2018

Это:

[ |\t|\n]

Это класс символов, который соответствует одному из следующих четырех символов:

  • пространство
  • Вертикальная черта ( | )
  • вкладка
  • 1020 * перевод строки *

Вертикальная черта в классе появляется дважды, но поскольку класс символов является набором, повторение игнорируется.

So

[ |\t|\n]+

соответствует любой непустой последовательности, состоящей только из вышеуказанных символов. Одна такая последовательность - ||. Поскольку это правило предшествует правилу "||", оно будет использоваться для сопоставления ||, и, следовательно, правило "||" не может быть сопоставлено, как говорится в предупреждении.

Вам следует серьезно подумать об использовании [[:space:]] для сопоставления с любым символом пробела, [[:alpha:]] для сопоставления с буквой и [[:digit:]] для поиска цифры. Это скорее самодокументирование, чем попытка выписать набор. Но если вы собираетесь выписать набор, не включайте вертикальную черту, если вы не хотите ее включать.

Шаблоны Flex описаны в руководстве Flex . Это стоит прочитать.

...