summaryrefslogtreecommitdiff
path: root/src/skeleton.c
diff options
context:
space:
mode:
authorkx <kx@radix-linux.su>2026-09-30 21:14:58 +0300
committerkx <kx@radix-linux.su>2026-09-30 21:14:58 +0300
commit5b1c65152f77e03a4800fceae32d16efe2dadc9c (patch)
treecaffe4b2235503cccfedfb772dc266cb311840b3 /src/skeleton.c
parent8b354d2b9f2640d90705abd324a413a0d8fa3867 (diff)
downloadzubr-trunk.tar.xz
Version 4.1.0HEAD4.1.0trunk
Diffstat (limited to 'src/skeleton.c')
-rw-r--r--src/skeleton.c663
1 files changed, 663 insertions, 0 deletions
diff --git a/src/skeleton.c b/src/skeleton.c
new file mode 100644
index 0000000..c0b5765
--- /dev/null
+++ b/src/skeleton.c
@@ -0,0 +1,663 @@
+
+/***************************************************************
+ 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 <defs.h>
+
+#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 <ctype.h> /* character classification used by lexer */\n" ) );
+ mpu_fprintf( fp, MPU_UCS2( "#include <libmpuio.h> /* 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 *******************/