gpt4 book ai didi

lex - ....未声明(在此函数中首次使用)?

转载 作者:行者123 更新时间:2023-12-04 19:46:50 40 4
gpt4 key购买 nike

我有一个简单的 lex 语言代码,我用 Flex 生成了 lex.yy.c。当我想将 lex.yy.c 编译为 .exe 文件时,出现了一些错误,如“未声明(首次在此函数中使用)”!当我在网络上搜索时,我知道我需要一个 Const.h 文件,所以我想生成该文件。我该怎么做?

一些错误:

35 C:\Users\Majid\Desktop\win\lex.l STRING' undeclared (第一次在这个函数中使用)
38 C:\Users\Majid\Desktop\win\lex.l
LC' undeclared(第一次使用在这个函数中)39 C:\Users\Majid\Desktop\win\lex.l `LP' undeclared (第一次在这个函数中使用)....

代码的开头是:

%{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;}

最佳答案

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

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

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

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

托马斯尼曼的 A Compact Guide to Lex & Yacc很好地介绍了如何使用 Flex 和 Bison。 (Lex 和 Yacc 是旧的原始工具,而 Flex 和 Bison 是同一工具的新免费版本。)

关于lex - ....未声明(在此函数中首次使用)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13331929/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com