with TEXT_IO; use TEXT_IO; with INTEGER_TEXT_IO; use INTEGER_TEXT_IO; with UATL_BUILDER_DATA; use UATL_BUILDER_DATA; with UATL_PROCEDURE_BUILDER_DATA; use UATL_PROCEDURE_BUILDER_DATA; with UATL_INTERACTIVE_IO; use UATL_INTERACTIVE_IO; with TEST_MANAGER_SCREEN_DISPLAY; use TEST_MANAGER_SCREEN_DISPLAY; package body UATL_ADA_BUILDER is type YES_NO is (Y,N); procedure GET is new GET_ENUMERATED(YES_NO); Y_N : YES_NO; CASES_IP : NATURAL := 0; IFS_IP : NATURAL := 0; LOOPS_IP : NATURAL := 0; MENU_CAS : LIST(1..11) := (new STRING'("Free Form Ada/Text Insertion"), new STRING'("Display Structures in Progress"), new STRING'("Make an ASSIGNMENT Statement"), new STRING'("Make an IF Statement"), new STRING'("Make a CASE Statement"), new STRING'("Make a LOOP Structure"), new STRING'("Declare a Variable"), new STRING'("Call a Procedure"), new STRING'("Write a NULL"), new STRING'("Write a Comment Line"), new STRING'("Exit")); MENU_IF : LIST(1..4) := (new STRING'("Make the IF-THEN Part"), new STRING'("Make an ELSE Part"), new STRING'("End the IF"), new STRING'("Exit")); MENU_CASE : LIST(1..5) := (new STRING'("Make the CASE Part"), new STRING'("Make a WHEN Leg"), new STRING'("Make a WHEN OTHERS Leg"), new STRING'("End the CASE"), new STRING'("Exit")); MENU_LOOP : LIST(1..6) := (new STRING'("Start a Loop"), new STRING'("Start a FOR Loop"), new STRING'("Start a WHILE Loop"), new STRING'("Make an Exit"), new STRING'("End the Loop"), new STRING'("Exit")); procedure GET is new GET_INTEGER(NATURAL); procedure PUTI is new PUT_INTEGER(NATURAL); procedure CREATE_ADA_STRUCTURES is INP_LINE : STRING(1..80); END_INP : NATURAL; CHOICE : NATURAL; begin loop CHOICE := DISPLAY_MENU_AND_GET_SELECTION( "ADA LANGUAGE STRUCTURES",MENU_CAS); -- Case on selection made case CHOICE is when 1 => CLEAR_SCREEN; PUT_STRING(4,1," ******** Free Form Insertion *******"); NEW_LINE(3); loop GET_LINE(INP_LINE,END_INP); exit when INP_LINE(1) = '/'; PUT_LINE(TEST_FILE,NESTING(NEST).all & FIRST_INDENT & INP_LINE(1..END_INP)); end loop; when 2 => CLEAR_SCREEN; PUT_STRING(4,1," ******** Structures in Progress *******"); NEW_LINE(3); PUTI(" Current IF statements open: ",IFS_IP); NEW_LINE(2); PUTI(" Current CASE statements open: ",CASES_IP); NEW_LINE(2); PUTI(" Current LOOP structures open: ",LOOPS_IP); NEW_LINE(3); GET(" Continue?: ",Y_N); when 3 => CLEAR_SCREEN; PUT_STRING(4,1," ******** Assignment Statement *******"); NEW_LINE; PUT(" Enter target variable: "); GET_LINE(INP_LINE,END_INP); NEW_LINE; PUT(TEST_FILE,NESTING(NEST).all & FIRST_INDENT & INP_LINE(1..END_INP) & ASSIGNMENT); PUT_LINE(" Enter assignment source => "); NEW_LINE; PUT(THIRD_INDENT & INP_LINE(1..END_INP) & ASSIGNMENT & ONE_SPACE); GET_LINE(INP_LINE,END_INP); NEW_LINE; if INP_LINE(END_INP) = ';' then END_INP := END_INP - 1; end if; PUT_LINE(TEST_FILE,ONE_SPACE & INP_LINE(1..END_INP) & SEMICOLON); when 4 => CHOICE := DISPLAY_MENU_AND_GET_SELECTION( "MAKE AN IF STATEMENT",MENU_IF); case CHOICE is when 1 => NEW_LINE(TEST_FILE); IFS_IP := IFS_IP + 1; NEST := NEST + 1; CLEAR_SCREEN; PUT_STRING(4,1," ******** IF Statement *******"); NEW_LINE; PUT_LINE(" if {IF PART} "); PUT_LINE(" then "); PUT_LINE(" [else {ELSE PART}] "); PUT_LINE(" end if; "); NEW_LINE(2); PUT_LINE(START_IF); PUT_LINE(TEST_FILE,NESTING(NEST-1).all & START_IF); loop PUT(SECOND_INDENT); GET_LINE(INP_LINE,END_INP); exit when INP_LINE(1) = '/'; PUT_LINE(TEST_FILE,NESTING(NEST-1).all & SECOND_INDENT & INP_LINE(1..END_INP)); end loop; PUT_LINE(IF_THEN); PUT_LINE(TEST_FILE,NESTING(NEST-1).all & IF_THEN); when 2 => PUT_LINE(TEST_FILE,NESTING(NEST-1).all & ELSE_PART); when 3 => if IFS_IP > 0 then IFS_IP := IFS_IP - 1; end if; PUT_LINE(TEST_FILE,NESTING(NEST-1).all & END_IF); NEST := NEST - 1; when 4 => null; when others => null; end case; when 5 => CHOICE := DISPLAY_MENU_AND_GET_SELECTION( "MAKE A CASE STATEMENT",MENU_CASE); case CHOICE is when 1 => NEW_LINE(TEST_FILE); CASES_IP := CASES_IP + 1; NEST := NEST + 2; CLEAR_SCREEN; PUT_STRING(4,1," ******** CASE Statement *******"); NEW_LINE; PUT_LINE(" case {CASE_VARIABLE} is" ); PUT_LINE(" when {VALUE} => " ); PUT_LINE(" {VALUE_OPERATION};" ); PUT_LINE(" when others => "); PUT_LINE(" {OTHERS_OPERATION};" ); PUT_LINE(" end case; "); NEW_LINE; PUT(START_CASE); GET_LINE(INP_LINE,END_INP); PUT_LINE(TEST_FILE,NESTING(NEST-2).all & START_CASE & INP_LINE(1..END_INP) & IS_WORD); CLEAR_SCREEN; PUT_STRING(4,1," ******** CASE WHEN Leg *******"); NEW_LINE; PUT_LINE(" when {VALUE} => " ); PUT_LINE(" {VALUE_OPERATION};" ); NEW_LINE(2); PUT(WHEN_LEGS); GET_LINE(INP_LINE,END_INP); PUT_LINE(TEST_FILE,NESTING(NEST-2).all & WHEN_LEGS & INP_LINE(1..END_INP) & ONE_SPACE & EQUAL_ARROW); when 2 => CLEAR_SCREEN; PUT_STRING(4,1," ******** CASE WHEN Leg *******"); NEW_LINE; PUT_LINE(" when {VALUE} => " ); PUT_LINE(" {VALUE_OPERATION};" ); NEW_LINE(2); PUT(WHEN_LEGS); GET_LINE(INP_LINE,END_INP); PUT_LINE(TEST_FILE,NESTING(NEST-2).all & WHEN_LEGS & INP_LINE(1..END_INP) & ONE_SPACE & EQUAL_ARROW); when 3 => PUT_LINE(TEST_FILE,NESTING(NEST-2).all & WHEN_OTHERS); when 4 => if CASES_IP > 0 then CASES_IP := CASES_IP - 1; end if; PUT_LINE(TEST_FILE,NESTING(NEST-2).all & END_CASE); NEST := NEST - 2; when others => null; end case; when 6 => CHOICE := DISPLAY_MENU_AND_GET_SELECTION( "MAKE A LOOP STRUCTURE",MENU_LOOP); case CHOICE is when 1 => NEW_LINE(TEST_FILE); LOOPS_IP := LOOPS_IP + 1; NEST := NEST + 1; PUT_LINE(TEST_FILE,NESTING(NEST-1).all & PLAIN_LOOP); when 2 => NEW_LINE(TEST_FILE); NEST := NEST + 1; LOOPS_IP := LOOPS_IP + 1; CLEAR_SCREEN; PUT_STRING(4,1," ******** FOR Loop *******"); NEW_LINE(3); PUT(" Enter the FOR index name: "); GET_LINE(INP_LINE,END_INP); PUT(TEST_FILE,NESTING(NEST-1).all & FOR_LOOP); PUT(TEST_FILE,ONE_SPACE & INP_LINE(1..END_INP) & ONE_SPACE & IN_WORD & ONE_SPACE); NEW_LINE; PUT(" Enter the lower index range: "); GET_LINE(INP_LINE,END_INP); PUT(TEST_FILE,INP_LINE(1..END_INP)); NEW_LINE; PUT(" Enter the upper index range: "); GET_LINE(INP_LINE,END_INP); if INP_LINE(1) /= '/' then PUT(TEST_FILE,DOT_DOT & INP_LINE(1..END_INP)); end if; PUT_LINE(TEST_FILE,ONE_SPACE & LOOP_ITSELF); when 3 => NEW_LINE(TEST_FILE); NEST := NEST + 1; LOOPS_IP := LOOPS_IP + 1; CLEAR_SCREEN; PUT_STRING(4,1," ******** WHILE Loop *******"); NEW_LINE(3); PUT_LINE("Enter the WHILE condition => "); NEW_LINE(2); PUT_LINE(WHILE_LOOP); PUT_LINE(TEST_FILE,NESTING(NEST-1).all & WHILE_LOOP); loop PUT(SECOND_INDENT); GET_LINE(INP_LINE,END_INP); exit when INP_LINE(1) = '/'; if INP_LINE(END_INP) = ';' then END_INP := END_INP - 1; end if; PUT_LINE(TEST_FILE,NESTING(NEST).all & FIRST_INDENT & INP_LINE(1..END_INP)); end loop; PUT_LINE(PLAIN_LOOP); PUT_LINE(TEST_FILE,NESTING(NEST-1).all & PLAIN_LOOP); when 4 => PUT(TEST_FILE,NESTING(NEST-1).all & LEAVE_LOOP); CLEAR_SCREEN; PUT_STRING(4,1," ******** Exit the Loop *******"); NEW_LINE(3); PUT_LINE(" Enter the WHEN condition => "); NEW_LINE(2); PUT_LINE(FIRST_INDENT & WHEN_WORD); PUT(SECOND_INDENT); GET_LINE(INP_LINE,END_INP); if INP_LINE(1) /= '/' then if INP_LINE(END_INP) = ';' then END_INP := END_INP - 1; end if; PUT(TEST_FILE,ONE_SPACE & WHEN_WORD & ONE_SPACE & INP_LINE(1..END_INP)); loop PUT(SECOND_INDENT); GET_LINE(INP_LINE,END_INP); exit when INP_LINE(1) = '/'; if INP_LINE(END_INP) = ';' then END_INP := END_INP - 1; end if; NEW_LINE(TEST_FILE); PUT(TEST_FILE,NESTING(NEST).all & FIRST_INDENT & INP_LINE(1..END_INP)); end loop; end if; PUT_LINE(TEST_FILE,SEMICOLON); when 5 => PUT_LINE(TEST_FILE,NESTING(NEST-1).all & FINI_LOOP); NEST := NEST - 1; if LOOPS_IP > 0 then LOOPS_IP := LOOPS_IP - 1; end if; when others => null; end case; when 7 => CLEAR_SCREEN; PUT_STRING(4,1," ******** Variable Declaration *******"); NEW_LINE; PUT(" Enter variable name: "); GET_LINE(INP_LINE,END_INP); PUT(DECL_FILE,FIRST_INDENT & INP_LINE(1..END_INP) & COLON); NEW_LINE; PUT_LINE(" Enter variable type => "); NEW_LINE; PUT(FIRST_INDENT & INP_LINE(1..END_INP) & COLON); GET_LINE(INP_LINE,END_INP); if INP_LINE(END_INP) = ';' then END_INP := END_INP - 1; end if; PUT_LINE(DECL_FILE,INP_LINE(1..END_INP) & SEMICOLON); when 8 => CLEAR_SCREEN; PUT_STRING(4,1," ******** Procedure Call *******"); NEW_LINE; PUT(" Enter procedure to be called: "); GET_LINE(INP_LINE,END_INP); if INP_LINE(END_INP) = ';' then END_INP := END_INP - 1; end if; PUT_LINE(TEST_FILE,NESTING(NEST).all & FIRST_INDENT & INP_LINE(1..END_INP) & SEMICOLON); when 9 => PUT_LINE(TEST_FILE,NESTING(NEST).all & NULL_LINE); when 10 => CLEAR_SCREEN; PUT_STRING(4,1," ******** Comment Line *******"); NEW_LINE; PUT_LINE(" Enter comment => "); NEW_LINE; PUT(COMMENT_LINE); GET_LINE(INP_LINE,END_INP); PUT_LINE(TEST_FILE,NESTING(NEST).all & COMMENT_LINE & INP_LINE(1..END_INP)); when 11 => exit; when others => null; end case; end loop; end CREATE_ADA_STRUCTURES; end UATL_ADA_BUILDER;