起始符号START不会导出任何句子%start START

时间:2016-10-20 07:52:15

标签: bison

这是我的yacc代码:

%{
    #include<stdio.h>
    extern File *yyin;
    extern int line;
%}
%token DATATYPE NUMBER ID RET MAIN KEYWORD AOP HEADER STB ENB
%start START 
%%
START:H MAIN STB S R ENB

      H:HEADER H|HEADER

      S:DS S
       |ES S
       |CS S
       |;
     DS:DATATYPE V';'
      V:ID|V','ID

     ES:ID'='V;
      E:NUMBER|ID

     CS:KEYWORD'('A')''{''}'
      A:ID AOP ID|ID AOP NUMBER|'}''}'

      R:RET NUMBER';'

%%
    int main()
   {
        yyin=fopen("client.c","r");
        yyparse();
    }   
    yyerror()
    {
            printf("\n ERROR AT LINE NO :%D",line);
    }

它给了我以下错误:

  

yaac.y:警告:11个非终结者在语法中没用[-Wother]
  yaac.y:警告:18条规则在语法中无用[-Wother]
  yaac.y:7.8-12:致命错误:开始符号START不导出任何内容   句子    %start START

1 个答案:

答案 0 :(得分:2)

如评论中所示,最好以适当的yacc / bison格式重新格式化代码。特别是,语法规则应从页面左侧开始(第1列),每个规则应以分号;结束。通过错过分号,可以通过将一个规则运行到另一个规则来混淆野牛。

完成此操作后,bison会生成一些更清晰的错误消息,标记非终端E无效。您没有在任何规则中使用E,这可能是您语法中的错误:

  

yaac.y:警告:1非语言无用语法
  yaac.y:警告:2条规则在语法中无用   yaac.y:29.1:警告:非终结语法没用:E
  yaac.y:29.3-8:警告:规则在语法上无用:E:NUMBER
  yaac.y:29.10-11:警告:规则在语法中无用:E:ID

为了完整起见,这就是你的语法文件在整理后的样子:

%{
    #include<stdio.h>
    extern File *yyin;
    extern int line;
%}
%token DATATYPE NUMBER ID RET MAIN KEYWORD AOP HEADER STB ENB
%start START 
%%
START:H MAIN STB S R ENB
     ;

H:HEADER H|HEADER
    ;

S:DS S
       |ES S
       |CS S
       |;

DS:DATATYPE V';'
   ;

V:ID|V','ID
    ;

ES:ID'='V;
     ;

E:NUMBER|ID
    ;

CS:KEYWORD'('A')''{''}'
   ;

A:ID AOP ID|ID AOP NUMBER|'}''}'
    ;

R:RET NUMBER';'
    ;

%%
    int main()
   {
        yyin=fopen("client.c","r");
        yyparse();
    }   
    yyerror()
    {
            printf("\n ERROR AT LINE NO :%D",line);
    }