! ! MODULE prs3 ( ! %IF %BLISS (BLISS32) %THEN ADDRESSING_MODE (EXTERNAL = LONG_RELATIVE, ! NONEXTERNAL = LONG_RELATIVE) , %FI IDENT = '6.3-6' ) = BEGIN !++ ! Facility: BLISS Formatter ! ! Abstract: ! ! This module formats BLISS expressions, of which there ! are two varieties: control expressions and operator ! expressions. 'prs$expression' is the main entry point ! to this module. 'prs$oper' formats operator expressions. ! ! Environment: transportable, with Xport ! ! ! REVISION HISTORY ! ! 15-Sep-81 TT Permit attribute on routine formal parameters ! ! 4-Nov-81 TT Remove special case code in PRS$PAREN_ELIST ! that involved routine formals list. This is now ! handled by DO_ROUTINE_FORMALS in PARSE2. ! ! END OF REVISION HISTORY !-- ! ! ! Table of contents: !-- FORWARD ROUTINE do_case : NOVALUE, do_codecom : NOVALUE, do_count_loop : NOVALUE, do_exit : NOVALUE, do_if : NOVALUE, do_post_loop : NOVALUE, do_pre_loop : NOVALUE, do_primary : NOVALUE, do_select : NOVALUE, do_set : NOVALUE, prs$expression : NOVALUE, prs$oper : NOVALUE, prs$paren_elist : NOVALUE; ! ! Include files: !-- REQUIRE 'BLFCSW'; ! Defines control switches 'sw_...' REQUIRE 'BLFMAC'; ! Defines macros 'lex', 'msg', 'write' REQUIRE 'SYMCOD'; ! Defines symbol property table, 'sym...' REQUIRE 'TOKTYP'; ! Defines 'token' and the token type values 's_...' REQUIRE 'UTLCOD'; ! Defines error codes, i.e. 'er_...' ! ! Macros: !-- ! ! Equated symbols: !-- LITERAL true = 1 EQL 1, false = 1 NEQ 1; ! ! Own storage: !-- ! ! External references: !-- EXTERNAL ROUTINE ctl$switch, lex$getsym : NOVALUE, out$break : NOVALUE, out$cut, out$default : NOVALUE, out$erase : NOVALUE, out$force : NOVALUE, out$indent : NOVALUE, out$mark : NOVALUE, out$ntbreak : NOVALUE, out$pend_skip : NOVALUE, out$pop_marks : NOVALUE, out$push_marks : NOVALUE, out$skip : NOVALUE, out$space : NOVALUE, out$stoks : NOVALUE, out$tok : NOVALUE, do_attr_list: novalue, prs$block : NOVALUE, ! Parse1 prs$plit_body : NOVALUE, ! Parse1 scn$plit : NOVALUE, utl$error : NOVALUE; EXTERNAL tok, token : tok_block, nolabl, ! True if labelled blocks not allowed symprop : sym_table; ROUTINE do_case (block_context) : NOVALUE = ! !++ ! Functional description: ! ! This routine formats a CASE expression ! ! Formal parameters: ! ! None ! ! Implicit inputs: ! ! None ! ! Implicit outputs: ! ! None ! ! Routine value: ! ! None ! ! Side effects: ! ! None ! !-- BEGIN out$tok (); ! " CASE " out$space (1); lex; prs$expression (.block_context); IF .tok EQL s_from THEN BEGIN out$stoks (); ! " FROM " lex; prs$expression (.block_context); IF .tok EQL s_to THEN BEGIN out$stoks (); ! " TO " lex; prs$expression (.block_context); ! Limit expression IF .tok EQL s_of THEN (out$stoks (); out$force (); lex; ) ! "OF" ELSE utl$error (er_of); IF .tok EQL s_set THEN BEGIN out$indent (1); do_set (.block_context); END ELSE utl$error (er_set); !"SET..TES" missing. IF .tok EQL s_tes THEN BEGIN out$break (); out$tok (); ! Output the "TES" out$indent (-1); lex; END ELSE utl$error (er_tes); END; END ELSE utl$error (er_from); END; ! End of routine 'do_case' ROUTINE do_codecom (block_context) : NOVALUE = ! !++ ! Functional description: ! ! This routine formats a CODECOMMENT ! ! Formal parameters: ! ! None ! ! Implicit inputs: ! ! None ! ! Implicit outputs: ! ! None ! ! Routine value: ! ! None ! ! Side effects: ! ! None ! !-- BEGIN out$break (); out$tok (); ! "CODECOMMENT" lex; WHILE .tok NEQ s_end_of_file DO BEGIN IF .tok EQL s_string THEN BEGIN out$break (); out$tok (); ! String specified lex; END ELSE utl$error (er_string); IF .tok EQL s_comma THEN BEGIN out$erase (); out$tok (); ! "," lex; END ELSE BEGIN IF .tok EQL s_colon THEN BEGIN out$stoks (); ! " : " lex; END ELSE utl$error (er_colon); EXITLOOP; END; END; IF .tok EQL s_begin OR .tok EQL s_lparen THEN prs$block () ELSE utl$error (er_block_start); END; ! End of routine 'do_codecomment' ROUTINE do_count_loop (block_context) : NOVALUE = ! !++ ! Functional description: ! ! This routine formats INCR and DECR loops ! ! Formal parameters: ! ! None ! ! Implicit inputs: ! ! None ! ! Implicit outputs: ! ! None ! ! Routine value: ! ! None ! ! Side effects: ! ! None ! !-- BEGIN out$tok (); ! " INCR " or " DECR " out$space (1); lex; out$indent (1); ! Prepare for following lines IF .tok EQL s_name THEN BEGIN out$tok (); ! Name of index variable lex; END ELSE utl$error (er_name); WHILE .tok EQL s_from ! OR .tok EQL s_to ! OR .tok EQL s_by DO BEGIN out$stoks (); ! " FROM ", " TO ", or " BY " lex; prs$expression (.block_context); END; IF .tok EQL s_do THEN BEGIN out$stoks (); ! " DO " appears on the same line (IF .block_context NEQ s_lparen THEN out$force ()); lex; END ELSE utl$error (er_do); out$indent (-1); prs$expression (.block_context); ! Parse the action expression. END; ! End of routine 'do_count_loop' ROUTINE do_exit (block_context) : NOVALUE = ! !++ ! Functional description: ! ! This routine formats LEAVE, RETURN, and EXITLOOP expressions ! ! Formal parameters: ! ! None ! ! Implicit inputs: ! ! None ! ! Implicit outputs: ! ! None ! ! Routine value: ! ! None ! ! Side effects: ! ! None ! !-- BEGIN IF .tok EQL s_leave THEN BEGIN out$tok (); ! " LEAVE " out$space (1); lex; out$tok (); !