Mercurial > ~dholland > hg > ag > index.cgi
diff tests/agcl/examples/good/ex.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/ex.cpp Sat Dec 22 17:52:45 2007 -0500 @@ -0,0 +1,992 @@ +/* + * AnaGram, a System for Syntax Directed Programming + * C Macro preprocessor + * Constant Expression Evaluator 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 EX_H +#include "ex.h" +#endif + +#ifndef EX_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]) + + + +long ex_value(void); + +#define INPUT_VALUE(type) *(type *) &(PCB).input_value + +#line - "ex.syn" + // Embedded C +#include <stdio.h> + + +// Macro Definitions + +#define PCB (*ex_pcb) +#define SYNTAX_ERROR syntax_error("Syntax error in constant expression"); + + +// Static data + +static ex_pcb_type *ex_pcb; // Pointer to active pcb + + +/* + +decode() is a simple function to recover the numeric value of a +token. Its task is somewhat simplified by the fact that the only +values allowed in this example are longs. + +*/ + +static long decode(const char *fmt, unsigned ndx) { + long v; + sscanf(td[ndx], fmt, &v); + return v; +} + + +// Members of expression_evaluator Class + + +// Constructor + +/* + Each expression_evaluator has its own parser control block. + Therefore, before calling ex() or its initializer init_ex() it is + necessary to make sure the pcb pointer for ex() is correctly set. +*/ + +expression_evaluator::expression_evaluator() { + ex_pcb = &pcb; // set up pointer to pcb + init_ex(); // init parser +} + + +// Reset expression_evaluator + +token_sink& reset(expression_evaluator &x) { + ex_pcb = &x.pcb; // set up pointer to pcb + init_ex(); // init parser + return x; +} + + +// Xmit Token to expression_evaluator + +/* + There could be space tokens in the input to the expression + evaluator, but they are never significant so it is acceptable to + filter them out on input. + + If the expression_evaluator has encountered an error, there is no + point in giving it any further input. + + Otherwise, the input_code and input_value fields of the pcb are set + up, the pcb pointer for ex is set, and ex() is called to deal with + the token. + + When looping, it is only necessary to set up ex_pcb at the + beginning of the loop. +*/ + +token_sink& expression_evaluator::operator << (token t) { + if (t.id == SPACE || pcb.exit_flag != AG_RUNNING_CODE) return *this; + pcb.input_code = t.id; + pcb.input_value = t; + ex_pcb = &pcb; + ex(); + return *this; +} + +token_sink &expression_evaluator::operator << (token *tp) { + ex_pcb = &pcb; + while (pcb.exit_flag == AG_RUNNING_CODE) { + if (pcb.input_code == SPACE) continue; + pcb.input_code = tp->id; + pcb.input_value = *tp++; + ex(); + } + return *this; +} + + +// Return Value of expression_evaluator + +/* + The (long) cast operator is overloaded to provide a mechanism to + retrieve the value of the expression evaluated by the + expression_evaluator. + + If there was a syntax error, the return value is zero. +*/ + +expression_evaluator::operator long() { + ex_pcb = &pcb; + if (pcb.exit_flag == AG_SUCCESS_CODE) return ex_value(); + else return 0; +} + +/* +// Check expression_evaluator for error + +int error(expression_evaluator &x) { + return x.pcb.exit_flag != AG_SUCCESS_CODE; +} +*/ +#line - "ex.cpp" + +#ifndef CONVERT_CASE +#define CONVERT_CASE(c) (c) +#endif +#ifndef TAB_SPACING +#define TAB_SPACING 8 +#endif +long ex_value(void) { + long returnValue; + returnValue = (*(long *) &(PCB).vs[(PCB).ssx]); + return returnValue; +} + +static long ag_rp_1(long c, long x, long y) { +#line - "ex.syn" + return c != 0 ? x : y; +#line - "ex.cpp" +} + +static long ag_rp_2(long x, long y) { +#line - "ex.syn" + return x != 0 || y!=0; +#line - "ex.cpp" +} + +static long ag_rp_3(long x, long y) { +#line - "ex.syn" + return x != 0 && y !=0; +#line - "ex.cpp" +} + +static long ag_rp_4(long x, long y) { +#line - "ex.syn" + return x | y; +#line - "ex.cpp" +} + +static long ag_rp_5(long x, long y) { +#line - "ex.syn" + return x ^ y; +#line - "ex.cpp" +} + +static long ag_rp_6(long x, long y) { +#line - "ex.syn" + return x & y; +#line - "ex.cpp" +} + +static long ag_rp_7(long x, long y) { +#line - "ex.syn" + return x == y; +#line - "ex.cpp" +} + +static long ag_rp_8(long x, long y) { +#line - "ex.syn" + return x != y; +#line - "ex.cpp" +} + +static long ag_rp_9(long x, long y) { +#line - "ex.syn" + return x < y; +#line - "ex.cpp" +} + +static long ag_rp_10(long x, long y) { +#line - "ex.syn" + return x > y; +#line - "ex.cpp" +} + +static long ag_rp_11(long x, long y) { +#line - "ex.syn" + return x <= y; +#line - "ex.cpp" +} + +static long ag_rp_12(long x, long y) { +#line - "ex.syn" + return x >= y; +#line - "ex.cpp" +} + +static long ag_rp_13(long x, long y) { +#line - "ex.syn" + return x << y; +#line - "ex.cpp" +} + +static long ag_rp_14(long x, long y) { +#line - "ex.syn" + return x >> y; +#line - "ex.cpp" +} + +static long ag_rp_15(long x, long y) { +#line - "ex.syn" + return x + y; +#line - "ex.cpp" +} + +static long ag_rp_16(long x, long y) { +#line - "ex.syn" + return x - y; +#line - "ex.cpp" +} + +static long ag_rp_17(long x, long y) { +#line - "ex.syn" + return x * y; +#line - "ex.cpp" +} + +static long ag_rp_18(long x, long y) { +#line - "ex.syn" + return x / y; +#line - "ex.cpp" +} + +static long ag_rp_19(long x, long y) { +#line - "ex.syn" + return x % y; +#line - "ex.cpp" +} + +static long ag_rp_20(long x) { +#line - "ex.syn" + if (x != 0) return x; + syntax_error("Divide by Zero"); + PCB.exit_flag = 5; + return x; + +#line - "ex.cpp" +} + +static long ag_rp_21(long x) { +#line - "ex.syn" + return x; +#line - "ex.cpp" +} + +static long ag_rp_22(long x) { +#line - "ex.syn" + return -x; +#line - "ex.cpp" +} + +static long ag_rp_23(long x) { +#line - "ex.syn" + return ~x; +#line - "ex.cpp" +} + +static long ag_rp_24(long x) { +#line - "ex.syn" + return !x; +#line - "ex.cpp" +} + +static long ag_rp_25(token x) { +#line - "ex.syn" + return decode("%lx",x.handle); +#line - "ex.cpp" +} + +static long ag_rp_26(token x) { +#line - "ex.syn" + return decode("%lo",x.handle); +#line - "ex.cpp" +} + +static long ag_rp_27(token x) { +#line - "ex.syn" + return decode("%ld",x.handle); +#line - "ex.cpp" +} + +static long ag_rp_28(token x) { +#line - "ex.syn" + return decode("'%lc'",x.handle); +#line - "ex.cpp" +} + +static long ag_rp_29(void) { +#line - "ex.syn" + return 0; +#line - "ex.cpp" +} + +static long ag_rp_30(long x) { +#line - "ex.syn" + return x; +#line - "ex.cpp" +} + + +#ifndef AG_TRACE_FILE_NAME +#define AG_TRACE_FILE_NAME "ex.etr" +#endif + +static void ag_trace_error(void) { + FILE *ag_file = fopen(AG_TRACE_FILE_NAME, "w"); + int i; + if (ag_file == NULL) return; + fprintf(ag_file, "%d\n", (PCB).ssx); + for (i = 0; i < (PCB).ssx; i++) fprintf(ag_file, "%d\n", (PCB).ss[i]); + fprintf(ag_file, "%d\n", (PCB).sn); + fprintf(ag_file, "%d\n", (PCB).token_number); + fclose(ag_file); +} + + +#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 ex_vs_type const ag_null_value NULL_VALUE_INITIALIZER; + +static const unsigned char ag_rpx[] = { + 0, 0, 0, 0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 8, + 0, 9, 10, 11, 12, 0, 13, 14, 0, 15, 16, 0, 17, 18, 19, 20, 0, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30 +}; + +#define AG_TCV(x) ag_tcv[(x)] + +static const unsigned char ag_tcv[] = { + 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 39, 0, 0, + 0, 36, 17, 0, 45, 46, 33, 30, 0, 31, 0, 34, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 0, 22, 0, 23, 6, 0, 11, 0, 0, 0, 0, 0, 0, + 19, 0, 25, 0, 24, 27, 0, 0, 0, 0, 20, 0, 9, 0, 28, 0, 43, 0, + 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, + 38, 0, 0, 40, 41, 42, 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0 +}; + +#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 + + +static void ag_prot(void) { + int ag_k; + ag_k = 128 - ++(PCB).btsx; + if (ag_k <= (PCB).ssx) { + ag_trace_error(); + (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 = (ex_token_type) (PCB).drt; + (PCB).ssx = (PCB).dssx; + (PCB).sn = (PCB).dsn; + (PCB).drt = -1; +} + + +static const unsigned char ag_tstt[] = { +45,44,43,42,41,40,39,38,31,30,0,1,2,4,5,8,10,12,14,16,18,21,26,29,32,37, +45,44,43,42,41,40,39,38,31,30,0,4,5,8,10,12,14,16,18,21,26,29,32,37, +45,44,43,42,41,40,39,38,31,30,0,32,37, +45,44,43,42,41,40,39,38,31,30,0,32,37, +45,44,43,42,41,40,39,38,31,30,0,32,37, +45,44,43,42,41,40,39,38,31,30,0,32,37, +36,34,33,0, +31,30,0, +28,27,0, +25,24,23,22,0, +20,19,0, +17,0, +15,0, +13,0, +11,0, +9,6,0, +3,0, +46,0, +45,44,43,42,41,40,39,38,31,30,0,32,35,37, +45,44,43,42,41,40,39,38,31,30,0,32,35,37, +45,44,43,42,41,40,39,38,31,30,0,32,37, +45,44,43,42,41,40,39,38,31,30,0,29,32,37, +45,44,43,42,41,40,39,38,31,30,0,29,32,37, +45,44,43,42,41,40,39,38,31,30,0,26,29,32,37, +45,44,43,42,41,40,39,38,31,30,0,26,29,32,37, +45,44,43,42,41,40,39,38,31,30,0,21,26,29,32,37, +45,44,43,42,41,40,39,38,31,30,0,21,26,29,32,37, +45,44,43,42,41,40,39,38,31,30,0,21,26,29,32,37, +45,44,43,42,41,40,39,38,31,30,0,21,26,29,32,37, +45,44,43,42,41,40,39,38,31,30,0,18,21,26,29,32,37, +45,44,43,42,41,40,39,38,31,30,0,18,21,26,29,32,37, +45,44,43,42,41,40,39,38,31,30,0,16,18,21,26,29,32,37, +45,44,43,42,41,40,39,38,31,30,0,14,16,18,21,26,29,32,37, +45,44,43,42,41,40,39,38,31,30,0,12,14,16,18,21,26,29,32,37, +45,44,43,42,41,40,39,38,31,30,0,10,12,14,16,18,21,26,29,32,37, +45,44,43,42,41,40,39,38,31,30,0,8,10,12,14,16,18,21,26,29,32,37, +45,44,43,42,41,40,39,38,31,30,0,4,5,8,10,12,14,16,18,21,26,29,32,37, +36,34,33,0, +36,34,33,0, +31,30,0, +31,30,0, +28,27,0, +28,27,0, +28,27,0, +28,27,0, +25,24,23,22,0, +25,24,23,22,0, +20,19,0, +17,0, +15,0, +13,0, +11,0, +7,0, +45,44,43,42,41,40,39,38,31,30,0,4,5,8,10,12,14,16,18,21,26,29,32,37, + 0 +}; + + +static unsigned const char ag_astt[530] = { + 1,2,2,2,2,2,1,1,1,1,7,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,7, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,7,2,2,1,2,2,2,2,2,1,1,1,1,7, + 2,2,1,2,2,2,2,2,1,1,1,1,7,2,2,1,2,2,2,2,2,1,1,1,1,7,2,2,1,1,1,5,1,1,5,1,1, + 5,1,1,1,1,5,1,1,5,1,5,1,5,1,5,1,5,1,1,5,3,7,2,7,1,2,2,2,2,2,1,1,1,1,7,2,2, + 2,1,2,2,2,2,2,1,1,1,1,7,2,2,2,1,2,2,2,2,2,1,1,1,1,7,2,2,1,2,2,2,2,2,1,1,1, + 1,7,1,1,1,1,2,2,2,2,2,1,1,1,1,7,1,1,1,1,2,2,2,2,2,1,1,1,1,7,1,1,1,1,1,2,2, + 2,2,2,1,1,1,1,7,1,1,1,1,1,2,2,2,2,2,1,1,1,1,7,1,1,1,1,1,1,2,2,2,2,2,1,1,1, + 1,7,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,7,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,7,1,1,1, + 1,1,1,2,2,2,2,2,1,1,1,1,7,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,7,1,1,1,1,1,1,1, + 2,2,2,2,2,1,1,1,1,7,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,7,1,1,1,1,1,1,1,1,1, + 2,2,2,2,2,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,7,1,1,1,1,1,1,1, + 1,1,1,1,2,2,2,2,2,1,1,1,1,7,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,7,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,4,1,1,4,1,1,4,1,1,4,1,1,4,1,1,4,1,1, + 4,1,1,1,1,4,1,1,1,1,4,1,1,4,1,4,1,4,1,4,1,4,1,7,1,2,2,2,2,2,1,1,1,1,7,2,1, + 1,1,1,1,1,1,1,1,1,1,1,11 +}; + + +static const unsigned char ag_pstt[] = { +1,43,42,41,40,39,2,3,4,5,0,0,16,16,15,14,13,12,11,10,9,8,7,6,6,6, +1,43,42,41,40,39,2,3,4,5,1,17,15,14,13,12,11,10,9,8,7,6,6,6, +1,43,42,41,40,39,2,3,4,5,2,38,38, +1,43,42,41,40,39,2,3,4,5,3,37,37, +1,43,42,41,40,39,2,3,4,5,4,36,36, +1,43,42,41,40,39,2,3,4,5,5,35,35, +18,19,20,26, +21,22,23, +23,24,18, +25,26,27,28,15, +29,30,13, +31,11, +32,9, +33,7, +34,5, +35,36,3, +1,16, +44,17, +1,43,42,41,40,39,2,3,4,5,18,33,32,33, +1,43,42,41,40,39,2,3,4,5,19,33,31,33, +1,43,42,41,40,39,2,3,4,5,20,30,30, +1,43,42,41,40,39,2,3,4,5,21,37,37,37, +1,43,42,41,40,39,2,3,4,5,22,38,38,38, +1,43,42,41,40,39,2,3,4,5,23,39,6,6,6, +1,43,42,41,40,39,2,3,4,5,24,40,6,6,6, +1,43,42,41,40,39,2,3,4,5,25,41,7,6,6,6, +1,43,42,41,40,39,2,3,4,5,26,42,7,6,6,6, +1,43,42,41,40,39,2,3,4,5,27,43,7,6,6,6, +1,43,42,41,40,39,2,3,4,5,28,44,7,6,6,6, +1,43,42,41,40,39,2,3,4,5,29,45,8,7,6,6,6, +1,43,42,41,40,39,2,3,4,5,30,46,8,7,6,6,6, +1,43,42,41,40,39,2,3,4,5,31,47,9,8,7,6,6,6, +1,43,42,41,40,39,2,3,4,5,32,48,10,9,8,7,6,6,6, +1,43,42,41,40,39,2,3,4,5,33,49,11,10,9,8,7,6,6,6, +1,43,42,41,40,39,2,3,4,5,34,50,12,11,10,9,8,7,6,6,6, +1,43,42,41,40,39,2,3,4,5,35,51,13,12,11,10,9,8,7,6,6,6, +1,43,42,41,40,39,2,3,4,5,36,52,15,14,13,12,11,10,9,8,7,6,6,6, +18,19,20,28, +18,19,20,27, +21,22,25, +21,22,24, +23,24,22, +23,24,21, +23,24,20, +23,24,19, +25,26,27,28,17, +25,26,27,28,16, +29,30,14, +31,12, +32,10, +33,8, +34,6, +53,52, +1,43,42,41,40,39,2,3,4,5,53,4,15,14,13,12,11,10,9,8,7,6,6,6, + 0 +}; + + +static const unsigned short ag_sbt[] = { + 0, 26, 50, 63, 76, 89, 102, 106, 109, 112, 117, 120, 122, 124, + 126, 128, 131, 133, 135, 149, 163, 176, 190, 204, 219, 234, 250, 266, + 282, 298, 315, 332, 350, 369, 389, 410, 432, 456, 460, 464, 467, 470, + 473, 476, 479, 482, 487, 492, 495, 497, 499, 501, 503, 505, 529 +}; + + +static const unsigned short ag_sbe[] = { + 10, 36, 60, 73, 86, 99, 105, 108, 111, 116, 119, 121, 123, 125, + 127, 130, 132, 134, 145, 159, 173, 186, 200, 214, 229, 244, 260, 276, + 292, 308, 325, 342, 360, 379, 399, 420, 442, 459, 463, 466, 469, 472, + 475, 478, 481, 486, 491, 494, 496, 498, 500, 502, 504, 515, 529 +}; + + +static const unsigned char ag_fl[] = { + 1,2,1,1,5,1,3,1,3,1,3,1,3,1,3,1,3,3,1,3,3,3,3,1,3,3,1,3,3,1,3,3,3,1,1, + 2,2,2,2,1,1,1,1,1,3 +}; + +static const unsigned char ag_ptt[] = { + 0, 1, 2, 4, 4, 5, 5, 8, 8, 10, 10, 12, 12, 14, 14, 16, 16, 16, + 18, 18, 18, 18, 18, 21, 21, 21, 26, 26, 26, 29, 29, 29, 29, 35, 32, 32, + 32, 32, 32, 37, 37, 37, 37, 37, 37 +}; + + +static void ag_ra(void) +{ + switch(ag_rpx[(PCB).ag_ap]) { + case 1: V(0,(long *)) = ag_rp_1(V(0,(long *)), V(2,(long *)), V(4,(long *))); break; + case 2: V(0,(long *)) = ag_rp_2(V(0,(long *)), V(2,(long *))); break; + case 3: V(0,(long *)) = ag_rp_3(V(0,(long *)), V(2,(long *))); break; + case 4: V(0,(long *)) = ag_rp_4(V(0,(long *)), V(2,(long *))); break; + case 5: V(0,(long *)) = ag_rp_5(V(0,(long *)), V(2,(long *))); break; + case 6: V(0,(long *)) = ag_rp_6(V(0,(long *)), V(2,(long *))); break; + case 7: V(0,(long *)) = ag_rp_7(V(0,(long *)), V(2,(long *))); break; + case 8: V(0,(long *)) = ag_rp_8(V(0,(long *)), V(2,(long *))); break; + case 9: V(0,(long *)) = ag_rp_9(V(0,(long *)), V(2,(long *))); break; + case 10: V(0,(long *)) = ag_rp_10(V(0,(long *)), V(2,(long *))); break; + case 11: V(0,(long *)) = ag_rp_11(V(0,(long *)), V(2,(long *))); break; + case 12: V(0,(long *)) = ag_rp_12(V(0,(long *)), V(2,(long *))); break; + case 13: V(0,(long *)) = ag_rp_13(V(0,(long *)), V(2,(long *))); break; + case 14: V(0,(long *)) = ag_rp_14(V(0,(long *)), V(2,(long *))); break; + case 15: V(0,(long *)) = ag_rp_15(V(0,(long *)), V(2,(long *))); break; + case 16: V(0,(long *)) = ag_rp_16(V(0,(long *)), V(2,(long *))); break; + case 17: V(0,(long *)) = ag_rp_17(V(0,(long *)), V(2,(long *))); break; + case 18: V(0,(long *)) = ag_rp_18(V(0,(long *)), V(2,(long *))); break; + case 19: V(0,(long *)) = ag_rp_19(V(0,(long *)), V(2,(long *))); break; + case 20: V(0,(long *)) = ag_rp_20(V(0,(long *))); break; + case 21: V(0,(long *)) = ag_rp_21(V(1,(long *))); break; + case 22: V(0,(long *)) = ag_rp_22(V(1,(long *))); break; + case 23: V(0,(long *)) = ag_rp_23(V(1,(long *))); break; + case 24: V(0,(long *)) = ag_rp_24(V(1,(long *))); break; + case 25: V(0,(long *)) = ag_rp_25(V(0,(token *))); break; + case 26: V(0,(long *)) = ag_rp_26(V(0,(token *))); break; + case 27: V(0,(long *)) = ag_rp_27(V(0,(token *))); break; + case 28: V(0,(long *)) = ag_rp_28(V(0,(token *))); break; + case 29: V(0,(long *)) = ag_rp_29(); break; + case 30: V(0,(long *)) = ag_rp_30(V(1,(long *))); break; + } +} + +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) { + (PCB).btsx = 0, (PCB).drt = -1; + return 0; +} + +static int ag_action_11_proc(void) { + (PCB).btsx = 0, (PCB).drt = -1; + (*(token *) &(PCB).vs[(PCB).ssx]) = (PCB).input_value; + (PCB).ssx--; + ag_ra(); + (PCB).ssx++; + return 0; +} + +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 = (ex_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 = (ex_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 = (ex_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) { + ag_trace_error(); + (PCB).exit_flag = AG_STACK_ERROR_CODE; + PARSER_STACK_OVERFLOW; + } + (*(token *) &(PCB).vs[(PCB).ssx]) = (PCB).input_value; + (PCB).ss[(PCB).ssx] = (PCB).sn; + (PCB).ssx++; + (PCB).sn = (PCB).ag_ap; + 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).ss[(PCB).ssx] = (PCB).sn; + (PCB).ssx++; + (PCB).sn = (PCB).ag_ap; + 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).exit_flag = AG_SUCCESS_CODE; + return 0; +} + +static int ag_action_1_proc(void) { + (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 = (ex_token_type) ag_ptt[(PCB).ag_ap]; + (PCB).btsx = 0, (PCB).drt = -1; + (*(token *) &(PCB).vs[(PCB).ssx]) = (PCB).input_value; + if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + else (PCB).ss[(PCB).ssx] = (PCB).sn; + 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; + (*(token *) &(PCB).vs[(PCB).ssx]) = (PCB).input_value; + if (ag_sd) (PCB).sn = (PCB).ss[(PCB).ssx -= ag_sd]; + else (PCB).ss[(PCB).ssx] = (PCB).sn; + (PCB).reduction_token = (ex_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(); + ag_trace_error(); + (PCB).exit_flag = AG_SYNTAX_ERROR_CODE; + SYNTAX_ERROR; + + 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).reduction_token = (ex_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 = (ex_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; + } + 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_ex(void) { + unsigned ag_t1; + ag_t1 = 0; + (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; + while (ag_tstt[ag_t1] == 0) { + (PCB).ag_ap = ag_pstt[ag_t1]; + (ag_gt_procs_scan[ag_astt[ag_t1]])(); + ag_t1 = ag_sbt[(PCB).sn]; + } +} + +void ex(void) { + (PCB).token_number = (ex_token_type) AG_TCV((PCB).input_code); + while (1) { + unsigned ag_t1 = ag_sbt[(PCB).sn]; + unsigned ag_t2 = ag_sbe[(PCB).sn] - 1; + 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]; + if ((ag_gt_procs_scan[ag_astt[ag_t1]])() == 0) break; + } +} + +