bison 如何调用在 %union 中声明的指针
bison how to call pointer declared in %union
这是我的一小部分代码,我收到一条错误消息
request for member 's' is something not a structure or a union.
我有这个错误是因为我不再需要使用 s,因为我指定了他的类型。我遇到的问题是,我需要另一种方法来引用 's',而不是 $3.s,但我找不到该怎么做。如果我只投入 3 美元,我将不会在“$3.s[0]”处收到错误消息,但会在 'strcpy(.s, .s+1)' 处收到错误消息
我是 lex&yacc 的新手,到目前为止我所知道的东西,无法帮助我解决这个问题。
%union{
int i;
char *s;
}
%left '+','-'
%left '*','/'
%left UNARYMINUS
%type <i> expr
%type <s> instr
%token <i> NUMBER
%token <s> WORD
%token <s> SPACE
%%
instr: SPACE instr { }
|WORD '=' expr ';' {
int v;
if (.s[0]=='$')
{
fprintf(fout, "\tmove\t$%d, %s\n\n", variabile(.s), .s);
strcpy(.s, .s+1);
v=atoi(.s);
if (v>nvar)
erasereg(v);
}
else
fprintf(fout, "\taddi\t$%d, [=10=], %s\n\n", variabila(.s), .s);
free(.s);
free(.s);
}
;
使用 %type <i> expr
,你告诉 Yacc expr
是一个整数,但你仍然检查它是否指向 $
。它是一个或另一个。与其尝试将所有功能塞入解析 instr
的块中,不如:
将 $variables
与 lex 规则匹配并在符号 table 中查找
"$"[A-Za-z][A-Za-z0-9]* { return var_lookup(yytext); }
或者您可以在 expr
的 yacc 规则中查找它们
expr: WORD {
$$ = [0]=='$' ? var_lookup() : atoi();
}
此外,%left
的参数由空格而不是逗号分隔,并且您不调用非函数指针,您 use/dereference 它们。
这是我的一小部分代码,我收到一条错误消息
request for member 's' is something not a structure or a union.
我有这个错误是因为我不再需要使用 s,因为我指定了他的类型。我遇到的问题是,我需要另一种方法来引用 's',而不是 $3.s,但我找不到该怎么做。如果我只投入 3 美元,我将不会在“$3.s[0]”处收到错误消息,但会在 'strcpy(.s, .s+1)' 处收到错误消息 我是 lex&yacc 的新手,到目前为止我所知道的东西,无法帮助我解决这个问题。
%union{
int i;
char *s;
}
%left '+','-'
%left '*','/'
%left UNARYMINUS
%type <i> expr
%type <s> instr
%token <i> NUMBER
%token <s> WORD
%token <s> SPACE
%%
instr: SPACE instr { }
|WORD '=' expr ';' {
int v;
if (.s[0]=='$')
{
fprintf(fout, "\tmove\t$%d, %s\n\n", variabile(.s), .s);
strcpy(.s, .s+1);
v=atoi(.s);
if (v>nvar)
erasereg(v);
}
else
fprintf(fout, "\taddi\t$%d, [=10=], %s\n\n", variabila(.s), .s);
free(.s);
free(.s);
}
;
使用 %type <i> expr
,你告诉 Yacc expr
是一个整数,但你仍然检查它是否指向 $
。它是一个或另一个。与其尝试将所有功能塞入解析 instr
的块中,不如:
将
$variables
与 lex 规则匹配并在符号 table 中查找"$"[A-Za-z][A-Za-z0-9]* { return var_lookup(yytext); }
或者您可以在
的 yacc 规则中查找它们expr
expr: WORD { $$ = [0]=='$' ? var_lookup() : atoi(); }
此外,%left
的参数由空格而不是逗号分隔,并且您不调用非函数指针,您 use/dereference 它们。