3

我有一个 lex 语言的简单代码,我用 Flex 生成 lex.yy.c。当我想将 lex.yy.c 编译为 .exe 文件时,我收到一些错误,例如“未声明(在此函数中首次使用)”!当我在网上搜索时,我知道我需要一个 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 这两个工具经常一起使用。

Bison 是一个解析器生成器。它的输入是一个文件,您在其中编写了一个描述语言语法的语法,Bison 生成一个解析器。解析器(或“语法分析器”)是编译器(或类似工具)的一部分,它根据语言的语法分析输入。例如,解析器知道if语句可以但不一定有else部分。

Flex 是一个扫描器生成器,它从一个带有正则表达式的文件创建一个扫描器。扫描器(或“词法分析器”)是编译器(或类似工具)的一部分,用于分析输入并将其划分为“令牌”。标记可以是关键字(例如if)、运算符(例如+)、整数常量等。例如,扫描仪知道整数常量被写为一个或多个数字的序列。

扫描器在找到令牌时向解析器报告。例如,如果输入以123开头,扫描器可能会识别出这是一个整数常量,并将其报告给解析器。在 Flex 和 Bison 的情况下,它通过返回整数常量的令牌代码来做到这一点,它可能(仅作为示例)是17。但是由于扫描器和解析器必须就这些令牌代码达成一致,它们需要共同的定义。Bison 将生成令牌代码,如果给定标志-d,它将在 .h 文件中输出它们。

Thomas Niemann 的Lex & Yacc 精简指南很好地介绍了如何使用 Flex 和 Bison。(Lex 和 Yacc 是旧的原始工具,而 Flex 和 Bison 是相同工具的新免费版本。)

于 2012-11-11T18:08:09.317 回答
0

对于 yacc 和 lex 部分,当我使用 yacc -d xyz.y 命令时,这个错误消失了,其中 d 是标志,xyz 是我的 yacc 文件的文件。

于 2020-11-05T15:58:31.487 回答