Lex无法识别Lex中的规则 - Ubuntu

时间:2014-05-20 15:23:10

标签: lex

我正在用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();
    }

1 个答案:

答案 0 :(得分:1)

有问题的行有一个未公开的双引号,虽然它是以一种混淆的方式编写的,但它并不是很明显。

以下是该行的模式:

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

你打算写的是:

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

它的编写方式,从 | 之后开始的引用字符串从未关闭,因为结束&#34; 是反斜杠转义的。但是,不需要在引号中包含反斜杠转义字符,因为它们已经被反斜杠引用。

所以这是一个可能更具可读性的版本:

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

[]内,引号字符并不特殊,这就是为什么我更喜欢使用["]来表示文字双引号。另外,你可以写\n;没有必要将其括在任何其他标点符号中。