2012-04-01 65 views
1

我寫了下面的代碼作爲我的yacc文件的一部分。在yacc中輸入規則的錯誤

%{ 
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
    FILE *fp; 
    %} 

    %token LINE CIRCLE POLYGON 
    %token CENTRE RADIUS WITHIN 
    %token END 

    %union 
    { 
    char *string; 
    int number; 
    } 

%token <number> NUM 
%token <string> CORDINATE 
%start Input 
%% 

    Input: 

     | Input Statement 
     ; 

Statement : 
     END  
     | LINE CORDINATE CORDINATE END {fprintf(fp,"\n\\newline\n\\psline%s%s\n",$2,$3,$2,$3);} 
     | SCirc END 
     | POLYGON Mcords   {fprintf(fp,"\n\\newline\n\\pspolygon%s",$2);} 
     ; 

SCirc : 
      CIRCLE RADIUS NUM CENTRE CORDINATE {fprintf(fp,"\n\\newline\n\\pscircle%s{%d}\n",3*$3,3*$3,$5,$3);} 
     | CIRCLE CENTRE CORDINATE RADIUS NUM {fprintf(fp,"\n\\newline\n\\pscircle%s{%d}\n",-2*$5,-2*$5,2*$5,2*$5,$3,$5);} 
; 
Mcord : 
      CORDINATE CORDINATE CORDINATE {$$ = strcat(strcat($1,$2),$3);} 
     | Mcord CODINATE  {$$ = strcat($1,$2); } 
     ; 

%% 

int yyerror(char *s) { 
     printf("%s\n",s); 
    } 

int main(void) { 

/* some stuff */ 
yyparse(); 
fprintf(fp,"\\end{pspicture}\n\\end{document}"); 
fclose(fp); 
} 

,我最終得到一個錯誤


parser.y:41.42-43:$$ Mcord的'」沒有聲明的類型


我的意思是,以下示例正常工作,其中$$以數字結尾

   Expression : 
          Number {$$ = $1;} 
         | Expression '+' Expression {$$ = $1+$2;} 

我希望麥克道爾能夠成爲許多CORDINATE的聯絡員。 我該怎麼做? 有沒有什麼方法可以爲規則定義類型?

+1

@PulkitJain對不起,我回滾了你對這個問題所做的修改。你基本上用完全不同的問題來替換問題。請開始一個新的問題,而不是替換現有的問題。非常感謝!您可以通過查看版本歷史記錄來檢索您輸入的文本。找到「已編輯」圖標,然後點擊最後一位編輯姓名上方的時間。 – Kaz 2012-04-09 06:48:58

回答

3

是的,必須聲明非終結符號具有使用%type <...>而不是%token <...>的類型。 Yacc沒有很好的參考手冊嗎? GNU Bison手冊非常好,即使您使用其他Yacc也是如此。

+0

我找到了另一個出路。那麼謝謝卡茲。 – Dynamite 2012-04-04 15:19:19