[prog] Yacc - double errors

Sue Stones suzo at spin.net.au
Tue Feb 10 21:03:52 EST 2004


My Yacc program keeps on trying to process things after it gets an end of 
file.  It even processes the EOF but just doesn't stop.  

Got any sugesstions?

Below are the rules.

sue
________________________

 
program :   statement_list ENDOF{
                        fprintf(stderr, "EOF Parsed\n");
                }
        ;

statement_list :   full_statement
        |       while_statement
        |       statement_list full_statement
        |       statement_list while_statement
        ;

full_statement: statement SEMI {
                        fprintf(stderr, "Full Statement Parsed\n");
              }
        |       statement {
                        errorstr = strdup("Missing semicolon");
                        yyerror(errorstr);
                }
        ;

statement :  INCR NAME   { fprintf(stdout,"%s++;\n", $2); }
        |    DECR NAME   { fprintf(stdout,"%s--;\n", $2); }
        |    NAME GETS NAME  { fprintf(stdout,"%s = %s;\n", $1, $3); }
        |    CLEAR NAME   { fprintf(stdout,"%s = 0;\n"); }
        ;
while_statement :  WHILE NAME NE ZERO DO SEMI {
                        fprintf(stdout,"while (%s != 0){ \n", $2);
                        fprintf(stderr, "While Statemet Parsed\n");
                } while_statement_list
        |       WHILE NAME NE ZERO DO {
                        fprintf(stdout,"while (%s != 0){ \n", $2);
                        errorstr = strdup("Missing semicolon");
                        yyerror(errorstr);
                } while_statement_list
        ;

while_statement_list :  statement_list end_statement
        ;

end_statement:  END SEMI {
                        fprintf(stdout, "}\n");
                }
        |       END  {
                        fprintf(stdout, "}\n");
                        errorstr = strdup("Missing semicolon after \"end\"");
                        yyerror(errorstr);
                }
        ;



More information about the Programming mailing list