如何解决在非结构或联合中要求成员“ sval”
我在解析的玩具语言中出现错误。这是我的一些解析器代码:
%union {
char* <sval>;
}
%token INTEGER
%token INTDEC FLODEC AS
%token <sval> VARIABLE
%token POINT LBRACKET RBRACKET
%token SHOW ESC
%left '+' '-'
%left '*' '/' MODULO FACTORIAL FLOOR
%left '^'
%code requires {
#define YYSTYPE float
}
还有我的一些词法分析器代码:
as {return AS;}
float {return FLODEC;}
show {return SHOW;}
int {return INTDEC;}
esc {return ESC;}
\. {return POINT;}
{integer} {yylval = atoi(yytext); return INTEGER;}
[a-zA-Z]+ {yylval.sval = strdup(yytext); return VARIABLE;}
["\\"] {return FLOOR;}
[-+/=*^\n] {return *yytext;}
["("] {return LBRACKET;}
[")"] {return RBRACKET;}
["!"] {return FACTORIAL;}
["%%"] {return MODULO;}
[" \t\n"]
. {printf("Syntax error");}
我认为这实际上是一个工会,但我不确定该怎么办。
解决方法
char* <sval>;
不是有效的C成员声明,并且%union
成员只是C成员声明。 (Yacc / bison将它们从字面上复制到union
声明中。)因此,尝试编译该代码必然会在union YYSTYPE
的声明中产生编译时错误消息。后续代码将无法使用union YYSTYPE
,因为尚未正确声明,因此将产生显示的错误消息。
此外,一旦您声明语义类型为union
,就需要相应地调整词法扫描器操作。您将无法编译
yylval = strdup(yytext);
因为yylval
的类型为union YYSTYPE
,并且union
只能从另一个相同类型的union
变量中分配。您需要将其更改为
yylval.sval = strdup(yytext);
您的其他yylval
分配也需要以相同的方式处理,但是您在union
声明中似乎没有合适的%union
成员,因此您必须先解决这个问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。