3

lex 言語の単純なコードがあり、Flex で lex.yy.c を生成します。lex.yy.c を .exe ファイルにコンパイルしようとすると、「未宣言 (この関数で最初に使用)」のようなエラーが発生します。Webで検索すると、Const.hファイルが必要だとわかったので、そのファイルを生成したいと思います。どうすればこれを行うことができますか?

いくつかのエラー:

35 C:\Users\Majid\Desktop\win\lex.l STRING' undeclared (first use in this function) 38 C:\Users\Majid\Desktop\win\lex.lLC' 未宣言 (この関数で最初に使用) 39 C:\Users\Majid\Desktop\win\lex.l `LP' 未宣言 (この関数で最初に使用) ) ....

コードの冒頭は次のとおりです。

%{int stk[20],stk1[20];
int lbl=0,wlbl=0;
int lineno=0;
int pcount=1;
int lcount=0,wlcount=0;
int token=100;
int dtype=0;
int count=0;
int fexe=0;
char c,str[20],str1[10],idename[10];
char a[100];
void eatcom();
void eatWS();
int set(int);
void check(char);
void checkop();
int chfunction(char *);%}

 Digit  [0-9]
 Letter [a-zA-Z]
ID     {letter}({letter}|{digit})*
NUM    {digit}+
 Delim  [ \t]
 A     [A-Za-z]]
%%



 "/*"               eatcom();
 "//"(.)*
 \"(\\.|[^\"])*\"       return (STRING);
 \"(\\.|[^\"])*\n       printf("Adding missing \" to sting constant");

 "{"                {a[count++]='{';fexe=0;eatWS();return LC;}
 "("                {a[count++]='(';eatWS();return LP;}
 "["                {a[count++]='[';eatWS();return LB;}
 "}"                {check('{');eatWS();
                if(cflag)
                {
                    //stk[lbl++]=lcount++;
                    fprintf(fc,"lbl%d:\n",stk[--lbl]);
                    //stk[lbl++]=lcount++;
                    printf("%d\n",stk[lbl]);
                    cflag=0;
                }
                return RC;
            }
    "]"             {check('[');eatWS();return RB;}
    ")"             {check('(');eatWS();return RP;}
    "++" | "--"         return INCOP;
    [~!]                return UNOP;
     "*"                {eatWS();return STAR;}
    [/%]            {eatWS();return DIVOP;}
    "+"             {eatWS();return PLUS;}
     "-"                {eatWS();return MINUS;}
4

2 に答える 2

3

定義を含む.hファイルが必要です。手で書くこともできますが、通常、このファイルは Bison によって生成されます。Flex と Bison の 2 つのツールは、よく一緒に使用されます。

Bison はパーサージェネレーターです。その入力は、言語の構文を記述する文法を記述したファイルであり、Bison はパーサーを生成します。パーサー (または「構文アナライザー」) は、言語の構文に従って入力を分析するコンパイラー (または同様のツール) の一部です。たとえば、ifステートメントがelse部分を持つことができるが、そうである必要はないことを知っているのはパーサーです。

Flex はスキャナー ジェネレーターであり、正規表現を含むファイルからスキャナーを作成します。スキャナー (または「語彙アナライザー」) は、入力を分析して「トークン」に分割するコンパイラー (または同様のツール) の一部です。トークンは、ifなどのキーワード、 +などの演算子、整数定数などにすることができます。たとえば、整数定数が 1 つまたは複数の数字のシーケンスとして書き込まれることを認識するのはスキャナです。

スキャナーは、トークンを検出するとパーサーに報告します。たとえば、入力が123で始まる場合、スキャナーはこれが整数定数であることを認識し、これをパーサーに報告します。Flex と Bison の場合、整数定数のトークン コードを返すことでこれを行います。これは (例として) 17の可能性があります。ただし、スキャナーとパーサーはこれらのトークン コードに同意する必要があるため、共通の定義が必要です。Bison はトークン コードを生成し、フラグ-dを指定すると、それらを .h ファイルに出力します。

Thomas Niemann のA Compact Guide to Lex & Yaccは、Flex と Bison の使用方法を紹介しています。(Lex と Yacc は古いオリジナルのツールで、Flex と Bison は同じツールの新しい無料バージョンです。)

于 2012-11-11T18:08:09.317 に答える
0

yacc と lex の部分では、d がフラグで xyz が yacc ファイルのファイルである yacc -d xyz.y コマンドを使用すると、このエラーは消えました。

于 2020-11-05T15:58:31.487 に答える