成员“令牌”的Yacc错误请求,不是结构或联合

时间:2014-05-18 17:26:09

标签: c yacc lex

我尝试了所有内容,但仍然遇到以下错误:

(行)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;
}

1 个答案:

答案 0 :(得分:1)

您是否尝试从.val等内容中删除$2.val?由于您的%token%type行以及<tag>结构,联合的特定字段已经确定。换句话说,您在生成的C代码中执行(yylval.val).val之类的操作。