我有一个简单的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;}
答案 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文件的文件)时,对于我来说,此错误消失了。