WORD do_all( BYTE *filename ) { /* Hauptroutine */ BYTE *temp_file_name; /* Info-Datei lesen */ if( read_info_file() < 0 ) /* Fehler */ return( -1 ); /* Zeile zuruecksetzen */ zeile = 1; /* Grammatik-Datei lesen */ if( read_grammar_file( filename ) < 0 ) /* Fehler */ return( -1 ); /* Die Hash-Tabelle initialisieren */ if( ( hash_tab = ( HASH_TAB * ) calloc( lr_info.hash_tab_size, sizeof( HASH_TAB ) ) ) == NULL ) /* Fehler */ return( error( NOT_ENOUGH_MEMORY, 0, 0 ) ); /* Dateinamen ausgeben */ if( output_file_msg( filename ) < 0 ) /* Fehler */ return( -1 ); /* Ausgaben in Datei bzw. auf den Bildschirm */ if( lr_info.dest == DFILE ) { /* Dateinamen aufbereiten */ temp_file_name = strrchr( filename, ( WORD ) '.' ); strcpy( temp_file_name, ".TXT" ); /* Datei zum Schreiben �ffnen */ file = freopen( filename, "w", 0L ); } /* Ausgabe auf Bildschirm ? */ else if( lr_info.dest == DSCREEN ) /* Bildschirm */ file = stdout; else /* Drucker */ file = stdprn; /* Ausgabe der Fehler auf Bildschirm ? */ if( lr_info.err_dest == DSCREEN ) /* Bildschirm */ err_file = stderr; else /* Drucker */ err_file = stdprn; /* Grammatik analysieren */ if( analyze_grammar() < 0 ) /* Fehler */ return( -1 ); /* Speicher der Grammatik-Datei freigeben */ free_mem( ( VOID * ) &grammar ); /* Grammatik in BNF ausgeben ? */ if( !lr_info.output_grammar ) { /* Ja */ if( output_grammar() < 0 ) /* Fehler */ return( -1 ); } /* Items generieren */ if( generate_items() < 0 ) /* Fehler */ return( -1 ); /* Die LR-Tabelle erzeugen */ if( make_tab() < 0 ) /* Fehler */ return( -1 ); /* FIRST-Mengen ausgeben ? */ if( !lr_info.first ) { /* Ja */ if( output_first() < 0 ) /* Fehler */ return( -1 ); } /* FOLLOW-Mengen ausgeben ? */ if( !lr_info.follow ) { /* Ja */ if( output_follow() < 0 ) /* Fehler */ return( -1 ); } /* Items ausgeben ? */ if( !lr_info.lr_items ) { /* Ja */ if( output_items() < 0 ) /* Fehler */ return( -1 ); } /* LR-Tabelle ausgeben ? */ if( !lr_info.lr_tab ) { /* Ja */ if( output_lr_tab() < 0 ) /* Fehler */ return( -1 ); } /* LR-Tabelle optional komprimieren */ if( !lr_info.compress ) { /* LR-Tabelle komprimieren */ if( compress_lr_tab() < 0 ) /* Fehler */ return( -1 ); } /* Parser-Quelltext erzeugen */ if( generate_parser() < 0 ) /* Fehler */ return( -1 ); /* Alles OK */ return( 0 ); }
//========================================================================================================== //========================================================================================================== Grammar::Grammar(string grammar_file) { read_grammar_file(grammar_file); calc_follow_table(); }