/*************************************************************** SKELETON.C This file containts OUTPUT SKELETON routine of ZUBR. PART OF : ZUBR - Parsers generator for multiple syntax language compilers . COMPILE : . NOTE : NONE . Copyright (C) 1995 - 2026 by Andrey V.Kosteltsev. All Rights Reserved. ***************************************************************/ /* This file contant RUSSIAN letters( code-page: UTF-8 ) ***************************************************************/ #include #ifndef __NO_COMPILE void write_parse_name_definition( void ) { register mpu_FILE *fp; register __mpu_char16_t *s; fp = code_file; if( sflag ) s = (__mpu_char16_t *)MPU_UCS2( "static " ); else s = (__mpu_char16_t *)MPU_UCS2( "" ); outline += 3; if( !p_name_flag ) { if( bflag ) mpu_fprintf( fp, MPU_UCS2( "\n%sint %szubr_parse( void )\n{\n" ), s, name_prefix ); else mpu_fprintf( fp, MPU_UCS2( "\n%sint zubr_parse( void )\n{\n" ), s ); } else mpu_fprintf( fp, MPU_UCS2( "int %s( void )\n{\n" ), parse_func_name ); } void write_parse_name_declaration( void ) { register mpu_FILE *fp; register __mpu_char16_t *s; fp = code_file; if( sflag ) s = (__mpu_char16_t *)MPU_UCS2( "static " ); else s = (__mpu_char16_t *)MPU_UCS2( "" ); outline += 3; if( !p_name_flag ) { if( bflag ) mpu_fprintf( fp, MPU_UCS2( "\n%sint %szubr_parse( void );\n\n" ), s, name_prefix ); else mpu_fprintf( fp, MPU_UCS2( "\n%sint zubr_parse( void );\n\n" ), s ); } else mpu_fprintf( fp, MPU_UCS2( "\nint %s( void );\n\n" ), parse_func_name ); } void write_extern_tables( void ) /*************************************************************** Description : write section 'tables' into code file Concepts : Use Global Variable: mpu_FILE *code_file | main.c Use Functions : Parameters : [void] Return : [void] ***************************************************************/ { register mpu_FILE *fp; register __mpu_char16_t *prefL, *prefU; __mpu_char16_t *_char_type = (__mpu_char16_t *)MPU_UCS2( "__mpu_char16_t" ); fp = code_file; if( bflag ) { prefL = name_prefix; prefU = name_prefix_upper; } else { prefL = (__mpu_char16_t *)MPU_UCS2( "" ); prefU = (__mpu_char16_t *)MPU_UCS2( "" ); } outline += 14; /* number of lines in tables section */ mpu_fprintf( fp, MPU_UCS2( "extern int %szubr_lhs[];\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( "extern int %szubr_len[];\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( "extern int %szubr_defred[];\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( "extern int %szubr_dgoto[];\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( "extern int %szubr_sindex[];\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( "extern int %szubr_rindex[];\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( "extern int %szubr_gindex[];\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( "extern int %szubr_table[];\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( "extern int %szubr_check[];\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( "#if %sZUBR_DEBUG\n" ), prefU ); mpu_fprintf( fp, MPU_UCS2( "extern %s *%szubr_name[];\n" ),_char_type, prefL ); mpu_fprintf( fp, MPU_UCS2( "extern %s *%szubr_rule[];\n" ),_char_type, prefL ); mpu_fprintf( fp, MPU_UCS2( "#endif\n\n" ) ); } /******* End of write_extern_tables( void ) ****************/ void write_header( void ) /*************************************************************** Description : write section 'header' into code file Concepts : Use Global Variable: mpu_FILE *code_file | main.c Use Functions : Parameters : [void] Return : [void] ***************************************************************/ { register mpu_FILE *fp; register __mpu_char16_t *prefL, *prefU; fp = code_file; if( bflag ) { prefL = name_prefix; prefU = name_prefix_upper; } else { prefL = (__mpu_char16_t *)MPU_UCS2( "" ); prefU = (__mpu_char16_t *)MPU_UCS2( "" ); } outline += 15; /* number of lines in header section */ mpu_fprintf( fp, MPU_UCS2( "#define %szubr_clearin (%szubr_char=(-1))\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( "#define %szubr_errok (%szubr_errflag=0)\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( "#ifdef %sZUBR_STACKSIZE\n" ), prefU ); mpu_fprintf( fp, MPU_UCS2( "#ifndef %sZUBR_MAXDEPTH\n" ), prefU ); mpu_fprintf( fp, MPU_UCS2( "#define %sZUBR_MAXDEPTH %sZUBR_STACKSIZE\n" ), prefU, prefU ); mpu_fprintf( fp, MPU_UCS2( "#endif\n" ) ); mpu_fprintf( fp, MPU_UCS2( "#else\n" ) ); mpu_fprintf( fp, MPU_UCS2( "#ifdef %sZUBR_MAXDEPTH\n" ), prefU ); mpu_fprintf( fp, MPU_UCS2( "#define %sZUBR_STACKSIZE %sZUBR_MAXDEPTH\n" ), prefU, prefU ); mpu_fprintf( fp, MPU_UCS2( "#else\n" ) ); mpu_fprintf( fp, MPU_UCS2( "#define %sZUBR_STACKSIZE 500\n" ), prefU ); mpu_fprintf( fp, MPU_UCS2( "#define %sZUBR_MAXDEPTH 500\n" ), prefU ); mpu_fprintf( fp, MPU_UCS2( "#endif\n" ) ); mpu_fprintf( fp, MPU_UCS2( "#endif\n\n" ) ); } /******* End of write_header( void ) ***********************/ void write_header_definitions( void ) /*************************************************************** Description : write section 'header_definitions' or 'header_static_definitions' into code file Concepts : Use Global Variable: mpu_FILE *code_file | main.c Use Functions : Parameters : [void] Return : [void] ***************************************************************/ { register mpu_FILE *fp; register __mpu_char16_t *s, *prefL, *prefU; fp = code_file; if( sflag ) s = (__mpu_char16_t *)MPU_UCS2( "static " ); else s = (__mpu_char16_t *)MPU_UCS2( "" ); if( bflag ) { prefL = name_prefix; prefU = name_prefix_upper; } else { prefL = (__mpu_char16_t *)MPU_UCS2( "" ); prefU = (__mpu_char16_t *)MPU_UCS2( "" ); } outline += 18; /* number of lines in header defs section */ mpu_fprintf( fp, MPU_UCS2( "#if %sZUBR_DEBUG\n" ), prefU ); mpu_fprintf( fp, MPU_UCS2( "%sint %szubr_debug;\n" ), s, prefL ); mpu_fprintf( fp, MPU_UCS2( "#endif\n" ) ); mpu_fprintf( fp, MPU_UCS2( "%sint %szubr_nerrs;\n" ), s, prefL ); mpu_fprintf( fp, MPU_UCS2( "%sint %szubr_errflag;\n" ), s, prefL ); mpu_fprintf( fp, MPU_UCS2( "%sint %szubr_char;\n" ), s, prefL ); mpu_fprintf( fp, MPU_UCS2( "%sint *%szubr_ssp;\n\n" ), s, prefL ); mpu_fprintf( fp, MPU_UCS2( "%s%sZUBR_STYPE *%szubr_vsp;\n" ), s, prefU, prefL ); mpu_fprintf( fp, MPU_UCS2( "%s%sZUBR_STYPE %szubr_val;\n" ), s, prefU, prefL ); mpu_fprintf( fp, MPU_UCS2( "%s%sZUBR_STYPE %szubr_lval;\n\n" ), s, prefU, prefL ); mpu_fprintf( fp, MPU_UCS2( "%sint %szubr_ss[%sZUBR_STACKSIZE];\n\n" ), s, prefL, prefU ); mpu_fprintf( fp, MPU_UCS2( "%s%sZUBR_STYPE %szubr_vs[%sZUBR_STACKSIZE];\n\n" ), s, prefU, prefL, prefU ); mpu_fprintf( fp, MPU_UCS2( "#define %szubr_stacksize %sZUBR_STACKSIZE\n\n" ), prefL, prefU ); } /******* End of write_header_definitions( void ) ***********/ void write_begin_body( void ) /*************************************************************** Description : write section 'begin_body' into code file Concepts : Use Global Variable: mpu_FILE *code_file | main.c Use Functions : Parameters : [void] Return : [void] ***************************************************************/ { register mpu_FILE *fp; register __mpu_char16_t *prefL, *prefU; fp = code_file; if( bflag ) { prefL = name_prefix; prefU = name_prefix_upper; } else { prefL = (__mpu_char16_t *)MPU_UCS2( "" ); prefU = (__mpu_char16_t *)MPU_UCS2( "" ); } outline += 6; /* number of lines in begin_body section */ mpu_fprintf( fp, MPU_UCS2( "\n#define %sZUBR_ABORT goto %szubr_abort\n" ), prefU, prefL ); mpu_fprintf( fp, MPU_UCS2( "#define %sZUBR_ACCEPT goto %szubr_accept\n" ), prefU, prefL ); mpu_fprintf( fp, MPU_UCS2( "#define %sZUBR_NEWERROR goto %szubr_newerror\n" ), prefU, prefL ); mpu_fprintf( fp, MPU_UCS2( "#define %sZUBR_ERROR goto %szubr_errlab\n\n" ), prefU, prefL ); } /******* End of write_begin_body( void ) *******************/ /* The banner used here should be replaced with an #ident directive */ /* if the target C compiler supports #ident directives. */ /* */ /* If the skeleton is changed, the banner should be changed so that */ /* the altered version can easily be distinguished from the original. */ void write_banner( void ) /*************************************************************** Description : write section 'banner' into code file Concepts : Use Global Variable: mpu_FILE *code_file | main.c Use Functions : Parameters : [void] Return : [void] ***************************************************************/ { register mpu_FILE *fp; register __mpu_char16_t *s; __mpu_char16_t *_char_type = (__mpu_char16_t *)MPU_UCS2( "__mpu_char16_t" ); fp = code_file; if( bflag ) s = name_prefix; else s = (__mpu_char16_t *)MPU_UCS2( "" ); outline += 10; /* number of lines in banner section */ mpu_fprintf( fp, MPU_UCS2( "\n#include /* character classification used by lexer */\n" ) ); mpu_fprintf( fp, MPU_UCS2( "#include /* UCS-2 parser diagnostics */\n\n" ) ); mpu_fprintf( fp, MPU_UCS2( "#define %snot_defined_zubr_sccsid 1\n\n" ), s ); mpu_fprintf( fp, MPU_UCS2( "#define __ZUBR__ 1\n" ) ); mpu_fprintf( fp, MPU_UCS2( "#ifndef %snot_defined_zubr_sccsid\n" ), s ); mpu_fprintf( fp, MPU_UCS2( "\ static %s zubr_sccsid[] = MPU_UCS2(\"@(#)\ zubr %s Andrey V.Kosteltsev 19/09/26\");\n" ), _char_type, ZUBR_VERSION ); mpu_fprintf( fp, MPU_UCS2( "#endif\n" ) ); } /******* End of write_banner( void ) ***********************/ void write_end_body( void ) /*************************************************************** Description : write section 'end_body' into code file Concepts : Use Global Variable: mpu_FILE *code_file | main.c Use Functions : Parameters : [void] Return : [void] ***************************************************************/ { register mpu_FILE *fp; register __mpu_char16_t *prefL, *prefU, *lex; register __mpu_char16_t lex_mem_flag = 0; __mpu_char16_t *_char_type = (__mpu_char16_t *)MPU_UCS2( "__mpu_char16_t" ); __mpu_char16_t *_getenv_name = (__mpu_char16_t *)MPU_UCS2( "getenv" ); __mpu_char16_t *_printf_name = (__mpu_char16_t *)MPU_UCS2( "mpu_printf" ); fp = code_file; lex = (__mpu_char16_t *)0; if( bflag ) { prefL = name_prefix; prefU = name_prefix_upper; if( l_name_flag ) lex = lex_func_name; else { lex = (__mpu_char16_t *) MALLOC( (mpu_str16len( name_prefix ) + mpu_str16len( (__mpu_char16_t *)MPU_UCS2( "zubr_lex" ) ) + 1) * sizeof(__mpu_char16_t) ); if( lex == 0 ) no_space(); memset( lex, NUL, (mpu_str16len( name_prefix ) + mpu_str16len( (__mpu_char16_t *)MPU_UCS2( "zubr_lex" ) )+1) * sizeof(__mpu_char16_t) ); mpu_str16cpy( lex, name_prefix ); mpu_str16cat( lex, (__mpu_char16_t *)MPU_UCS2( "zubr_lex" ) ); lex_mem_flag = 1; } } else { prefL = (__mpu_char16_t *)MPU_UCS2( "" ); prefU = (__mpu_char16_t *)MPU_UCS2( "" ); if( l_name_flag ) lex = lex_func_name; else lex = (__mpu_char16_t *)MPU_UCS2( "zubr_lex" ); } outline += 134; /* number of lines in end_body section */ mpu_fprintf( fp, MPU_UCS2( " register int %szubr_m, %szubr_n, %szubr_state;\n" ), prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( "#if %sZUBR_DEBUG\n" ), prefU ); mpu_fprintf( fp, MPU_UCS2( " register %s *%szubr_s;\n" ), _char_type, prefL ); mpu_fprintf( fp, MPU_UCS2( " register char *%szubr_dd;\n\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " if( (%szubr_dd = %s(\"ZUBR_DEBUG\")) )\n" ), prefL, _getenv_name ); mpu_fprintf( fp, MPU_UCS2( " {\n" ) ); mpu_fprintf( fp, MPU_UCS2( " %szubr_n = *%szubr_dd;\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_n >= '0' && %szubr_n <= '9' ) %szubr_debug = %szubr_n - '0';\n" ), prefL, prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " }\n" ) ); mpu_fprintf( fp, MPU_UCS2( "#endif\n\n" ) ); mpu_fprintf( fp, MPU_UCS2( " %szubr_nerrs = 0;\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " %szubr_errflag = 0;\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " %szubr_char = (-1);\n\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " %szubr_ssp = %szubr_ss;\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " %szubr_vsp = %szubr_vs;\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " *%szubr_ssp = %szubr_state = 0;\n\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( "%szubr_loop:\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " if( (%szubr_n = %szubr_defred[%szubr_state]) ) goto %szubr_reduce;\n" ), prefL, prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_char < 0 )\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " {\n" ) ); mpu_fprintf( fp, MPU_UCS2( " if( (%szubr_char = %s()) < 0 ) %szubr_char = 0;\n" ), prefL, lex, prefL ); mpu_fprintf( fp, MPU_UCS2( "#if %sZUBR_DEBUG\n" ), prefU ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_debug )\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " {\n" ) ); mpu_fprintf( fp, MPU_UCS2( " %szubr_s = 0;\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_char <= %sZUBR_MAXTOKEN ) %szubr_s = %szubr_name[%szubr_char];\n" ), prefL, prefU, prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " if( !%szubr_s ) %szubr_s = MPU_UCS2(\"illegal-symbol\");\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " %s( MPU_UCS2(\"%szubr_debug: state %%d, reading %%d (%%s)\\n\"),\n" ), _printf_name, prefL ); mpu_fprintf( fp, MPU_UCS2( " %szubr_state, %szubr_char, %szubr_s );\n" ), prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " }\n" ) ); mpu_fprintf( fp, MPU_UCS2( "#endif\n" ) ); mpu_fprintf( fp, MPU_UCS2( " } /* End if( %szubr_char < 0 ) */\n\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " if( (%szubr_n = %szubr_sindex[%szubr_state]) && (%szubr_n += %szubr_char) >= 0 &&\n" ), prefL, prefL, prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " %szubr_n <= %sZUBR_TABLESIZE && %szubr_check[%szubr_n] == %szubr_char )\n" ), prefL, prefU, prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " {\n" ) ); mpu_fprintf( fp, MPU_UCS2( "#if %sZUBR_DEBUG\n" ), prefU ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_debug )\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " %s( MPU_UCS2(\"%szubr_debug: state %%d, shifting to state %%d\\n\"),\n" ), _printf_name, prefL ); mpu_fprintf( fp, MPU_UCS2( " %szubr_state, %szubr_table[%szubr_n] );\n" ), prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( "#endif\n" ) ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_ssp >= %szubr_ss + %szubr_stacksize - 1 )\n" ), prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " {\n" ) ); mpu_fprintf( fp, MPU_UCS2( " goto %szubr_overflow;\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " }\n" ) ); mpu_fprintf( fp, MPU_UCS2( " *++%szubr_ssp = %szubr_state = %szubr_table[%szubr_n];\n" ), prefL, prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " *++%szubr_vsp = %szubr_lval;\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " %szubr_char = (-1);\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_errflag > 0 ) --%szubr_errflag;\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " goto %szubr_loop;\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " }\n\n" ) ); mpu_fprintf( fp, MPU_UCS2( " if( (%szubr_n = %szubr_rindex[%szubr_state]) && (%szubr_n += %szubr_char) >= 0 &&\n" ), prefL, prefL, prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " %szubr_n <= %sZUBR_TABLESIZE && %szubr_check[%szubr_n] == %szubr_char )\n" ), prefL, prefU, prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " {\n" ) ); mpu_fprintf( fp, MPU_UCS2( " %szubr_n = %szubr_table[%szubr_n];\n" ), prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " goto %szubr_reduce;\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " }\n" ) ); mpu_fprintf( fp, MPU_UCS2( " if (%szubr_errflag) goto %szubr_inrecovery;\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( "#ifdef %snot_defined_zubr_sccsid\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " goto %szubr_newerror;\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( "#endif\n" ) ); mpu_fprintf( fp, MPU_UCS2( "%szubr_newerror:\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " %szubr_error( \"syntax error\" );\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( "#ifdef %snot_defined_zubr_sccsid\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " goto %szubr_errlab;\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( "#endif\n" ) ); mpu_fprintf( fp, MPU_UCS2( "%szubr_errlab:\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " ++%szubr_nerrs;\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( "%szubr_inrecovery:\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_errflag < 3 )\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " {\n" ) ); mpu_fprintf( fp, MPU_UCS2( " %szubr_errflag = 3;\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " for( ;; )\n" ) ); mpu_fprintf( fp, MPU_UCS2( " {\n" ) ); mpu_fprintf( fp, MPU_UCS2( " if( (%szubr_n = %szubr_sindex[*%szubr_ssp]) && (%szubr_n += %sZUBR_ERRCODE) >= 0 &&\n" ), prefL, prefL, prefL, prefL, prefU ); mpu_fprintf( fp, MPU_UCS2( " %szubr_n <= %sZUBR_TABLESIZE && %szubr_check[%szubr_n] == %sZUBR_ERRCODE )\n" ), prefL, prefU, prefL, prefL, prefU ); mpu_fprintf( fp, MPU_UCS2( " {\n" ) ); mpu_fprintf( fp, MPU_UCS2( "#if %sZUBR_DEBUG\n" ), prefU ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_debug )\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " %s( MPU_UCS2(\"%szubr_debug: state %%d, error recovery shifting\\\n" ), _printf_name, prefL ); mpu_fprintf( fp, MPU_UCS2( " to state %%d\\n\")," ) ); mpu_fprintf( fp, MPU_UCS2( " *%szubr_ssp, %szubr_table[%szubr_n] );\n" ), prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( "#endif\n" ) ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_ssp >= %szubr_ss + %szubr_stacksize - 1 )\n" ), prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " {\n" ) ); mpu_fprintf( fp, MPU_UCS2( " goto %szubr_overflow;\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " }\n" ) ); mpu_fprintf( fp, MPU_UCS2( " *++%szubr_ssp = %szubr_state = %szubr_table[%szubr_n];\n" ), prefL, prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " *++%szubr_vsp = %szubr_lval;\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " goto %szubr_loop;\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " }\n" ) ); mpu_fprintf( fp, MPU_UCS2( " else\n" ) ); mpu_fprintf( fp, MPU_UCS2( " {\n" ) ); mpu_fprintf( fp, MPU_UCS2( "#if %sZUBR_DEBUG\n" ), prefU ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_debug )\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " %s( MPU_UCS2(\"%szubr_debug: error recovery discarding state %%d\\n\"),\n" ), _printf_name, prefL ); mpu_fprintf( fp, MPU_UCS2( " *%szubr_ssp );\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( "#endif\n" ) ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_ssp <= %szubr_ss ) goto %szubr_abort;\n" ), prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " --%szubr_ssp;\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " --%szubr_vsp;\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " }\n" ) ); mpu_fprintf( fp, MPU_UCS2( " } /* End of for( ;; ) */\n" ) ); mpu_fprintf( fp, MPU_UCS2( " } /* End if( %szubr_errflag < 3 ) */\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " else\n" ) ); mpu_fprintf( fp, MPU_UCS2( " {\n" ) ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_char == 0 ) goto %szubr_abort;\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( "#if %sZUBR_DEBUG\n" ), prefU ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_debug )\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " {\n" ) ); mpu_fprintf( fp, MPU_UCS2( " %szubr_s = 0;\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_char <= %sZUBR_MAXTOKEN ) %szubr_s = %szubr_name[%szubr_char];\n" ), prefL, prefU, prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " if( !%szubr_s ) %szubr_s = MPU_UCS2(\"illegal-symbol\");\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " %s( MPU_UCS2(\"%szubr_debug: state %%d, error recovery discards token %%d (%%s)\\n\"),\n" ), _printf_name, prefL ); mpu_fprintf( fp, MPU_UCS2( " %szubr_state, %szubr_char, %szubr_s );\n" ), prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " }\n" ) ); mpu_fprintf( fp, MPU_UCS2( "#endif\n" ) ); mpu_fprintf( fp, MPU_UCS2( " %szubr_char = (-1);\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " goto %szubr_loop;\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " }\n" ) ); mpu_fprintf( fp, MPU_UCS2( "%szubr_reduce:\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( "#if %sZUBR_DEBUG\n" ), prefU ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_debug )\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " %s( MPU_UCS2(\"%szubr_debug: state %%d, reducing by rule %%d (%%s)\\n\"),\n" ), _printf_name, prefL ); mpu_fprintf( fp, MPU_UCS2( " %szubr_state, %szubr_n, %szubr_rule[%szubr_n] );\n" ), prefL, prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( "#endif\n" ) ); mpu_fprintf( fp, MPU_UCS2( " %szubr_m = %szubr_len[%szubr_n];\n" ), prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " %szubr_val = %szubr_vsp[1-%szubr_m];\n\n" ), prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " switch( %szubr_n )\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " {\n" ) ); if( lex_mem_flag ) { if( lex ) FREE( lex ); } } /******* End of write_end_body( void ) *********************/ void write_trailer( void ) /*************************************************************** Description : write section 'trailer' into code file Concepts : Use Global Variable: mpu_FILE *code_file | main.c Use Functions : Parameters : [void] Return : [void] ***************************************************************/ { register mpu_FILE *fp; register __mpu_char16_t *prefL, *prefU, *lex; register __mpu_char16_t lex_mem_flag = 0; __mpu_char16_t *_printf_name = (__mpu_char16_t *)MPU_UCS2( "mpu_printf" ); fp = code_file; lex = (__mpu_char16_t *)0; if( bflag ) { prefL = name_prefix; prefU = name_prefix_upper; if( l_name_flag ) lex = lex_func_name; else { lex = (__mpu_char16_t *) MALLOC( (mpu_str16len( name_prefix ) + mpu_str16len( (__mpu_char16_t *)MPU_UCS2( "zubr_lex" ) ) + 1) * sizeof(__mpu_char16_t) ); if( lex == 0 ) no_space(); memset( lex, NUL, (mpu_str16len( name_prefix ) + mpu_str16len( (__mpu_char16_t *)MPU_UCS2( "zubr_lex" ) ) + 1) * sizeof(__mpu_char16_t) ); mpu_str16cpy( lex, name_prefix ); mpu_str16cat( lex, (__mpu_char16_t *)MPU_UCS2( "zubr_lex" ) ); lex_mem_flag = 1; } } else { prefL = (__mpu_char16_t *)MPU_UCS2( "" ); prefU = (__mpu_char16_t *)MPU_UCS2( "" ); if( l_name_flag ) lex = lex_func_name; else lex = (__mpu_char16_t *)MPU_UCS2( "zubr_lex" ); } outline += 60; /* number of lines in trailer section */ mpu_fprintf( fp, MPU_UCS2( "\n } /* End of switch( %szubr_n ) */\n\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " %szubr_ssp -= %szubr_m;\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " %szubr_state = *%szubr_ssp;\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " %szubr_vsp -= %szubr_m;\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " %szubr_m = %szubr_lhs[%szubr_n];\n\n" ), prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_state == 0 && %szubr_m == 0 )\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " {\n" ) ); mpu_fprintf( fp, MPU_UCS2( "#if %sZUBR_DEBUG\n" ), prefU ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_debug )\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " %s( MPU_UCS2(\"%szubr_debug: after reduction, shifting from state 0 to\\\n" ), _printf_name, prefL ); mpu_fprintf( fp, MPU_UCS2( " state %%d\\n\")," ) ); mpu_fprintf( fp, MPU_UCS2( " %sZUBR_FINAL );\n" ), prefU ); mpu_fprintf( fp, MPU_UCS2( "#endif\n" ) ); mpu_fprintf( fp, MPU_UCS2( " %szubr_state = %sZUBR_FINAL;\n" ), prefL, prefU ); mpu_fprintf( fp, MPU_UCS2( " *++%szubr_ssp = %sZUBR_FINAL;\n" ), prefL, prefU ); mpu_fprintf( fp, MPU_UCS2( " *++%szubr_vsp = %szubr_val;\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_char < 0 )\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " {\n" ) ); mpu_fprintf( fp, MPU_UCS2( " if( (%szubr_char = %s()) < 0 ) %szubr_char = 0;\n" ), prefL, lex, prefL ); mpu_fprintf( fp, MPU_UCS2( "#if %sZUBR_DEBUG\n" ), prefU ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_debug )\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " {\n" ) ); mpu_fprintf( fp, MPU_UCS2( " %szubr_s = 0;\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_char <= %sZUBR_MAXTOKEN) %szubr_s = %szubr_name[%szubr_char];\n" ), prefL, prefU, prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " if( !%szubr_s ) %szubr_s = MPU_UCS2(\"illegal-symbol\");\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " %s( MPU_UCS2(\"%szubr_debug: state %%d, reading %%d (%%s)\\n\"),\n" ), _printf_name, prefL ); mpu_fprintf( fp, MPU_UCS2( " %sZUBR_FINAL, %szubr_char, %szubr_s);\n" ), prefU, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " }\n" ) ); mpu_fprintf( fp, MPU_UCS2( "#endif\n" ) ); mpu_fprintf( fp, MPU_UCS2( " }\n" ) ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_char == 0 ) goto %szubr_accept;\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " goto %szubr_loop;\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " } /* End if( %szubr_state == 0 && %szubr_m == 0 ) */\n\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " if( (%szubr_n = %szubr_gindex[%szubr_m]) && (%szubr_n += %szubr_state) >= 0 &&\n" ), prefL, prefL, prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " %szubr_n <= %sZUBR_TABLESIZE && %szubr_check[%szubr_n] == %szubr_state )\n" ), prefL, prefU, prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " %szubr_state = %szubr_table[%szubr_n];\n" ), prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " else\n" ) ); mpu_fprintf( fp, MPU_UCS2( " %szubr_state = %szubr_dgoto[%szubr_m];\n" ), prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( "#if %sZUBR_DEBUG\n" ), prefU ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_debug )\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " %s( MPU_UCS2(\"%szubr_debug: after reduction, shifting from state %%d \\\n" ), _printf_name, prefL ); mpu_fprintf( fp, MPU_UCS2( "to state %%d\\n\")," ) ); mpu_fprintf( fp, MPU_UCS2( " *%szubr_ssp, %szubr_state );\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( "#endif\n" ) ); mpu_fprintf( fp, MPU_UCS2( " if( %szubr_ssp >= %szubr_ss + %szubr_stacksize - 1 )\n" ), prefL, prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " {\n" ) ); mpu_fprintf( fp, MPU_UCS2( " goto %szubr_overflow;\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " }\n" ) ); mpu_fprintf( fp, MPU_UCS2( " *++%szubr_ssp = %szubr_state;\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " *++%szubr_vsp = %szubr_val;\n" ), prefL, prefL ); mpu_fprintf( fp, MPU_UCS2( " goto %szubr_loop;\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( "%szubr_overflow:\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " %szubr_error( \"zubr stack overflow\" );\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( "%szubr_abort:\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " return( 1 );\n" ) ); mpu_fprintf( fp, MPU_UCS2( "%szubr_accept:\n" ), prefL ); mpu_fprintf( fp, MPU_UCS2( " return( 0 );\n" ) ); mpu_fprintf( fp, MPU_UCS2( "}\n" ) ); if( lex_mem_flag ) { if( lex ) FREE( lex ); } } /******* End of write_trailer( void ) **********************/ #endif /* __NO_COMPILE */ /****************** END OF FILE SKELETON.C *******************/