【问题标题】:Lex Unrecognized rule in Lex - UbuntuLex 中的 Lex 无法识别的规则 - Ubuntu
【发布时间】:2014-05-21 01:05:16
【问题描述】:

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

【问题讨论】:

    标签: lex


    【解决方案1】:

    有问题的行有一个未闭合的双引号,尽管它是以一种模糊的方式编写的,以至于一点都不明显。

    这是该行的模式:

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

    你的意思是:

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

    它的写法,在 | 之后开始的引用字符串从未关闭,因为关闭 " 是反斜杠转义的。但是,没有必要将反斜杠转义的字符括在引号中,因为它们已经被反斜杠引用了。

    所以这里有一个可能更易读的版本:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-08
      相关资源
      最近更新 更多