2014-05-18 2 views
2

나는 모든 노력을 나는 다음과 같은 오류가 점점 계속 :Yacc에 오류가 요청하지 않은 구조 또는 조합

(라인) 20시 31분 : 오류 : 멤버에 대한 요청 '발'뭔가를 하지 구조 또는 조합

(라인) 22시 38분 오류 : 어떤 부재 요청 '브로'이 아닌 구조 또는 조합

(라인) 27 : 108 : 오류 : 회원 요청 '브로' 구조 나 노동 조합이 아닌 어떤 것에서

%{ 
#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

당신이 $2.val 같은 것들에서 .val을 제거하려고 했습니까? %token%type 줄 및 <tag> 구조 때문에 유니온의 특정 필드가 이미 결정됩니다. 즉, 생성 된 C 코드에서 (yylval.val).val과 같은 작업을 수행하고있는 것입니다.

+0

설명 해 주셔서 감사합니다. D – rJqnr