2015-10-22 62 views
1

我想在做一個詞法分析器完成任務,但我一直每次收到此錯誤我儘量讓lex.cc.y文件使用Flex:Flex的表達警告,規則不能匹配

「fofo.l」,行:13警告規則不能匹配。
「fofo.l」,行:14警告規則不能匹配。

%{ 
#include <stdio.h> 
#define Relop 1 
#define Addop 2 
#define Mulop 3 
#define Assignop 4 
#define Not  5 
%} 
%% 
["<"|">"|"<="|">="|"=="|"!="]* { return Relop; } 
["+"|"-"|"||"]*    { return Addop; } 
["*"|"/"|"%"|"&&"]*   { return Mulop; } 
["="]*       { return Assignop; } 
["!"]*       { return Not; } 
.        { return -1; } 
%% 
int main() { 
    int token; 
    while ((token = yylex())) { 
     switch (token) { 
      case Relop: printf("Relop: %s\n", yytext); break; 
      case Addop: printf("Addop: %s\n", yytext); break; 
      case Mulop: printf("Mulop: %s\n", yytext); break; 
      case Assignop: printf("Assignop: %s\n", yytext); break; 
      case Not:  printf("Not: %s\n", yytext);  break; 
      default:  printf("Error: %s not recognized\n", yytext); 
     } 
    } 
} 
+0

您需要重新閱讀有關[] – rici

+0

含義的手冊,以及我在一段時間後才能解決問題,但出於某種原因,我得到了「Realop」作爲這兩個「!」的輸出。和「=」字符,而我應該分別得到「不」和「分配」。我也遇到了無法識別的減號「 - 」。 –

+0

你是否知道[]意味着什麼以及爲什麼不應該像你一樣使用它們? – rici

回答

1

正如評論指出的,問題出在使用不當的[]字符集模式。這表示一組單個個字符。該模式的解釋:

["="]* 

將匹配字符:"=或小量;.即不只是等號。它也將匹配""""""""""==========

圖案:

["*"|"/"|"%"|"&&"]* 

將匹配字符:"*|%&或小量;而不僅僅是乘法運算符。它也會匹配"""",||||||||||等。棒符號|不會代表

正確的模式是刪除包圍,留下模式的選擇。得到的柔性程序應該是這樣的:

%{ 
#include <stdio.h> 
#define Relop 1 
#define Addop 2 
#define Mulop 3 
#define Assignop 4 
#define Not  5 
%} 
%% 
"<"|">"|"<="|">="|"=="|"!=" { return Relop; } 
"+"|"-"|"||"    { return Addop; } 
"*"|"/"|"%"|"&&"   { return Mulop; } 
"="       { return Assignop; } 
"!"       { return Not; } 
.       { return -1; } 
%% 
int main() { 
    int token; 
    while ((token = yylex())) { 
     switch (token) { 
      case Relop: printf("Relop: %s\n", yytext); break; 
      case Addop: printf("Addop: %s\n", yytext); break; 
      case Mulop: printf("Mulop: %s\n", yytext); break; 
      case Assignop: printf("Assignop: %s\n", yytext); break; 
      case Not:  printf("Not: %s\n", yytext);  break; 
      default:  printf("Error: %s not recognized\n", yytext); 
     } 
    } 
} 

我寫了完整的答案,以幫助其他人只能it was clear the OP had fixed the error後誰可能使這個普通初學者的錯誤!