2014-05-20 185 views
0

我在法編寫一個程序,它給我下面的錯誤:萊克斯Lex中無法識別的規則 - Ubuntu的

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

線有問題有一個未閉合的雙引號,但它是用這樣的方式混淆,它都不明顯。

下面是從行模式:

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

你的意思寫的是:

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

它是書面的方式,帶引號的字符串之後開始只是|從未被關閉,因爲關閉被反斜槓轉義。但是,沒有必要用引號括反斜槓轉義字符,因爲它們已經被反斜槓引用。

所以這裏有一個可能更可讀版本:

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

裏面[],引號字符不是特殊的,這就是爲什麼我喜歡用["]代表字面雙引號另外,你可以只寫\n;沒有必要把它們放在任何。其他標點符號。