Bison Start symbol Start不派生任何句子%Start Start
这是我的yacc代码: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
%{
#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通常使用的习惯用法重新格式化代码,并尝试创建一个最小的示例,而不仅仅是整个项目的转储。