我正在尝试编写某种简单的编译器来检测未声明的变量,并执行一些额外的操作。问题是,我不能在我的 Bison 文件中使用“$$”,它说“‘type'的$$没有声明类型”。以下是我的 flex 和 bison 文件的相关部分:
flx file:
int[ \t\n]+matrix {yylval.type_id.Type = 4;return tINTMATRIXTYPE; }
bison file:
%}
%union semrec
{
struct
{
int Type;
char *id;
}type_id;
}
%start prog
%%
prog: stmtlst
;
stmtlst : stmt
| stmt stmtlst
;
tmt : decl //baktım
| asgn
| if
;
decl : type vars '=' expr ';'
;
type : tINTTYPE
| tINTVECTORTYPE
| tINTMATRIXTYPE {$$.Type=$1.Type;}
| tREALTYPE
| tREALVECTORTYPE
| tREALMATRIXTYPE
;
%%
在 bison 文件中写入 $1.Type 可以,但 $$.Type 不起作用。 有人可以帮忙吗?谢谢
最佳答案
您需要明确告诉 bison 您计划为其分配值的每个标记是什么类型(终端和非终端)。看起来您也没有声明任何 token 。
%type <Type> type
将帮助您开始。但现在您必须确保 $$ 也为所有其他类型(tINTTYPE 等)设置。
下面是一个简单的示例,可以让您大致了解 bison 的运行方式:http://www.gnu.org/software/bison/manual/bison.html
关于compiler-construction - 将属性从 flex 返回给 bison,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15930257/