2013-04-11 51 views
-1

我必須用flex編譯編譯器。Flex使用常量容器

但我不喜歡給定的代碼,並想讓自己。

lexfile.l:

{% 
    typedef enum { EQ=0, NE, PLUS, MINUS, SEMICOLON } punctuationType; 
    typedef enum { PRINT=100, WHILE, IDENT } keywordType; 
%} 

%% 
    "!="       { return NEQ; } 
    "="        { return EQ; } 
    "+"        { return PLUS; } 
    "-"        { return MINUS; } 
    ";"        { return SEMICOLON; } 

%% 

有沒有更好的解決辦法?

我已經搜索了一個解決方案,但另一個解決方案是定義常量。

#define EQ 0 
#define NE 1 
... 

輸出例:

Operator EQ 
Operator NE 

問題是唯一的,如果有一個更好的類型,而不是枚舉

+0

您是否將這個與野牛一起使用?如果是這樣,你通常在野牛本身定義令牌。 – Josh 2013-04-11 15:14:11

回答

1

無論你已經返回到編譯器可以理解。如果您使用的是yacc,,則不會得到選擇:您必須遵守%token生成的任何內容,這些內容是在y.tab.h.:中爲您定義的,您根本無需執行任何操作。

在另一方面也沒有必要對單字符特殊字符或者名稱或flex規則:你可以返回yytext[0]對於所有這些,在.y文件中使用相應的文字。

您並沒有提供足夠的詳細信息以供進一步評論。

+0

thx回覆,我編輯了我的主帖子 – demonking 2013-04-11 09:04:40

+0

我不明白你的編輯。這裏沒有任何代碼可以產生輸出,而且您還沒有澄清其他任何內容。 – EJP 2013-04-11 10:10:31

+0

對不起,我在上次急於;)如果正則表達式理解一切正確,我希望在第一次看到輸出。 :)現在我已經創建了一個抽象類lexType和punctuationType,另一個類從lexType擴展而來。 – demonking 2013-04-12 06:02:19