我有一个问题。
我正在编写一个flex程序,我正在使用这段代码:
%union {
int entero;
char *cadena;
TipoDato tipo;
}
此代码适用于我的数据类型。
我想评估下一行:expresion SUM expresion其中SUM是求值的运算和,例如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);
}
我有下一个错误
../ 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:**警告:'输入'已定义但未使用
Leyendo fichero'.. / docs / prog1.bgy'。
有什么问题?
谢谢!
再见!!
答案 0 :(得分:5)
这些都是实际的警告,而不是错误,所以你的代码应该可以正常工作,但它们很烦人。要摆脱野牛警告,您需要在.y文件的顶部使用%type
声明。像%type <tipo> expression
这样的事情,然后您只需在动作代码中引用$1
和$3
以及$$
(无.tipo
后缀,后者由bison自动提供由于%type
)。
要删除buggy.tab.c中的编译器警告,您需要在.y文件中声明yylex;类似的东西:
%{
extern int yylex();
%}
在顶部,假设您没有#define YYLEX_PARAM
从lex.yy.c中删除编译器警告更难;你最好的选择可能只是在编译时不使用-Wall,因为flex生成的代码不是-Wall clean
修改强>
经过一些搜索后,您似乎可以通过在.l文件的顶部添加#define YY_NO_INPUT
来消除有关输入的警告。