2012-04-01 67 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