我正在用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();
}
答案 0 :(得分:1)
有问题的行有一个未公开的双引号,虽然它是以一种混淆的方式编写的,但它并不是很明显。
以下是该行的模式:
\"([^\042\134]|"\"(.|[\n]))*\"
你打算写的是:
\"([^\042\134]|"\\"(.|[\n]))*\"
它的编写方式,从 | 之后开始的引用字符串从未关闭,因为结束&#34; 是反斜杠转义的。但是,不需要在引号中包含反斜杠转义字符,因为它们已经被反斜杠引用。
所以这是一个可能更具可读性的版本:
["]([^"\\]|\\(.|\n))*["]
在[]
内,引号字符并不特殊,这就是为什么我更喜欢使用["]
来表示文字双引号。另外,你可以写\n
;没有必要将其括在任何其他标点符号中。