我尝试了所有内容,但仍然遇到以下错误:
(行)20:31:错误:请求成员'val'在非结构或联合的内容
(line)22:38:错误:请求成员'val'不是结构或联合
(line)27:108:错误:在非结构或联合的东西中请求成员'val'
%{
#include "y.tab.h"
%}
%option noyywrap
%option yylineno
%%
0|[1-9][0-9]* {yylval.val=atoi(yytext); return NUM;}
\*|\+ {yylval.val=yytext[0]=='+'?0:1; return OP;}
\(|\) return yytext[0];
[ \t\n] ;
. yyerror("caracter invalido");
%%
yacc:
%{
#include<stdio.h>
#include<stdlib.h>
extern int yylineno;
%}
%union {struct nodo{int val; struct nodo *next} *p; int val;}
%start lexp
%token<val> OP NUM
%type<p> larg arg
%type<val> exp
%%
lexp : lexp exp
|
;
exp : '(' OP larg ')' {struct nodo *p=$3->next;int val=$3->val;
while(p){
val=$2.val?(val+p->val):(val*p->val);
p=p->next;}
printf("R:%d\n", val); $$.val=val;}
;
larg : arg larg {$$=$1; $1->next=$2;}
| arg arg {$$=$1; $1->next=$2;}
;
arg : NUM {$$= (struct nodo *) malloc(sizeof(struct nodo)); $$->next=0; $$->val=$1.val;}
| exp {$$= (struct nodo *) malloc(sizeof(struct nodo)); $$->next=0; $$->val=$1.val;}
;
%%
int yyerror(char *s){fprintf(stderr, "linha %d: %s\n", yylineno,s); return 0;}
int main(){
yyparse();
return 0;
}
答案 0 :(得分:1)
您是否尝试从.val
等内容中删除$2.val
?由于您的%token
和%type
行以及<tag>
结构,联合的特定字段已经确定。换句话说,您在生成的C代码中执行(yylval.val).val
之类的操作。