Lex Unrecognized rule в Лексе - Ubuntu

Я пишу программу в lex, и это дает мне следующую ошибку:

LexInput.l: 12: непризнанное правило

Строка 12:\"([^\042\134] |"\"(. | [\n])) * \" printf ("string:% s\n", yytext);

Вот мой код:

%{
 #include <stdio.h>
 %}

 L [a-zA-Z]
 D [0-9]
 %%
 {L}({L}|{D})* printf("id : %s\n", yytext);
 [a-zA-Z_][a-zA-Z0-9_]* printf("C id : %s\n", yytext);
 [+-]?[0-9]+ printf("integer : %s\n", yytext);
 [0-9]+"."[0-9]+(e[+-]?[0-9]+)? printf("real : %s\n", yytext);
 \"([^\042\134]|"\"(.|[\n]))*\" printf("string : %s\n", yytext);
 "/*"([^*]|"*"+[^*)])*"*"+"/" printf("text comment : /* ... */\n");
 "//".* printf("line comment : // ... \n");

 "\n" |
 . ;
 %%
 int yywrap()
 {
 return 1; 
 }

 void main()
 {
 yylex();
 }
</stdio.h>
1 ответ

Линия, о которой идет речь, имеет закрытую двойную кавычку, хотя она написана таким пугающим образом, что это совершенно не очевидно.

Здесь шаблон из строки:

\"([^\042\134]|"\"(.|[\n]))*\"

То, что вы хотели написать, было:

\"([^\042\134]|"\\"(.|[\n]))*\"

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

Итак, здесь возможно более читаемая версия:

["]([^"\\]|\\(.|\n))*["]

Внутри [] символы цитаты не являются специальными, поэтому я предпочитаю использовать ["] для представления буквенной двойной кавычки. Кроме того, вы можете просто написать \n; нет необходимости заключать ее в любую другую пунктуацию.

licensed under cc by-sa 3.0 with attribution.