Mercurial > ~dholland > hg > ag > index.cgi
diff tests/agcl/examples/good/ct.cpp @ 0:13d2b8934445
Import AnaGram (near-)release tree into Mercurial.
author | David A. Holland |
---|---|
date | Sat, 22 Dec 2007 17:52:45 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/agcl/examples/good/ct.cpp Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,911 @@ +/* + * AnaGram, a System for Syntax Directed Programming + * C Macro preprocessor + * Token Classifier Module + * + * Copyright 1993-2000 Parsifal Software. All Rights Reserved. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + */ + +#include "mpp.h" + + +/* + * AnaGram, A System for Syntax Directed Programming + * File generated by: ... + * + * AnaGram Parsing Engine + * Copyright 1993-2002 Parsifal Software. All Rights Reserved. + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + */ + +#ifndef CT_H +#include "ct.h" +#endif + +#ifndef CT_H +#error Mismatched header file +#endif + +#include <stdio.h> + +#define RULE_CONTEXT (&((PCB).cs[(PCB).ssx])) +#define ERROR_CONTEXT ((PCB).cs[(PCB).error_frame_ssx]) +#define CONTEXT ((PCB).cs[(PCB).ssx]) + + + +ct_pcb_type ct_pcb; +#define PCB ct_pcb + +token_id ct_value(void); + + +#line - "ct.syn" + // Embedded C + +#define SYNTAX_ERROR // no diagnostic needed + +static char *input_string; + +/* + +id_name() adds the string on the local string_accumulator to the token +dictionary and checks to see if the handle corresponds to a reserved +word. Otherwise the string is classified simply as a NAME + +*/ + +static token_id id_name(void) { + unsigned handle = td << input_string; + token_id id; + if (handle <= n_reserved_words) id = reserved_words[handle].id; + else id = NAME; + return id; +} + +/* + +classify_token() is an interface function for the grammar. It sets up +the pointer in the parser control block to point to the input string, +calls the parser, and returns the token_id determined by the parser if +there was no error, and returns "UNRECOGNIZED" if there was an error. + +*/ + +token_id classify_token(char *string) { + input_string = string; + PCB.pointer = (unsigned char *) string; + ct(); + return PCB.exit_flag == AG_SUCCESS_CODE ? ct_value() : UNRECOGNIZED; +} + +#line - "ct.cpp" + +#ifndef CONVERT_CASE +#define CONVERT_CASE(c) (c) +#endif +#ifndef TAB_SPACING +#define TAB_SPACING 8 +#endif +token_id ct_value(void) { + token_id returnValue; + returnValue = (*(token_id *) &(PCB).vs[(PCB).ssx]); + return returnValue; +} + +static token_id ag_rp_1(void) { +#line - "ct.syn" + return id_name(); +#line - "ct.cpp" +} + +static token_id ag_rp_2(void) { +#line - "ct.syn" + return STRINGliteral; +#line - "ct.cpp" +} + +static token_id ag_rp_3(void) { +#line - "ct.syn" + return CHARACTERconstant; +#line - "ct.cpp" +} + +static token_id ag_rp_4(int p) { +#line - "ct.syn" + return (token_id) p; +#line - "ct.cpp" +} + +static token_id ag_rp_5(void) { +#line - "ct.syn" + return ANDAND; +#line - "ct.cpp" +} + +static token_id ag_rp_6(void) { +#line - "ct.syn" + return ANDassign; +#line - "ct.cpp" +} + +static token_id ag_rp_7(void) { +#line - "ct.syn" + return ARROW; +#line - "ct.cpp" +} + +static token_id ag_rp_8(void) { +#line - "ct.syn" + return CONCAT; +#line - "ct.cpp" +} + +static token_id ag_rp_9(void) { +#line - "ct.syn" + return DECR; +#line - "ct.cpp" +} + +static token_id ag_rp_10(void) { +#line - "ct.syn" + return DIVassign; +#line - "ct.cpp" +} + +static token_id ag_rp_11(void) { +#line - "ct.syn" + return ELLIPSIS; +#line - "ct.cpp" +} + +static token_id ag_rp_12(void) { +#line - "ct.syn" + return EQ; +#line - "ct.cpp" +} + +static token_id ag_rp_13(void) { +#line - "ct.syn" + return ERassign; +#line - "ct.cpp" +} + +static token_id ag_rp_14(void) { +#line - "ct.syn" + return GE; +#line - "ct.cpp" +} + +static token_id ag_rp_15(void) { +#line - "ct.syn" + return ICR; +#line - "ct.cpp" +} + +static token_id ag_rp_16(void) { +#line - "ct.syn" + return LE; +#line - "ct.cpp" +} + +static token_id ag_rp_17(void) { +#line - "ct.syn" + return LS; +#line - "ct.cpp" +} + +static token_id ag_rp_18(void) { +#line - "ct.syn" + return LSassign; +#line - "ct.cpp" +} + +static token_id ag_rp_19(void) { +#line - "ct.syn" + return MODassign; +#line - "ct.cpp" +} + +static token_id ag_rp_20(void) { +#line - "ct.syn" + return MINUSassign; +#line - "ct.cpp" +} + +static token_id ag_rp_21(void) { +#line - "ct.syn" + return MULTassign; +#line - "ct.cpp" +} + +static token_id ag_rp_22(void) { +#line - "ct.syn" + return NE; +#line - "ct.cpp" +} + +static token_id ag_rp_23(void) { +#line - "ct.syn" + return ORassign; +#line - "ct.cpp" +} + +static token_id ag_rp_24(void) { +#line - "ct.syn" + return OROR; +#line - "ct.cpp" +} + +static token_id ag_rp_25(void) { +#line - "ct.syn" + return PLUSassign; +#line - "ct.cpp" +} + +static token_id ag_rp_26(void) { +#line - "ct.syn" + return RS; +#line - "ct.cpp" +} + +static token_id ag_rp_27(void) { +#line - "ct.syn" + return RSassign; +#line - "ct.cpp" +} + +static token_id ag_rp_28(void) { +#line - "ct.syn" + return FLOATconstant; +#line - "ct.cpp" +} + +static token_id ag_rp_29(void) { +#line - "ct.syn" + return OCTconstant; +#line - "ct.cpp" +} + +static token_id ag_rp_30(void) { +#line - "ct.syn" + return DECconstant; +#line - "ct.cpp" +} + +static token_id ag_rp_31(void) { +#line - "ct.syn" + return HEXconstant; +#line - "ct.cpp" +} + + +#define READ_COUNTS +#define WRITE_COUNTS +#undef V +#define V(i,t) (*t (&(PCB).vs[(PCB).ssx + i])) +#undef VS +#define VS(i) (PCB).vs[(PCB).ssx + i] + +#ifndef GET_CONTEXT +#define GET_CONTEXT CONTEXT = (PCB).input_context +#endif + +typedef enum { + ag_action_1, + ag_action_2, + ag_action_3, + ag_action_4, + ag_action_5, + ag_action_6, + ag_action_7, + ag_action_8, + ag_action_9, + ag_action_10, + ag_action_11, + ag_action_12 +} ag_parser_action; + + +#ifndef NULL_VALUE_INITIALIZER +#define NULL_VALUE_INITIALIZER = { 0 } +#endif + +static ct_vs_type const ag_null_value NULL_VALUE_INITIALIZER; + +static const unsigned char ag_rpx[] = { + 0, 0, 1, 0, 0, 2, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, + 30, 31 +}; + +#define AG_TCV(x) ag_tcv[(x)] + +static const unsigned char ag_tcv[] = { + 3, 61, 61, 61, 61, 61, 61, 61, 61, 61, 55, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 23, 51, 15, + 61, 21, 11, 57, 61, 61, 22, 19, 61, 13, 17, 16, 43, 62, 62, 62, 62, 62, + 62, 62, 36, 36, 61, 61, 20, 12, 14, 61, 61, 63, 63, 63, 63, 37, 28, 64, + 64, 64, 64, 64, 29, 64, 64, 64, 64, 64, 64, 64, 64, 49, 64, 64, 46, 64, + 64, 61, 53, 61, 18, 64, 61, 63, 63, 63, 63, 37, 28, 64, 64, 64, 64, 64, + 29, 64, 64, 64, 64, 64, 64, 64, 64, 49, 64, 64, 46, 64, 64, 61, 24, 61, + 61, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, + 65, 65, 65, 65 +}; + +#ifndef SYNTAX_ERROR +#define SYNTAX_ERROR fprintf(stderr,"%s\n", (PCB).error_message) +#endif + +#ifndef PARSER_STACK_OVERFLOW +#define PARSER_STACK_OVERFLOW {fprintf(stderr, \ + "\nParser stack overflow\n");} +#endif + +#ifndef REDUCTION_TOKEN_ERROR +#define REDUCTION_TOKEN_ERROR {fprintf(stderr, \ + "\nReduction token error\n");} +#endif + + +#ifndef INPUT_CODE +#define INPUT_CODE(T) (T) +#endif + + +static void ag_prot(void) { + int ag_k; + ag_k = 128 - ++(PCB).btsx; + if (ag_k <= (PCB).ssx) { + (PCB).exit_flag = AG_STACK_ERROR_CODE; + PARSER_STACK_OVERFLOW; + return; + } + (PCB).bts[(PCB).btsx] = (PCB).sn; + (PCB).bts[ag_k] = (PCB).ssx; + (PCB).vs[ag_k] = (PCB).vs[(PCB).ssx]; + (PCB).ss[ag_k] = (PCB).ss[(PCB).ssx]; +} + +static void ag_undo(void) { + if ((PCB).drt == -1) return; + while ((PCB).btsx) { + int ag_k = 128 - (PCB).btsx; + (PCB).sn = (PCB).bts[(PCB).btsx--]; + (PCB).ssx = (PCB).bts[ag_k]; + (PCB).vs[(PCB).ssx] = (PCB).vs[ag_k]; + (PCB).ss[(PCB).ssx] = (PCB).ss[ag_k]; + } + (PCB).token_number = (ct_token_type) (PCB).drt; + (PCB).ssx = (PCB).dssx; + (PCB).sn = (PCB).dsn; + (PCB).drt = -1; +} + + +static const unsigned char ag_tstt[] = { +64,63,62,61,57,55,53,51,49,46,43,37,36,29,28,24,23,22,21,20,19,18,17,16,15, + 14,13,12,11,0,1,2,4,5,6,7,8,9,25,27,30,32,33,34,39,40,41,45,50,56, +46,0, +62,43,37,36,17,0,31, +62,43,37,36,0,31, +63,62,43,37,36,28,0, +62,43,37,36,17,0,31, +62,43,36,17,0, +24,12,0, +12,0, +12,0, +12,0, +20,12,0, +19,12,0, +14,12,0, +12,0, +12,0, +62,43,36,17,0, +12,0, +15,0, +14,13,12,0, +12,11,0, +65,64,63,62,61,57,53,51,49,46,43,37,36,29,28,24,23,22,21,20,19,18,17,16,15, + 14,13,12,11,0, +65,64,63,62,61,57,53,51,49,46,43,37,36,29,28,24,23,22,21,20,19,18,17,16,15, + 14,13,12,11,0, +49,29,0,42, +49,29,0,42, +49,29,0,42, +29,28,3,0,26, +64,63,62,49,46,43,37,36,29,28,0, +3,0, +63,62,43,37,36,28,0, +62,43,36,19,13,0,38, +62,43,36,0, +62,43,36,0, +62,43,36,0, +12,0, +12,0, +17,0, +65,64,63,62,61,57,55,53,51,49,46,43,37,36,29,28,24,23,22,21,20,19,18,17,16, + 15,14,13,12,11,0, +65,64,63,62,61,57,55,53,51,49,46,43,37,36,29,28,24,23,22,21,20,19,18,17,16, + 15,14,13,12,11,0, +62,43,36,0, +62,43,36,0, + +}; + + +static unsigned const char ag_astt[314] = { + 1,1,1,2,1,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,0,1,1,1,1,2,2, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,9,9,1,9,3,7,1,9,9,1,9,5,1,9,9,9,9,9,9,5,9,9, + 1,9,3,5,1,9,9,3,3,5,2,2,4,2,4,2,4,2,4,1,2,4,2,2,4,1,2,4,2,4,2,4,3,3,3,1,4, + 2,4,2,4,2,2,2,4,2,2,4,9,9,9,9,9,3,1,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,7,9,9,9,9,9,9,1,3,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,7,9,9,4, + 3,9,9,4,3,9,9,4,3,2,2,5,7,2,9,9,9,9,9,9,9,9,9,9,4,3,7,3,3,3,3,3,3,7,8,8,8, + 1,1,7,1,9,9,9,5,9,9,9,5,9,9,9,5,2,4,2,4,2,7,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,7,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 3,3,3,3,3,3,3,3,3,7,3,3,3,7,3,3,3,7 +}; + + +static const unsigned char ag_pstt[] = { +27,27,5,8,21,8,8,22,27,27,1,27,5,27,27,7,8,9,10,11,12,14,16,17,18,13,19,15, + 20,0,0,28,27,28,28,5,6,28,26,26,3,2,5,6,25,24,23,4,22,21, +29,58, +47,47,30,47,41,2,31, +45,45,30,45,37,32, +63,63,63,63,63,63,60, +67,67,30,67,43,64,33, +59,59,46,42,56, +28,27,8, +26,8, +25,8, +23,8, +34,20,8, +19,29,8, +35,18,8, +17,8, +16,8, +44,44,44,36,8, +14,8, +12,8, +11,13,24,8, +10,9,8, +77,77,77,77,77,75,37,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77, + 77,77,77,77,21, +72,72,72,72,72,72,38,70,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72,72, + 72,72,72,72,22, +61,61,55,61, +65,65,54,65, +57,57,53,57, +32,32,34,26,32, +81,81,81,81,81,81,81,81,81,81,2, +1,28, +62,62,62,62,62,62,29, +39,39,39,39,40,30,39, +52,52,52,39, +52,52,52,38, +52,52,52,40, +22,21, +31,30, +15,36, +78,78,78,78,78,78,79,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78, + 78,78,78,78,78,37, +73,73,73,73,73,73,74,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73,73, + 73,73,73,73,73,38, +51,51,51,39, +48,48,48,40, + +}; + + +static const unsigned short ag_sbt[] = { + 0, 50, 52, 59, 65, 72, 79, 84, 87, 89, 91, 93, 96, 99, + 102, 104, 106, 111, 113, 115, 119, 122, 152, 182, 186, 190, 194, 199, + 210, 212, 219, 226, 230, 234, 238, 240, 242, 244, 275, 306, 310, 314 +}; + + +static const unsigned short ag_sbe[] = { + 29, 51, 57, 63, 71, 77, 83, 86, 88, 90, 92, 95, 98, 101, + 103, 105, 110, 112, 114, 118, 121, 151, 181, 184, 188, 192, 197, 209, + 211, 218, 224, 229, 233, 237, 239, 241, 243, 274, 305, 309, 313, 314 +}; + + +static const unsigned char ag_fl[] = { + 1,2,1,1,1,1,1,1,1,2,2,2,2,2,2,3,2,2,2,2,2,2,3,2,2,2,2,2,2,2,2,3,2,1,0, + 1,1,1,2,2,2,2,2,2,2,2,2,2,3,0,1,3,2,1,1,1,1,2,1,2,1,2,3,2,1,2,1,2,1,1, + 2,1,2,3,3,2,1,2,3,3,1,2 +}; + +static const unsigned char ag_ptt[] = { + 0, 1, 2, 2, 2, 2, 2, 2, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 25, 26, 26, + 26, 27, 27, 27, 27, 30, 30, 30, 30, 30, 32, 32, 31, 38, 38, 31, 31, 6, + 6, 6, 39, 39, 34, 34, 41, 41, 45, 45, 40, 40, 33, 33, 42, 42, 7, 50, + 50, 50, 50, 8, 56, 56, 56, 56, 4, 4 +}; + + +static void ag_ra(void) +{ + switch(ag_rpx[(PCB).ag_ap]) { + case 1: V(0,(token_id *)) = ag_rp_1(); break; + case 2: V(0,(token_id *)) = ag_rp_2(); break; + case 3: V(0,(token_id *)) = ag_rp_3(); break; + case 4: V(0,(token_id *)) = ag_rp_4(V(0,(int *))); break; + case 5: V(0,(token_id *)) = ag_rp_5(); break; + case 6: V(0,(token_id *)) = ag_rp_6(); break; + case 7: V(0,(token_id *)) = ag_rp_7(); break; + case 8: V(0,(token_id *)) = ag_rp_8(); break; + case 9: V(0,(token_id *)) = ag_rp_9(); break; + case 10: V(0,(token_id *)) = ag_rp_10(); break; + case 11: V(0,(token_id *)) = ag_rp_11(); break; + case 12: V(0,(token_id *)) = ag_rp_12(); break; + case 13: V(0,(token_id *)) = ag_rp_13(); break; + case 14: V(0,(token_id *)) = ag_rp_14(); break; + case 15: V(0,(token_id *)) = ag_rp_15(); break; + case 16: V(0,(token_id *)) = ag_rp_16(); break; + case 17: V(0,(token_id *)) = ag_rp_17(); break; + case 18: V(0,(token_id *)) = ag_rp_18(); break; + case 19: V(0,(token_id *)) = ag_rp_19(); break; + case 20: V(0,(token_id *)) = ag_rp_20(); break; + case 21: V(0,(token_id *)) = ag_rp_21(); break; + case 22: V(0,(token_id *)) = ag_rp_22(); break; + case 23: V(0,(token_id *)) = ag_rp_23(); break; + case 24: V(0,(token_id *)) = ag_rp_24(); break; + case 25: V(0,(token_id *)) = ag_rp_25(); break; + case 26: V(0,(token_id *)) = ag_rp_26(); break; + case 27: V(0,(token_id *)) = ag_rp_27(); break; + case 28: V(0,(token_id *)) = ag_rp_28(); break; + case 29: V(0,(token_id *)) = ag_rp_29(); break; + case 30: V(0,(token_id *)) = ag_rp_30(); break; + case 31: V(0,(token_id *)) = ag_rp_31(); break; + } + (PCB).la_ptr = (PCB).pointer; +} + +static int ag_action_1_r_proc(void); +static int ag_action_2_r_proc(void); +static int ag_action_3_r_proc(void); +static int ag_action_4_r_proc(void); +static int ag_action_1_s_proc(void); +static int ag_action_3_s_proc(void); +static int ag_action_1_proc(void); +static int ag_action_2_proc(void); +static int ag_action_3_proc(void); +static int ag_action_4_proc(void); +static int ag_action_5_proc(void); +static int ag_action_6_proc(void); +static int ag_action_7_proc(void); +static int ag_action_8_proc(void); +static int ag_action_9_proc(void); +static int ag_action_10_proc(void); +static int ag_action_11_proc(void); +static int ag_action_8_proc(void); + + +static int (*const ag_r_procs_scan[])(void) = { + ag_action_1_r_proc, + ag_action_2_r_proc, + ag_action_3_r_proc, + ag_action_4_r_proc +}; + +static int (*const ag_s_procs_scan[])(void) = { + ag_action_1_s_proc, + ag_action_2_r_proc, + ag_action_3_s_proc, + ag_action_4_r_proc +}; + +static int (*const ag_gt_procs_scan[])(void) = { + ag_action_1_proc, + ag_action_2_proc, + ag_action_3_proc, + ag_action_4_proc, + ag_action_5_proc, + ag_action_6_proc, + ag_action_7_proc, + ag_action_8_proc, + ag_action_9_proc, + ag_action_10_proc, + ag_action_11_proc, + ag_action_8_proc +}; + + +static int ag_action_10_proc(void) { + int ag_t = (PCB).token_number; + (PCB).btsx = 0, (PCB).drt = -1; + do { + (PCB).pointer = (PCB).la_ptr; + (PCB).token_number = (ct_token_type) AG_TCV(INPUT_CODE(*(PCB).la_ptr)); + (PCB).la_ptr++; + } while ((PCB).token_number == (ct_token_type) ag_t); + (PCB).la_ptr = (PCB).pointer; + return 1; +} + +static int ag_action_11_proc(void) { + int ag_t = (PCB).token_number; + + (PCB).btsx = 0, (PCB).drt = -1; + do { + (*(int *) &(PCB).vs[(PCB).ssx]) = *(PCB).pointer; + (PCB).ssx--; + (PCB).pointer = (PCB).la_ptr; + ag_ra(); + if ((PCB).exit_flag != AG_RUNNING_CODE) return 0; + (PCB).ssx++; + (PCB).token_number = (ct_token_type) AG_TCV(INPUT_CODE(*(PCB).la_ptr)); + (PCB).la_ptr++; + } + while ((PCB).token_number == (ct_token_type) ag_t); + (PCB).la_ptr = (PCB).pointer; + return 1; +} + +static int ag_action_3_r_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap] - 1; + if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + (PCB).btsx = 0, (PCB).drt = -1; + (PCB).reduction_token = (ct_token_type) ag_ptt[(PCB).ag_ap]; + ag_ra(); + return (PCB).exit_flag == AG_RUNNING_CODE; +} + +static int ag_action_3_s_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap] - 1; + if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + (PCB).btsx = 0, (PCB).drt = -1; + (PCB).reduction_token = (ct_token_type) ag_ptt[(PCB).ag_ap]; + ag_ra(); + return (PCB).exit_flag == AG_RUNNING_CODE; +} + +static int ag_action_4_r_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap] - 1; + if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + (PCB).reduction_token = (ct_token_type) ag_ptt[(PCB).ag_ap]; + return 1; +} + +static int ag_action_2_proc(void) { + (PCB).btsx = 0, (PCB).drt = -1; + if ((PCB).ssx >= 128) { + (PCB).exit_flag = AG_STACK_ERROR_CODE; + PARSER_STACK_OVERFLOW; + } + (*(int *) &(PCB).vs[(PCB).ssx]) = *(PCB).pointer; + (PCB).ss[(PCB).ssx] = (PCB).sn; + (PCB).ssx++; + (PCB).sn = (PCB).ag_ap; + (PCB).pointer = (PCB).la_ptr; + return 0; +} + +static int ag_action_9_proc(void) { + if ((PCB).drt == -1) { + (PCB).drt=(PCB).token_number; + (PCB).dssx=(PCB).ssx; + (PCB).dsn=(PCB).sn; + } + ag_prot(); + (PCB).vs[(PCB).ssx] = ag_null_value; + (PCB).ss[(PCB).ssx] = (PCB).sn; + (PCB).ssx++; + (PCB).sn = (PCB).ag_ap; + (PCB).la_ptr = (PCB).pointer; + return (PCB).exit_flag == AG_RUNNING_CODE; +} + +static int ag_action_2_r_proc(void) { + (PCB).ssx++; + (PCB).sn = (PCB).ag_ap; + return 0; +} + +static int ag_action_7_proc(void) { + --(PCB).ssx; + (PCB).la_ptr = (PCB).pointer; + (PCB).exit_flag = AG_SUCCESS_CODE; + return 0; +} + +static int ag_action_1_proc(void) { + (PCB).pointer = (PCB).la_ptr; + (PCB).exit_flag = AG_SUCCESS_CODE; + return 0; +} + +static int ag_action_1_r_proc(void) { + (PCB).exit_flag = AG_SUCCESS_CODE; + return 0; +} + +static int ag_action_1_s_proc(void) { + (PCB).exit_flag = AG_SUCCESS_CODE; + return 0; +} + +static int ag_action_4_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap] - 1; + (PCB).reduction_token = (ct_token_type) ag_ptt[(PCB).ag_ap]; + (PCB).btsx = 0, (PCB).drt = -1; + (*(int *) &(PCB).vs[(PCB).ssx]) = *(PCB).pointer; + if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + else (PCB).ss[(PCB).ssx] = (PCB).sn; + (PCB).pointer = (PCB).la_ptr; + while ((PCB).exit_flag == AG_RUNNING_CODE) { + unsigned ag_t1 = ag_sbe[(PCB).sn] + 1; + unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1; + do { + unsigned ag_tx = (ag_t1 + ag_t2)/2; + if (ag_tstt[ag_tx] < (unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1; + else ag_t2 = ag_tx; + } while (ag_t1 < ag_t2); + (PCB).ag_ap = ag_pstt[ag_t1]; + if ((ag_s_procs_scan[ag_astt[ag_t1]])() == 0) break; + } + return 0; +} + +static int ag_action_3_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap] - 1; + (PCB).btsx = 0, (PCB).drt = -1; + (*(int *) &(PCB).vs[(PCB).ssx]) = *(PCB).pointer; + if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + else (PCB).ss[(PCB).ssx] = (PCB).sn; + (PCB).pointer = (PCB).la_ptr; + (PCB).reduction_token = (ct_token_type) ag_ptt[(PCB).ag_ap]; + ag_ra(); + while ((PCB).exit_flag == AG_RUNNING_CODE) { + unsigned ag_t1 = ag_sbe[(PCB).sn] + 1; + unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1; + do { + unsigned ag_tx = (ag_t1 + ag_t2)/2; + if (ag_tstt[ag_tx] < (unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1; + else ag_t2 = ag_tx; + } while (ag_t1 < ag_t2); + (PCB).ag_ap = ag_pstt[ag_t1]; + if ((ag_s_procs_scan[ag_astt[ag_t1]])() == 0) break; + } + return 0; +} + +static int ag_action_8_proc(void) { + ag_undo(); + (PCB).la_ptr = (PCB).pointer; + (PCB).exit_flag = AG_SYNTAX_ERROR_CODE; + SYNTAX_ERROR; + (PCB).la_ptr = ++(PCB).pointer; + return (PCB).exit_flag == AG_RUNNING_CODE; +} + +static int ag_action_5_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap]; + (PCB).btsx = 0, (PCB).drt = -1; + if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + else { + (PCB).ss[(PCB).ssx] = (PCB).sn; + } + (PCB).la_ptr = (PCB).pointer; + (PCB).reduction_token = (ct_token_type) ag_ptt[(PCB).ag_ap]; + ag_ra(); + while ((PCB).exit_flag == AG_RUNNING_CODE) { + unsigned ag_t1 = ag_sbe[(PCB).sn] + 1; + unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1; + do { + unsigned ag_tx = (ag_t1 + ag_t2)/2; + if (ag_tstt[ag_tx] < (unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1; + else ag_t2 = ag_tx; + } while (ag_t1 < ag_t2); + (PCB).ag_ap = ag_pstt[ag_t1]; + if ((ag_r_procs_scan[ag_astt[ag_t1]])() == 0) break; + } + return (PCB).exit_flag == AG_RUNNING_CODE; +} + +static int ag_action_6_proc(void) { + int ag_sd = ag_fl[(PCB).ag_ap]; + (PCB).reduction_token = (ct_token_type) ag_ptt[(PCB).ag_ap]; + if ((PCB).drt == -1) { + (PCB).drt=(PCB).token_number; + (PCB).dssx=(PCB).ssx; + (PCB).dsn=(PCB).sn; + } + if (ag_sd) { + (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + } + else { + ag_prot(); + (PCB).vs[(PCB).ssx] = ag_null_value; + (PCB).ss[(PCB).ssx] = (PCB).sn; + } + (PCB).la_ptr = (PCB).pointer; + while ((PCB).exit_flag == AG_RUNNING_CODE) { + unsigned ag_t1 = ag_sbe[(PCB).sn] + 1; + unsigned ag_t2 = ag_sbt[(PCB).sn+1] - 1; + do { + unsigned ag_tx = (ag_t1 + ag_t2)/2; + if (ag_tstt[ag_tx] < (unsigned char)(PCB).reduction_token) ag_t1 = ag_tx + 1; + else ag_t2 = ag_tx; + } while (ag_t1 < ag_t2); + (PCB).ag_ap = ag_pstt[ag_t1]; + if ((ag_r_procs_scan[ag_astt[ag_t1]])() == 0) break; + } + return (PCB).exit_flag == AG_RUNNING_CODE; +} + + +void init_ct(void) { + (PCB).la_ptr = (PCB).pointer; + (PCB).error_message = "Syntax Error"; + (PCB).ss[0] = (PCB).sn = (PCB).ssx = 0; + (PCB).exit_flag = AG_RUNNING_CODE; + (PCB).btsx = 0, (PCB).drt = -1; +} + +void ct(void) { + init_ct(); + (PCB).exit_flag = AG_RUNNING_CODE; + while ((PCB).exit_flag == AG_RUNNING_CODE) { + unsigned ag_t1 = ag_sbt[(PCB).sn]; + if (ag_tstt[ag_t1]) { + unsigned ag_t2 = ag_sbe[(PCB).sn] - 1; + (PCB).token_number = (ct_token_type) AG_TCV(INPUT_CODE(*(PCB).la_ptr)); + (PCB).la_ptr++; + do { + unsigned ag_tx = (ag_t1 + ag_t2)/2; + if (ag_tstt[ag_tx] > (unsigned char)(PCB).token_number) + ag_t1 = ag_tx + 1; + else ag_t2 = ag_tx; + } while (ag_t1 < ag_t2); + if (ag_tstt[ag_t1] != (unsigned char)(PCB).token_number) + ag_t1 = ag_sbe[(PCB).sn]; + } + (PCB).ag_ap = ag_pstt[ag_t1]; + (ag_gt_procs_scan[ag_astt[ag_t1]])(); + } +} + +