我有个问题.
我正在编写一个flex程序,我正在使用这段代码:
%union {
int entero;
char *cadena;
TipoDato tipo;
}
Run Code Online (Sandbox Code Playgroud)
此代码适用于我的数据类型.
我想评估下一行:expresion SUM expresion其中SUM是evaluate的运算和,例如69 + 60
当我写这个
if (($1.tipo == ENT) && ($3.tipo == ENT)){
$$.tipo = ENT;
} else if (($1.tipo == CADEN) && ($3.tipo == CADEN)) {
$$.tipo = CADEN;
} else {
printf ("Error en la suma: Tipos de datos incompatibles Revise los tipos\n");
yyerror(parser);
}
Run Code Online (Sandbox Code Playgroud)
我有下一个错误
../src/buggy.y:350.37-38:$ 1 de`expresion'no tiene tipo declarado
../src/buggy.y:351.28-29:$ 1 de`expresion'no tiene tipo declarado
buggy.tab.c:在函数'yyparse'中:
buggy.tab.c:1646:警告:隐式声明函数'yylex'
../src/buggy.y:顶级:
lex.yy.c:1577:警告:'yyunput'已定义但未使用
lex.yy.c:1618:**警告:'input'已定义但未使用
Leyendo fichero'../ docs/prog1.bgy'.
问题是什么?
谢谢!
再见!
这些都是警告,而不是错误,所以你的代码应该可以工作,但它们很烦人.要摆脱野牛警告,您需要%type在.y文件的顶部使用声明.出头像%type <tipo> expression,然后你只是参考$1,并$3和$$你的动作代码(没有.tipo后缀,这是自动野牛由于所提供的%type).
要删除buggy.tab.c中的编译器警告,您需要在.y文件中声明yylex; 就像是:
%{
extern int yylex();
%}
Run Code Online (Sandbox Code Playgroud)
在顶部,假设您没有#define YYLEX_PARAM
摆脱lex.yy.c中的编译器警告更难; 你最好的选择可能只是在编译时不使用-Wall,因为flex生成的代码不是-Wall clean
编辑
经过一些搜索,似乎你可以通过#define YY_NO_INPUT在.l文件的顶部放置一个关于输入的警告.
| 归档时间: |
|
| 查看次数: |
4768 次 |
| 最近记录: |