Fatal Error : start symbol START does not derive any sentence
Fatal Error : start symbol START does not derive any sentence
我正在尝试开发一个迷你C编译器,这是yacc程序的代码,请帮助我哪里错了,我该如何改进。
语法必须能够识别:C 程序结构,即预处理器指令、主函数、变量声明、表达式、while 循环、if 和 if else 语句。
%{
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void yyerror(char* s);
int yylex();
extern int yylineno;
%}
%token T_INT T_DOUBLE T_FLOAT T_CHAR T_WHILE T_IF T_ELSE T_DO T_INCLUDE T_MAIN T_STRLITERAL T_EQCOMP T_NOTEQUAL T_GREATEREQ T_LESSEREQ T_NUM T_HEADER T_ID
%start START
%%
START : PROG {printf("Valid syntax\n"); YYACCEPT;}
;
PROG : T_INCLUDE'<'T_HEADER'>'PROG
| MAIN PROG
| DECLR';'PROG
| ASSGN';'PROG
;
DECLR : TYPE LISTVAR
;
LISTVAR : LISTVAR','T_ID
| T_ID
;
TYPE : T_INT
| T_FLOAT
| T_DOUBLE
| T_CHAR
;
ASSGN : T_ID'='EXPR
;
EXPR : EXPR REL_OP E
| E
;
REL_OP : T_LESSEREQ
| T_GREATEREQ
| '<'
| '>'
| T_EQCOMP
| T_NOTEQUAL
;
E : E'+'T
| E'-'T
| T
;
T : T'*'F
| T'/'F
| F
;
F : '('EXPR')'
| T_ID
| T_NUM
;
MAIN : TYPE T_MAIN'('EMPTY_LISTVAR')''{'STMT'}'
;
EMPTY_LISTVAR : LISTVAR
|
;
STMT : STMT_NO_BLOCK STMT
| BLOCK STMT
|
;
%nonassoc T_IFX;
%nonassoc T_ELSE;
STMT_NO_BLOCK : DECLR';'
| ASSGN';'
| T_IF COND STMT %prec T_IFX
| T_IF COND STMT T_ELSE STMT
| WHILE
;
BLOCK : '{'STMT'}';
WHILE : T_WHILE'('COND')' WHILE_2;
COND : EXPR
| ASSGN
;
WHILE_2 : '{'STMT'}'
|';'
;
%%
void yyerror(char *s)
{
printf("Error : %s at %d\n",s,yylineno);
}
main(int argc,char* argv[])
{
yyparse();
return 0;
}
这些是我遇到的错误:
48 rules never reduced
parser.y: warning: 20 useless nonterminals and 48 useless rules
parser.y:13.8-12: fatal error: start symbol START does not derive any sentence
PROG
的每个产生式都是递归的。所以递归永无止境,PROG
无法推导出有限句
由于 START
的唯一生产是 PROG
,这也适用于 START
。
我正在尝试开发一个迷你C编译器,这是yacc程序的代码,请帮助我哪里错了,我该如何改进。
语法必须能够识别:C 程序结构,即预处理器指令、主函数、变量声明、表达式、while 循环、if 和 if else 语句。
%{
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void yyerror(char* s);
int yylex();
extern int yylineno;
%}
%token T_INT T_DOUBLE T_FLOAT T_CHAR T_WHILE T_IF T_ELSE T_DO T_INCLUDE T_MAIN T_STRLITERAL T_EQCOMP T_NOTEQUAL T_GREATEREQ T_LESSEREQ T_NUM T_HEADER T_ID
%start START
%%
START : PROG {printf("Valid syntax\n"); YYACCEPT;}
;
PROG : T_INCLUDE'<'T_HEADER'>'PROG
| MAIN PROG
| DECLR';'PROG
| ASSGN';'PROG
;
DECLR : TYPE LISTVAR
;
LISTVAR : LISTVAR','T_ID
| T_ID
;
TYPE : T_INT
| T_FLOAT
| T_DOUBLE
| T_CHAR
;
ASSGN : T_ID'='EXPR
;
EXPR : EXPR REL_OP E
| E
;
REL_OP : T_LESSEREQ
| T_GREATEREQ
| '<'
| '>'
| T_EQCOMP
| T_NOTEQUAL
;
E : E'+'T
| E'-'T
| T
;
T : T'*'F
| T'/'F
| F
;
F : '('EXPR')'
| T_ID
| T_NUM
;
MAIN : TYPE T_MAIN'('EMPTY_LISTVAR')''{'STMT'}'
;
EMPTY_LISTVAR : LISTVAR
|
;
STMT : STMT_NO_BLOCK STMT
| BLOCK STMT
|
;
%nonassoc T_IFX;
%nonassoc T_ELSE;
STMT_NO_BLOCK : DECLR';'
| ASSGN';'
| T_IF COND STMT %prec T_IFX
| T_IF COND STMT T_ELSE STMT
| WHILE
;
BLOCK : '{'STMT'}';
WHILE : T_WHILE'('COND')' WHILE_2;
COND : EXPR
| ASSGN
;
WHILE_2 : '{'STMT'}'
|';'
;
%%
void yyerror(char *s)
{
printf("Error : %s at %d\n",s,yylineno);
}
main(int argc,char* argv[])
{
yyparse();
return 0;
}
这些是我遇到的错误:
48 rules never reduced
parser.y: warning: 20 useless nonterminals and 48 useless rules
parser.y:13.8-12: fatal error: start symbol START does not derive any sentence
PROG
的每个产生式都是递归的。所以递归永无止境,PROG
无法推导出有限句
由于 START
的唯一生产是 PROG
,这也适用于 START
。