2013-09-28 90 views
0
%{ 

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
#include "mycalc.h" 

extern int int_num; 
extern char* yytext; 

%} 

%token TOK_NUM TOK_ID TOK_SEMICOLON TOK_VAR TOK_EQ TOK_PRINTLN TOK_LPARA TOK_RPARA TOK_ADD TOK_MUL 

%union 
{ 
    int int_val; 
    char *id_val; 
} 

%type <id_val> expr TOK_ID 
%type <int_val> stmt TOK_NUM 

%left TOK_LPARA TOK_RPARA 
%left TOK_MUL 
%left TOK_ADD 

%% 

prog: 
    stmts { startit(); } 
; 


stmts: 

    | stmt TOK_SEMICOLON stmts 
; 



stmt: 
     TOK_VAR TOK_ID { defvar(presentlevel,yylval.id_val,0); } 
    | TOK_ID TOK_EQ expr { assignvar(presentlevel,$1,$3); } 
    | TOK_PRINTLN TOK_ID { printf("the value of id %d",$2); } 
    | TOK_LPARA stmts TOK_RPARA { if($1=="{") 
         { 
         presentlevel=presentlevel+1; 
         } 

         if($3=="}") 
        { 
         if(presentlevel>1) 
         { 
          presentlevel=presentlevel-1; 
         } 
         } }; 

expr: 
     TOK_NUM { $$=atoi($1); } 
    | TOK_ID { myvar *h ; 
      h=getvar(presentlevel,$1); 
      $$=h->val; 
      } 
    | expr TOK_ADD expr {$$=$1+$2;} 
    | expr TOK_MUL expr {$$=$1*$2;} 
; 

%% 

int yyerror(char *s,int x) 
{ 

printf("Syntax Error at %d",line_num); 
return 0; 

} 

int main() 
{ 

startit(); 

presentlevel=1; 

yyparse(); 
return 0; 

} 

我已經聲明瞭在union下的id_val和int_val類型,你可以看到。仍然是導致錯誤。這是我得到的錯誤。

calc.y:46.44-45: $1 of `stmt' has no declared type 
calc.y:51.43-44: $3 of `stmt' has no declared type 
calc.y:65.47-48: $2 of `expr' has no declared type 
calc.y:66.47-48: $2 of `expr' has no declared type 
make: *** [calc] Error 1 

有人可以告訴我們爲什麼它顯示錯誤,儘管聲明瞭類型。

+0

請有人可以幫我在這裏? –

回答

1

那麼,錯誤消息告訴你幾乎到底發生了什麼。對於第一個46行是:

| TOK_LPARA stmts TOK_RPARA { if($1=="{") 

這是一個stmt規則,錯誤告訴你,$1(它來自TOK_LPARA)沒有類型。你可以看到,從它的delaration:

%left TOK_LPARA TOK_RPARA 

如果您希望能夠從TOK_LPARA訪問值在這裏,你需要給它一個類型,可能<id_val>。然後你會遇到==會比較指針而不是指向字符串的問題。其他錯誤都表明類似的問題。

對於未設置$$stmt動作(您已聲明類型爲stmt)導致它們具有垃圾值,您也有問題。