这是我的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
答案 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);
}