Bison Start symbol Start不派生任何句子%Start Start

Bison Start symbol Start不派生任何句子%Start Start,bison,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

这是我的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);
    }
%{
#包括
外部文件*yyin;
外-内线;
%}
%令牌数据类型编号ID RET主关键字AOP头STB ENB
%开始
%%
开始:H主机顶盒S R ENB
H:收割台H |收割台
S:DS
|ES S
|CS S
|;
DS:数据类型V';'
V:ID | V','ID
ES:ID'='V;
E:编号| ID
CS:关键字“('A')”{'}”
A:ID AOP ID | ID AOP编号|'}'''
R:RET编号“;”
%%
int main()
{
yyin=fopen(“客户c”、“r”);
yyparse();
}   
yyerror()
{
printf(“\n第%D行错误”,第行);
}
它给了我以下错误:

yaac.y:警告:11个非终结符在语法中无用[-Wother]
yaac.y:警告:18条规则在语法上毫无用处[-Wother]
yaac.y:7.8-12:致命错误:启动符号start未派生任何 句子 %开始


如注释所示,最好以适当的yacc/bison格式重新格式化代码。特别是,语法规则应该从页面左侧(第1列)开始,每个规则都应该以分号
结尾。由于缺少分号,可能会将一条规则转换为另一条规则,从而混淆bison

这样做之后,bison生成了一些更清晰的错误消息,表明非终端
E
是无用的。您没有在任何规则中使用
E
,这可能是您的语法错误:

yaac.y:警告:1非终结符在语法中无效
yaac.y:警告:语法中有两条规则无效
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);
    }
%{
#包括
外部文件*yyin;
外-内线;
%}
%令牌数据类型编号ID RET主关键字AOP头STB ENB
%开始
%%
开始:H主机顶盒S R ENB
;
H:收割台H |收割台
;
S:DS
|ES S
|CS S
|;
DS:数据类型V';'
;
V:ID | V','ID
;
ES:ID'='V;
;
E:编号| ID
;
CS:关键字“('A')”{'}”
;
A:ID AOP ID | ID AOP编号|'}'''
;
R:RET编号“;”
;
%%
int main()
{
yyin=fopen(“客户c”、“r”);
yyparse();
}   
yyerror()
{
printf(“\n第%D行错误”,第行);
}

如评论中所示,最好以适当的yacc/bison格式重新格式化代码。特别是,语法规则应该从页面左侧(第1列)开始,每个规则都应该以分号
结尾。由于缺少分号,可能会将一条规则转换为另一条规则,从而混淆bison

这样做之后,bison生成了一些更清晰的错误消息,表明非终端
E
是无用的。您没有在任何规则中使用
E
,这可能是您的语法错误:

yaac.y:警告:1非终结符在语法中无效
yaac.y:警告:语法中有两条规则无效
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);
    }
%{
#包括
外部文件*yyin;
外-内线;
%}
%令牌数据类型编号ID RET主关键字AOP头STB ENB
%开始
%%
开始:H主机顶盒S R ENB
;
H:收割台H |收割台
;
S:DS
|ES S
|CS S
|;
DS:数据类型V';'
;
V:ID | V','ID
;
ES:ID'='V;
;
E:编号| ID
;
CS:关键字“('A')”{'}”
;
A:ID AOP ID | ID AOP编号|'}'''
;
R:RET编号“;”
;
%%
int main()
{
yyin=fopen(“客户c”、“r”);
yyparse();
}   
yyerror()
{
printf(“\n第%D行错误”,第行);
}

你的代码真的很难破译。请根据Yacc通常使用的习惯用法重新格式化您的代码,并尝试创建一个最小的示例,而不仅仅是整个项目的转储。您的代码真的很难破译。请根据Yacc通常使用的习惯用法重新格式化代码,并尝试创建一个最小的示例,而不仅仅是整个项目的转储。