2012-11-09 155 views
-1

在下面的代碼是一個詞彙識別的C語言:çFlex代碼調試

%{ 
#include <stdio.h> 
void showToken(char*); 
%} 

%option yylineno 
%option noyywrap 
digit ([0-9]) 
letter ([a-zA-Z]) 
%% 

letter(letter | digit)*    showToken("id"); 
(digit)(digit)*(.(digit)(digit)*)?  showToken("num"); 
[(),:;.]    printf("%c",yytext[0]); 
[ \n] 
(==|<>|<|<=|>|>=)  showToken("relop"); 
(+|-)     showToken("addop"); 
(*|/)     showToken("mulop"); 
(=)     showToken("assign"); 
(&&)     showToken("and"); 
(||)     showToken("or"); 
(!)     showToken("not"); 
.     { 
        printf("Lexical Error"); 
        exit(0); 
        } 

%% 
void showToken(char* name){ 
    printf("<%s,%s>",name,yytext); 
} 
%% 

我遇到下面的錯誤,這是爲什麼發生的事情,我認爲我正確地寫的代碼! 我在代碼中做了太多的改變,但它不能編譯。

~/hedor>lex -t lexical.l > lexical.c 
lexical.l:13: unrecognized rule 
lexical.l:17: unrecognized rule 
lexical.l:17: unrecognized rule 
lexical.l:17: unrecognized rule 
lexical.l:17: unrecognized rule 
lexical.l:17: unrecognized rule 
lexical.l:18: unrecognized rule 
lexical.l:18: unrecognized rule 
lexical.l:18: unrecognized rule 
lexical.l:18: unrecognized rule 
lexical.l:18: unrecognized rule 
lexical.l:21: unrecognized rule 
lexical.l:21: unrecognized rule 
lexical.l:21: unrecognized rule 
lexical.l:21: unrecognized rule 
+0

它看起來像它不能理解數字,字母等嘗試替換它們與相關的正則表達式 - 這可能會或可能不會幫助,但這裏是由bnfc生成的flex輸入已知工作:http:// code .google.com/p/fridgescript/source/browse/trunk/src/bnfc%20output/FridgeScript.l – jheriko

+0

下次使用源代碼管理。 – djechlin

回答

1

有幾個問題在您的正則表達式:

13號線,實際上是錯誤的12,不要在RE添加空格,它打破了表達和沒有按預期工作:

letter(letter|digit)*    showToken("id"); 

線17,+是一個特殊字符,所以用\逃避它:

(\+|-)     showToken("addop"); 

線18,與人物*/相同:

(\*|\/)     showToken("mulop"); 

線21,與|相同:

(\|\|)     showToken("or"); 

這應該修復編譯錯誤,但要注意由下@JameySharp評論,您可能希望使用大括號編寫digitletter引用:{digit}{letter}

+2

你打敗了我。 :-)除了這些語法錯誤之外,我認爲對「數字」和「字母」的引用需要用大括號括起來。 –

+0

@JameySharp:你說得對。沒有大括號的語法是正確的,但它與輸入中的字母單詞'letter'相匹配,這可能不是OP所要求的... – rodrigo

+0

感謝您的幫助,但是有兩件事我不明白什麼是特殊字符?爲什麼這是不正確的(數字),(信)。 – flashdisk