-1

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

質問は、列挙型の代わりにより良い型がある場合のみです

4

1 に答える 1

1

あなたが返すものは何でも、コンパイラーによって理解されなければなりません。を使用している場合yacc,、選択の余地はありません。%tokenで定義されている、生成されたものに従うy.tab.h.:必要があります。何もする必要はありません。

一方flex、単一文字の特殊文字の名前やルールを指定する必要はありません。yytext[0]すべての文字を返すだけで、ファイル内の対応するリテラルを使用.yできます。

さらにコメントするのに十分な詳細を提供していません。

于 2013-04-11T08:52:36.837 に答える