fiducials: *eof* nonterm: *start* actual_argument actual_arguments addop array_qualifier array_type assignment_statement break_statement call_by call_statement case_list case_statement comparison compop compound_statement const_declarations const_list declaration_type declared_type direction dispose_request else_clause empty_statement executable_statement expression factor final fld_list for_statement formal_argument formal_arguments global_declarations goto_statement if_statement initial kize_program label label_declarations label_list literal local_declarations more_actual_arguments more_const_list more_factors more_fld_list more_formal_arguments more_label_list more_proc_list more_procedure_list more_terms more_type_list more_var_list mulop named_item new_request next_statement opt_label opt_value pointer_qualifier proc_declarations proc_list proc_signature procedure procedure_list procedure_qualifier qualifier read_statement record_qualifier record_type repeat_statement return_statement return_type sign simple_expression statement statement_list structure_qualifier term then_clause two_options type_declarations type_list ub var_declarations var_list while_statement write_statement term: % & ( (if ) * *eof* + , - . / : := ; < <= <> = > >= AND ARRAY ASTRING BEGIN BREAK CALL CASE CONSTANTS DECIMAL DEFAULT DISPOSE DO DOWNTO ELSE END FOR GOTO IDENTIFIER IF LABELS NEW NEXT NOT NULL NUMBER OF OR PROCEDURE PROCEDURES PROGRAM READ READLN RECORD REPEAT RETURN THEN TYPES UNTIL UPTO VAL VAR VARIABLES WHILE WRITE WRITELN [ ] ^ atomic_type by by_var) const defined_type epilogue more_factors_a val) eop: !break !calc_array_offset !calc_record_offset !check_arg_list_sizes !check_array !check_declared !check_duplicate !check_index !check_int_constant !check_label !check_no_elements !check_or !check_record !check_type !determine_call_by !determine_caller !discard_target !emit_and_a !emit_and_b !emit_assign; !emit_case_a !emit_case_b !emit_case_compare !emit_comparison !emit_do_a !emit_do_b !emit_empty !emit_for_a !emit_for_increment !emit_for_setup !emit_for_test !emit_goto !emit_if_a !emit_if_b !emit_label !emit_mulop !emit_neg !emit_next_case !emit_not !emit_or_a !emit_or_b !emit_procedure_epilogue !emit_procedure_prologue !emit_program !emit_program_prologue !emit_repeat_a !emit_repeat_b !emit_rvalue !emit_test_a !emit_test_b !emit_test_c !emit_while_a !emit_while_b !exit_next_case !get_break !get_next !go_there !initialize_global_symbol_table !initialize_local_symbol_table !insert_const_entry !insert_field_descriptor !insert_label_entry !insert_proc_entry !insert_static_memory_entry !insert_type_entry !insert_variable_entry !is_and !is_or !next !nop !not_and !resolve_types !result_type !retrieve_info !return_data_type !return_result !return_result_type !return_sign !return_type !save_SAR !save_address !save_array_info !save_formal_argument !save_ident !save_local_storage !save_op !save_sign !save_type !top predicts: grammar: *start* -> kize_program *eof* CS: PROGRAM actual_argument -> !determine_caller !determine_call_by named_item (if by_var) CS: IDENTIFIER | !determine_caller !determine_call_by expression (if by val) CS: - NOT + const ( IDENTIFIER & actual_arguments -> CS: ) | !check_arg_list_sizes actual_argument more_actual_arguments CS: - NOT + const ( IDENTIFIER & addop -> + CS: + | - CS: - | OR CS: OR array_qualifier -> !check_array !save_SAR [ expression !check_index ] !calc_array_offset structure_qualifier !return_type CS: [ array_type -> ARRAY [ ub !check_no_elements ] OF declared_type !save_array_info CS: ARRAY assignment_statement -> named_item !save_type !save_address := two_options !save_type !emit_assign; CS: IDENTIFIER break_statement -> BREAK ; !get_break !go_there CS: BREAK call_by -> CS: IDENTIFIER | VAL CS: VAL | VAR CS: VAR call_statement -> CALL named_item ; CS: CALL case_list -> DEFAULT !discard_target : statement !exit_next_case CS: DEFAULT | NUMBER !emit_case_compare : statement !emit_next_case case_list CS: NUMBER case_statement -> CASE !emit_case_a ( expression !check_type ) OF case_list !emit_case_b CS: CASE comparison -> !return_type CS: DO IF DOWNTO ] FOR BREAK DISPOSE READ END ; CASE UPTO READLN DEFAULT WRITELN ELSE (if WHILE NUMBER CALL WRITE GOTO UNTIL IDENTIFIER ) RETURN NEXT REPEAT | compop !save_op simple_expression !save_type !resolve_types !emit_comparison !return_type CS: >= = <> > < <= compop -> = CS: = | <> CS: <> | > CS: > | >= CS: >= | < CS: < | <= CS: <= compound_statement -> DO !emit_do_a statement_list END !emit_do_b ; CS: DO const_declarations -> CS: VARIABLES BEGIN PROCEDURES TYPES | CONSTANTS const_list CS: CONSTANTS const_list -> IDENTIFIER !check_duplicate : literal ; !insert_const_entry more_const_list CS: IDENTIFIER declaration_type -> array_type CS: ARRAY | record_type CS: RECORD declared_type -> atomic_type CS: atomic_type | IDENTIFIER !check_declared CS: IDENTIFIER | ^ declared_type CS: ^ direction -> UPTO CS: UPTO | DOWNTO CS: DOWNTO dispose_request -> DISPOSE named_item CS: DISPOSE else_clause -> CS: DO IF FOR BREAK DISPOSE READ END ; CASE READLN DEFAULT WRITELN ELSE WHILE NUMBER CALL WRITE GOTO UNTIL IDENTIFIER RETURN NEXT REPEAT | ELSE statement CS: ELSE empty_statement -> !emit_empty ; CS: ; executable_statement -> empty_statement CS: ; | read_statement CS: READ READLN | write_statement CS: WRITELN WRITE | assignment_statement CS: IDENTIFIER | goto_statement CS: GOTO | compound_statement CS: DO | if_statement CS: IF | while_statement CS: WHILE | repeat_statement CS: REPEAT | case_statement CS: CASE | for_statement CS: FOR | next_statement CS: NEXT | break_statement CS: BREAK | call_statement CS: CALL | return_statement CS: RETURN | dispose_request CS: DISPOSE expression -> simple_expression !save_type comparison !return_type CS: - NOT + const ( IDENTIFIER & factor -> const !save_type !return_type CS: const | named_item !emit_rvalue !return_type CS: IDENTIFIER | ( expression !save_type ) !return_type CS: ( | NOT factor !save_type !emit_not !return_type CS: NOT | & named_item !save_type !return_type CS: & final -> expression CS: - NOT + const ( IDENTIFIER & fld_list -> IDENTIFIER !check_duplicate : declared_type ; !insert_field_descriptor more_fld_list CS: IDENTIFIER for_statement -> FOR !emit_for_a IDENTIFIER !check_type := initial direction final !emit_for_setup !emit_for_test statement !emit_for_increment CS: FOR formal_argument -> call_by IDENTIFIER : defined_type !save_formal_argument CS: VAR VAL IDENTIFIER formal_arguments -> CS: ) | formal_argument more_formal_arguments CS: VAR VAL IDENTIFIER global_declarations -> !initialize_global_symbol_table const_declarations type_declarations var_declarations proc_declarations CS: VARIABLES BEGIN CONSTANTS PROCEDURES TYPES goto_statement -> GOTO label !check_label !emit_goto ; CS: GOTO if_statement -> IF !emit_if_a ( expression !check_type ) !emit_test_a then_clause !emit_test_b else_clause !emit_test_c !emit_if_b CS: IF initial -> expression CS: - NOT + const ( IDENTIFIER & kize_program -> PROGRAM IDENTIFIER !save_ident global_declarations BEGIN !emit_program_prologue procedure_list END !emit_program epilogue CS: PROGRAM label -> NUMBER CS: NUMBER label_declarations -> CS: VARIABLES BEGIN | LABELS label_list CS: LABELS label_list -> label !check_duplicate ; !insert_label_entry more_label_list CS: NUMBER literal -> NUMBER CS: NUMBER | DECIMAL CS: DECIMAL | ASTRING CS: ASTRING | NULL CS: NULL local_declarations -> !initialize_local_symbol_table label_declarations var_declarations !save_local_storage CS: VARIABLES LABELS BEGIN more_actual_arguments -> CS: ) | , actual_arguments CS: , more_const_list -> CS: VARIABLES BEGIN PROCEDURES TYPES | const_list CS: IDENTIFIER more_factors -> !return_type CS: >= DO IF DOWNTO - = ] AND FOR BREAK DISPOSE * OR <> READ END > + ; CASE UPTO READLN DEFAULT WRITELN ELSE % (if WHILE NUMBER / CALL WRITE < GOTO UNTIL IDENTIFIER ) RETURN <= NEXT REPEAT | mulop !save_op !not_and factor !save_type !resolve_types !emit_mulop more_factors_a CS: AND * % / | mulop !save_op !is_and !check_type !emit_and_a factor !save_type !check_type !emit_and_b more_factors CS: AND * % / more_fld_list -> CS: END | fld_list CS: IDENTIFIER more_formal_arguments -> CS: ) | , formal_arguments CS: , more_label_list -> CS: VARIABLES BEGIN | label_list CS: NUMBER more_proc_list -> CS: BEGIN | proc_list CS: IDENTIFIER more_procedure_list -> CS: END | procedure_list CS: PROCEDURE more_terms -> !return_type CS: >= DO IF DOWNTO = ] FOR BREAK DISPOSE <> READ END > ; CASE UPTO READLN DEFAULT WRITELN ELSE (if WHILE NUMBER CALL WRITE < GOTO UNTIL IDENTIFIER ) RETURN <= NEXT REPEAT | addop !save_op !check_or term !save_type !resolve_types !emit_mulop more_factors CS: - OR + | addop !save_op !is_or !check_type !emit_or_a term !save_type !check_type !emit_or_b more_terms CS: - OR + more_type_list -> CS: VARIABLES BEGIN PROCEDURES | type_list CS: IDENTIFIER more_var_list -> CS: BEGIN PROCEDURES | var_list CS: IDENTIFIER mulop -> * CS: * | / CS: / | % CS: % | AND CS: AND named_item -> IDENTIFIER !save_ident !retrieve_info qualifier !result_type CS: IDENTIFIER new_request -> NEW defined_type CS: NEW next_statement -> NEXT ; !get_next !go_there CS: NEXT opt_label -> CS: DO IF FOR BREAK DISPOSE READ ; CASE READLN WRITELN WHILE CALL WRITE GOTO IDENTIFIER RETURN NEXT REPEAT | label !check_label !emit_label CS: NUMBER opt_value -> CS: ; | expression CS: - NOT + const ( IDENTIFIER & pointer_qualifier -> ^ structure_qualifier CS: ^ proc_declarations -> CS: BEGIN | PROCEDURES proc_list CS: PROCEDURES proc_list -> proc_signature more_proc_list CS: IDENTIFIER proc_signature -> IDENTIFIER !check_duplicate ( formal_arguments ) return_type ; !insert_proc_entry CS: IDENTIFIER procedure -> PROCEDURE IDENTIFIER !save_ident !check_declared local_declarations BEGIN !emit_procedure_prologue statement_list END !emit_procedure_epilogue CS: PROCEDURE procedure_list -> procedure more_procedure_list CS: PROCEDURE procedure_qualifier -> ( actual_arguments ) CS: ( qualifier -> structure_qualifier !return_result_type CS: >= DO IF DOWNTO - = ] AND FOR BREAK DISPOSE * OR <> READ END . > ^ + ; [ CASE UPTO READLN DEFAULT WRITELN ELSE % (if WHILE NUMBER / CALL WRITE < := GOTO UNTIL IDENTIFIER more_factors_a ) RETURN <= NEXT REPEAT | procedure_qualifier !return_result_type CS: ( read_statement -> READ ( actual_arguments ) ; CS: READ | READLN ( actual_arguments ) ; CS: READLN record_qualifier -> !check_record !save_SAR . IDENTIFIER !calc_record_offset structure_qualifier !return_type CS: . record_type -> RECORD fld_list END CS: RECORD repeat_statement -> REPEAT !emit_repeat_a statement_list UNTIL ( expression !check_type ) !emit_test_a !break !emit_test_b !nop !emit_test_c !top !emit_repeat_b ; CS: REPEAT return_statement -> RETURN opt_value ; CS: RETURN return_type -> CS: ; | : atomic_type !check_type CS: : sign -> !return_sign CS: NOT const ( IDENTIFIER & | + !return_sign CS: + | - !return_sign CS: - simple_expression -> sign !save_sign term !save_type !emit_neg more_terms !save_type !return_type CS: - NOT + const ( IDENTIFIER & statement -> opt_label executable_statement CS: DO IF FOR BREAK DISPOSE READ ; CASE READLN WRITELN WHILE NUMBER CALL WRITE GOTO IDENTIFIER RETURN NEXT REPEAT statement_list -> CS: END UNTIL | statement statement_list CS: DO IF FOR BREAK DISPOSE READ ; CASE READLN WRITELN WHILE NUMBER CALL WRITE GOTO IDENTIFIER RETURN NEXT REPEAT structure_qualifier -> !return_data_type CS: >= DO IF DOWNTO - = ] AND FOR BREAK DISPOSE * OR <> READ END > + ; CASE UPTO READLN DEFAULT WRITELN ELSE % (if WHILE NUMBER / CALL WRITE < := GOTO UNTIL IDENTIFIER more_factors_a ) RETURN <= NEXT REPEAT | array_qualifier !return_data_type CS: [ | record_qualifier !return_data_type CS: . | pointer_qualifier !return_data_type CS: ^ term -> factor !save_type more_factors !save_type !return_result CS: NOT const ( IDENTIFIER & then_clause -> THEN statement CS: THEN two_options -> expression !return_type CS: - NOT + const ( IDENTIFIER & | new_request !return_type CS: NEW type_declarations -> CS: VARIABLES BEGIN PROCEDURES | TYPES type_list CS: TYPES type_list -> IDENTIFIER !check_duplicate : declaration_type ; !insert_type_entry more_type_list CS: IDENTIFIER ub -> NUMBER CS: NUMBER | IDENTIFIER !check_int_constant CS: IDENTIFIER var_declarations -> CS: BEGIN PROCEDURES | VARIABLES var_list CS: VARIABLES var_list -> IDENTIFIER !check_duplicate : declared_type ; !insert_variable_entry !insert_static_memory_entry more_var_list CS: IDENTIFIER while_statement -> WHILE !emit_while_a ( expression !check_type ) !emit_test_a statement !emit_test_b !break !emit_test_c !next !emit_while_b CS: WHILE write_statement -> WRITE ( actual_arguments ) ; CS: WRITE | WRITELN ( actual_arguments ) ; CS: WRITELN end: