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