....未申报(首次使用此功能)?

时间:2012-11-11 14:17:40

标签: lex flex-lexer

我有一个简单的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.l LC'未声明(首次使用此功能) 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;}

2 个答案:

答案 0 :(得分:2)

您需要带有定义的 .h 文件。您可以手动编写,但通常此文件由Bison生成。 Flex和Bison这两个工具经常在一起使用。

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

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

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

Thomas Niemann的A Compact Guide to Lex & Yacc介绍了如何使用Flex和Bison。 (Lex和Yacc是旧的原创工具,Flex和Bison是相同工具的新版本,免费版本。)

答案 1 :(得分:0)

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