From 86e55aae8212181fa3ea2587a346f97c11bace3b Mon Sep 17 00:00:00 2001 From: Paul Date: Fri, 22 Dec 2000 17:10:46 +0000 Subject: [PATCH] --- Utils/Scripter/codegen.cpp | 12 + Utils/Scripter/codegen.h | 4 + Utils/Scripter/lexer.cpp | 548 +++++++++++++++++++------------------ Utils/Scripter/lexer.h | 3 +- Utils/Scripter/lexer.l | 4 + Utils/Scripter/mylexer.cpp | 59 +++- Utils/Scripter/parser.cpp | 493 ++++++++++++++++++--------------- Utils/Scripter/parser.h | 20 +- Utils/Scripter/parser.v | 381 +++++++++++++++++--------- Utils/Scripter/parser.y | 10 +- data/Scripts/test.scr | 44 +-- source/script/script.cpp | 28 +- source/script/script.h | 3 + tools/scripter.exe | Bin 233535 -> 233535 bytes 14 files changed, 955 insertions(+), 654 deletions(-) diff --git a/Utils/Scripter/codegen.cpp b/Utils/Scripter/codegen.cpp index d8e650df4..22ac85f9c 100644 --- a/Utils/Scripter/codegen.cpp +++ b/Utils/Scripter/codegen.cpp @@ -328,6 +328,18 @@ int CTreeNode::generateCode(int _write) codeSize+=emit(OP_ADD,_write); break; + case MULTIPLY_EXPR: // * [value, value] + codeSize+=m_children[1]->generateCode(_write); + codeSize+=m_children[0]->generateCode(_write); + codeSize+=emit(OP_MULTIPLY,_write); + break; + + case DIVIDE_EXPR: // / [value, value] + codeSize+=m_children[1]->generateCode(_write); + codeSize+=m_children[0]->generateCode(_write); + codeSize+=emit(OP_DIVIDE,_write); + break; + case FUNCTION_EXPR: // function [functionNumber] codeSize+=emit(OP_CALL_FUNCTION,_write); codeSize+=emit(getFunctionNumber(),_write); diff --git a/Utils/Scripter/codegen.h b/Utils/Scripter/codegen.h index b127ee46d..adebb4251 100644 --- a/Utils/Scripter/codegen.h +++ b/Utils/Scripter/codegen.h @@ -49,6 +49,8 @@ typedef enum VALUE_EXPR, // value PLUS_EXPR, // + [value, value] SUBTRACT_EXPR, // - [value, value] + MULTIPLY_EXPR, // * [value, value] + DIVIDE_EXPR, // / [value, value] FUNCTION_EXPR, // function [functionNumber] }NodeType; @@ -94,6 +96,8 @@ private: OP_IS_GREATERTHAN_VALUE,// value, value pushes result ( 0 or 1 ) to stack OP_ASSIGN, // varidx, value OP_ADD, // value, value pushes result to stack + OP_MULTIPLY, // value, value pushes result to stack + OP_DIVIDE, // value, value pushes result to stack OP_NEG, // value pushes result to stack OP_PRINT, // value OP_CALL_FUNCTION, // functionNumber, argcount args pushes return value to stack diff --git a/Utils/Scripter/lexer.cpp b/Utils/Scripter/lexer.cpp index f86cd46a3..f6c1a3393 100644 --- a/Utils/Scripter/lexer.cpp +++ b/Utils/Scripter/lexer.cpp @@ -29,7 +29,7 @@ Date: 07 December 2000 YYLEXNAME::YYLEXNAME() { yytables(); -#line 46 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 47 "C:\\spongebob\\Utils\\scripter\\lexer.l" // place any extra initialisation code here @@ -79,7 +79,7 @@ void YYLEXNAME::yyunput(int ch) int YYLEXNAME::yyaction(int action) { -#line 58 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 59 "C:\\spongebob\\Utils\\scripter\\lexer.l" // extract yylval for use later on in actions YYSTYPE& yylval = *(YYSTYPE*)yyparserptr->yylvalptr; @@ -89,196 +89,196 @@ YYSTYPE& yylval = *(YYSTYPE*)yyparserptr->yylvalptr; switch (action) { case 1: { -#line 65 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 66 "C:\\spongebob\\Utils\\scripter\\lexer.l" if(preprocessorCmd(yytext+1)!=(int)true)error(); #line 95 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 2: { -#line 66 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 67 "C:\\spongebob\\Utils\\scripter\\lexer.l" printf("# commands must be at start of line!\n");error(); #line 102 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 3: { -#line 68 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 69 "C:\\spongebob\\Utils\\scripter\\lexer.l" return STOP; #line 109 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 4: { -#line 69 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 70 "C:\\spongebob\\Utils\\scripter\\lexer.l" return IF; #line 116 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 5: { -#line 70 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 71 "C:\\spongebob\\Utils\\scripter\\lexer.l" return ELSE; #line 123 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 6: { -#line 71 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 72 "C:\\spongebob\\Utils\\scripter\\lexer.l" return WHILE; #line 130 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 7: { -#line 72 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 73 "C:\\spongebob\\Utils\\scripter\\lexer.l" return DO; #line 137 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 8: { -#line 73 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 74 "C:\\spongebob\\Utils\\scripter\\lexer.l" return PAUSE; #line 144 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 9: { -#line 74 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 75 "C:\\spongebob\\Utils\\scripter\\lexer.l" return PRINT; #line 151 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 10: { -#line 75 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 76 "C:\\spongebob\\Utils\\scripter\\lexer.l" return ASSIGN; #line 158 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 11: { -#line 76 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 77 "C:\\spongebob\\Utils\\scripter\\lexer.l" return EQUAL; #line 165 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 12: { -#line 77 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 78 "C:\\spongebob\\Utils\\scripter\\lexer.l" return NOTEQUAL; #line 172 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 13: { -#line 78 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 79 "C:\\spongebob\\Utils\\scripter\\lexer.l" return LESSTHAN; #line 179 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 14: { -#line 79 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 80 "C:\\spongebob\\Utils\\scripter\\lexer.l" return GREATERTHAN; #line 186 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 15: { -#line 80 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 81 "C:\\spongebob\\Utils\\scripter\\lexer.l" return PLUS; #line 193 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 16: { -#line 81 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 82 "C:\\spongebob\\Utils\\scripter\\lexer.l" return SUBTRACT; #line 200 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 17: { -#line 82 "C:\\spongebob\\Utils\\scripter\\lexer.l" -return END_STMT; +#line 83 "C:\\spongebob\\Utils\\scripter\\lexer.l" +return MULTIPLY; #line 207 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 18: { -#line 83 "C:\\spongebob\\Utils\\scripter\\lexer.l" -return OPEN_PAR; +#line 84 "C:\\spongebob\\Utils\\scripter\\lexer.l" +return DIVIDE; #line 214 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 19: { -#line 84 "C:\\spongebob\\Utils\\scripter\\lexer.l" -return CLOSE_PAR; +#line 85 "C:\\spongebob\\Utils\\scripter\\lexer.l" +return END_STMT; #line 221 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 20: { -#line 85 "C:\\spongebob\\Utils\\scripter\\lexer.l" -return BEGIN_CS; +#line 86 "C:\\spongebob\\Utils\\scripter\\lexer.l" +return OPEN_PAR; #line 228 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 21: { -#line 86 "C:\\spongebob\\Utils\\scripter\\lexer.l" -return END_CS; +#line 87 "C:\\spongebob\\Utils\\scripter\\lexer.l" +return CLOSE_PAR; #line 235 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 22: { -#line 87 "C:\\spongebob\\Utils\\scripter\\lexer.l" -return COMMA; +#line 88 "C:\\spongebob\\Utils\\scripter\\lexer.l" +return BEGIN_CS; #line 242 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 23: { -#line 90 "C:\\spongebob\\Utils\\scripter\\lexer.l" -yylval.variableIdx=lookupVarName(yytext+1);return VARIABLE; +#line 89 "C:\\spongebob\\Utils\\scripter\\lexer.l" +return END_CS; #line 249 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 24: { -#line 91 "C:\\spongebob\\Utils\\scripter\\lexer.l" -yylval.value=atoi(yytext);return VALUE; +#line 90 "C:\\spongebob\\Utils\\scripter\\lexer.l" +return COMMA; #line 256 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 25: { -#line 94 "C:\\spongebob\\Utils\\scripter\\lexer.l" -yylval.functionNumber=lookupFunctionName(yytext+1);return FUNCTION; +#line 93 "C:\\spongebob\\Utils\\scripter\\lexer.l" +yylval.variableIdx=lookupVarName(yytext+1);return VARIABLE; #line 263 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 26: { -#line 96 "C:\\spongebob\\Utils\\scripter\\lexer.l" - +#line 94 "C:\\spongebob\\Utils\\scripter\\lexer.l" +yylval.value=atoi(yytext);return VALUE; #line 270 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 27: { #line 97 "C:\\spongebob\\Utils\\scripter\\lexer.l" - +yylval.functionNumber=lookupFunctionName(yytext+1);return FUNCTION; #line 277 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; case 28: { -#line 98 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 99 "C:\\spongebob\\Utils\\scripter\\lexer.l" #line 284 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } @@ -286,10 +286,31 @@ yylval.functionNumber=lookupFunctionName(yytext+1);return FUNCTION; case 29: { #line 100 "C:\\spongebob\\Utils\\scripter\\lexer.l" -unexpectedChar(); +comment(); #line 291 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" } break; + case 30: + { +#line 101 "C:\\spongebob\\Utils\\scripter\\lexer.l" + +#line 298 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" + } + break; + case 31: + { +#line 102 "C:\\spongebob\\Utils\\scripter\\lexer.l" + +#line 305 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" + } + break; + case 32: + { +#line 104 "C:\\spongebob\\Utils\\scripter\\lexer.l" +unexpectedChar(); +#line 312 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" + } + break; default: yyassert(0); break; @@ -303,7 +324,7 @@ unexpectedChar(); #pragma warn .rch // to the old state #endif #endif -#line 102 "C:\\spongebob\\Utils\\scripter\\lexer.l" +#line 106 "C:\\spongebob\\Utils\\scripter\\lexer.l" @@ -311,7 +332,7 @@ unexpectedChar(); // programs section -#line 315 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" +#line 336 "C:\\spongebob\\Utils\\scripter\\lexer.cpp" void YYLEXNAME::yytables() { @@ -335,9 +356,9 @@ void YYLEXNAME::yytables() { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 26, 26 }, - { 0, 40 }, - { 0, 54 }, + { 27, 27 }, + { 0, 39 }, + { 0, 56 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, @@ -358,7 +379,7 @@ void YYLEXNAME::yytables() { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 26, 26 }, + { 27, 27 }, { 0, 0 }, { 0, 0 }, { 3, 1 }, @@ -368,172 +389,162 @@ void YYLEXNAME::yytables() { 0, 0 }, { 0, 0 }, { 0, 0 }, + { 40, 17 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 0, 0 }, - { 40, 25 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, + { 39, 17 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 37, 11 }, - { 36, 10 }, + { 38, 11 }, + { 37, 10 }, { 0, 0 }, { 0, 0 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 38, 38 }, + { 41, 41 }, { 0, 0 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 38, 38 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 44, 34 }, - { 53, 50 }, - { 29, 4 }, - { 42, 31 }, - { 49, 44 }, - { 46, 41 }, - { 33, 8 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 41, 29 }, - { 50, 45 }, - { 31, 6 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 41, 41 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 46, 35 }, + { 55, 52 }, + { 30, 4 }, + { 44, 32 }, + { 51, 46 }, { 48, 43 }, - { 39, 39 }, - { 43, 32 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 39, 39 }, - { 0, 22 }, - { 0, 22 }, - { 0, 22 }, - { 0, 22 }, - { 0, 22 }, - { 0, 22 }, - { 0, 22 }, - { 0, 22 }, - { 0, 22 }, - { 0, 22 }, + { 34, 8 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 43, 30 }, + { 52, 47 }, + { 32, 6 }, + { 50, 45 }, + { 42, 42 }, + { 45, 33 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, + { 42, 42 }, { 0, 24 }, { 0, 24 }, { 0, 24 }, @@ -544,57 +555,67 @@ void YYLEXNAME::yytables() { 0, 24 }, { 0, 24 }, { 0, 24 }, - { 26, 2 }, + { 0, 26 }, + { 0, 26 }, + { 0, 26 }, + { 0, 26 }, + { 0, 26 }, + { 0, 26 }, + { 0, 26 }, + { 0, 26 }, + { 0, 26 }, + { 0, 26 }, { 27, 2 }, - { 34, 9 }, - { 23, 23 }, - { 23, 23 }, - { 23, 23 }, - { 23, 23 }, - { 23, 23 }, - { 23, 23 }, - { 23, 23 }, - { 23, 23 }, - { 23, 23 }, - { 23, 23 }, - { 45, 35 }, - { 32, 7 }, - { 30, 5 }, - { 52, 49 }, - { 47, 42 }, - { 51, 48 }, + { 28, 2 }, { 35, 9 }, + { 25, 25 }, + { 25, 25 }, + { 25, 25 }, + { 25, 25 }, + { 25, 25 }, + { 25, 25 }, + { 25, 25 }, + { 25, 25 }, + { 25, 25 }, + { 25, 25 }, + { 47, 36 }, + { 33, 7 }, + { 31, 5 }, + { 54, 51 }, + { 49, 44 }, + { 53, 50 }, + { 36, 9 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 26, 2 }, + { 27, 2 }, { 11, 2 }, { 0, 0 }, - { 54, 2 }, - { 22, 2 }, + { 56, 2 }, + { 24, 2 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 17, 2 }, - { 18, 2 }, - { 0, 0 }, + { 19, 2 }, + { 20, 2 }, + { 16, 2 }, { 14, 2 }, - { 21, 2 }, + { 23, 2 }, { 15, 2 }, { 0, 0 }, + { 17, 2 }, + { 25, 2 }, + { 25, 2 }, + { 25, 2 }, + { 25, 2 }, + { 25, 2 }, + { 25, 2 }, + { 25, 2 }, + { 25, 2 }, + { 25, 2 }, { 25, 2 }, - { 23, 2 }, - { 23, 2 }, - { 23, 2 }, - { 23, 2 }, - { 23, 2 }, - { 23, 2 }, - { 23, 2 }, - { 23, 2 }, - { 23, 2 }, - { 23, 2 }, { 0, 0 }, - { 16, 2 }, + { 18, 2 }, { 12, 2 }, { 10, 2 }, { 13, 2 }, @@ -630,7 +651,7 @@ void YYLEXNAME::yytables() { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 24, 2 }, + { 26, 2 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, @@ -658,68 +679,70 @@ void YYLEXNAME::yytables() { 0, 0 }, { 0, 0 }, { 0, 0 }, - { 19, 2 }, + { 21, 2 }, { 0, 0 }, - { 20, 2 } + { 22, 2 } }; yytransition = transition; static const yystate_t YYNEARFAR YYBASED_CODE state[] = { { 0, 0, 0 }, { 2, 1, 0 }, - { -28, 210, 0 }, + { -29, 210, 0 }, { 0, 0, 2 }, - { 50, 20, 29 }, - { 0, 132, 29 }, - { 43, 61, 29 }, - { 0, 129, 29 }, - { 29, 29, 29 }, - { 0, 124, 29 }, + { 52, 20, 32 }, + { 0, 132, 32 }, + { 45, 61, 32 }, + { 0, 129, 32 }, + { 30, 29, 32 }, + { 0, 124, 32 }, { 11, 2, 10 }, - { 0, 1, 29 }, + { 0, 1, 32 }, { 0, 0, 13 }, { 0, 0, 14 }, { 0, 0, 15 }, { 0, 0, 16 }, { 0, 0, 17 }, - { 0, 0, 18 }, + { 0, 1, 18 }, { 0, 0, 19 }, { 0, 0, 20 }, { 0, 0, 21 }, { 0, 0, 22 }, - { 38, 151, 29 }, - { 0, 174, 24 }, - { 39, 161, 29 }, - { 0, 1, 29 }, - { 0, 1, 27 }, - { 0, 0, 28 }, - { 0, 0, 29 }, + { 0, 0, 23 }, + { 0, 0, 24 }, + { 41, 151, 32 }, + { 0, 174, 26 }, + { 42, 161, 32 }, + { 0, 1, 30 }, + { 0, 0, 31 }, + { 0, 0, 32 }, { 0, 56, 0 }, { 0, 0, 4 }, - { 44, 22, 0 }, - { 35, 67, 0 }, + { 46, 22, 0 }, + { 36, 67, 0 }, { 0, 0, 7 }, { 0, 17, 0 }, { 0, 127, 0 }, { 0, 0, 11 }, { 0, 0, 12 }, - { 50, 1, 23 }, - { 50, 76, 25 }, - { -40, 1, 26 }, + { -39, 1, 28 }, + { 0, 0, 29 }, + { 52, 1, 25 }, + { 52, 76, 27 }, { 0, 27, 0 }, - { 49, 135, 0 }, + { 51, 135, 0 }, { 0, 62, 0 }, { 0, 23, 0 }, { 0, 58, 0 }, { 0, 0, 3 }, { 0, 0, 5 }, - { 49, 136, 0 }, + { 51, 136, 0 }, { 0, 134, 0 }, { 0, 19, 0 }, { 0, 0, 6 }, { 0, 0, 8 }, { 0, 0, 9 }, - { -54, 2, 1 } + { -56, 2, 1 } }; yystate = state; @@ -753,6 +776,9 @@ void YYLEXNAME::yytables() 0, 0, 0, + 0, + 0, + 0, 0 }; yybackup = backup; diff --git a/Utils/Scripter/lexer.h b/Utils/Scripter/lexer.h index aebafc298..26b7054ea 100644 --- a/Utils/Scripter/lexer.h +++ b/Utils/Scripter/lexer.h @@ -31,11 +31,12 @@ public: private: void unexpectedChar(); + void comment(); class myparser *m_currentParser; -#line 39 "C:\\spongebob\\Utils\\scripter\\lexer.h" +#line 40 "C:\\spongebob\\Utils\\scripter\\lexer.h" }; #ifndef YYLEXNAME diff --git a/Utils/Scripter/lexer.l b/Utils/Scripter/lexer.l index 5da2a75ca..c0704dd72 100644 --- a/Utils/Scripter/lexer.l +++ b/Utils/Scripter/lexer.l @@ -37,6 +37,7 @@ Date: 07 December 2000 private: void unexpectedChar(); + void comment(); class myparser *m_currentParser; @@ -79,6 +80,8 @@ print {return PRINT;} \> {return GREATERTHAN;} \+ {return PLUS;} \- {return SUBTRACT;} +\* {return MULTIPLY;} +\/ {return DIVIDE;} ; {return END_STMT;} \( {return OPEN_PAR;} \) {return CLOSE_PAR;} @@ -94,6 +97,7 @@ print {return PRINT;} _[a-zA-Z_][a-zA-Z_0-9]* {yylval.functionNumber=lookupFunctionName(yytext+1);return FUNCTION;} \/\/.* {} +\/\* {comment();} [ \t]+ {} \n {} diff --git a/Utils/Scripter/mylexer.cpp b/Utils/Scripter/mylexer.cpp index e285b4263..71dfbd605 100644 --- a/Utils/Scripter/mylexer.cpp +++ b/Utils/Scripter/mylexer.cpp @@ -91,7 +91,16 @@ int mylexer::closeInputFile() ---------------------------------------------------------------------- */ void mylexer::error() { - CPFile::getCurrentFile()->error(yyerr); + CPFile *cp; + cp=CPFile::getCurrentFile(); + if(cp) + { + cp->error(yyerr); + } + else + { + // Hmm.. this happens when you forget '*/' on the end of a comment + } } /*---------------------------------------------------------------------- @@ -213,5 +222,53 @@ void mylexer::unexpectedChar() } } + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void mylexer::comment() +{ + typedef enum CommentState { INCOMMENT,FOUNDASTERISK,OUTOFCOMMENT }; + int nextChar; + CommentState commentState=INCOMMENT; + + do + { + nextChar=yygetchar(); + if(nextChar==-1) + { + printf("END OF FILE FOUND INSIDE COMMENT\n"); + error(); + return; + } + switch(commentState) + { + case INCOMMENT: + if(nextChar=='*') + { + commentState=FOUNDASTERISK; + } + break; + case FOUNDASTERISK: + if(nextChar=='/') + { + commentState=OUTOFCOMMENT; + } + else + { + commentState=INCOMMENT; + } + break; + default: + break; + } + } + while(commentState!=OUTOFCOMMENT); +} + + /*=========================================================================== end */ diff --git a/Utils/Scripter/parser.cpp b/Utils/Scripter/parser.cpp index fc3639c70..f4cf9ff40 100644 --- a/Utils/Scripter/parser.cpp +++ b/Utils/Scripter/parser.cpp @@ -76,7 +76,7 @@ void YYPARSENAME::yyaction(int action) yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 107 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 109 "C:\\spongebob\\Utils\\scripter\\parser.y" s_baseTreeNode=yyattribute(1 - 1).treenode; #line 82 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -89,7 +89,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 3); #endif { -#line 111 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 113 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(STMT_LIST,yyattribute(1 - 2).treenode,yyattribute(2 - 2).treenode); #line 95 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -97,7 +97,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; break; case 2: { -#line 112 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 114 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(EMPTY_STMT); #line 103 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -109,7 +109,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 116 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 118 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(EMPTY_STMT); #line 115 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -122,7 +122,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 3); #endif { -#line 117 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 119 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(STOP_STMT); #line 128 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -135,7 +135,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 3); #endif { -#line 118 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 120 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(PAUSE_STMT); #line 141 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -148,7 +148,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 6); #endif { -#line 119 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 121 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(PRINT_STMT,yyattribute(3 - 5).treenode); #line 154 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -161,7 +161,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 3); #endif { -#line 120 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 122 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 2).treenode; #line 167 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -174,7 +174,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 6); #endif { -#line 121 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 123 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(IF_STMT,yyattribute(3 - 5).treenode,yyattribute(5 - 5).treenode); #line 180 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -187,7 +187,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 8); #endif { -#line 122 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 124 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(IFELSE_STMT,yyattribute(3 - 7).treenode,yyattribute(5 - 7).treenode,yyattribute(7 - 7).treenode); #line 193 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -200,7 +200,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 6); #endif { -#line 123 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 125 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(WHILE_STMT,yyattribute(3 - 5).treenode,yyattribute(5 - 5).treenode); #line 206 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -213,7 +213,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 8); #endif { -#line 124 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 126 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(DOWHILE_STMT,yyattribute(2 - 7).treenode,yyattribute(5 - 7).treenode); #line 219 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -226,7 +226,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 125 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 127 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(STMT_LIST,yyattribute(2 - 3).treenode); #line 232 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -239,7 +239,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 3); #endif { -#line 126 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 128 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(STMT_LIST,yyattribute(1 - 2).treenode,new CTreeNode(POP_STMT)); #line 245 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -252,7 +252,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 131 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 133 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(ASSIGN_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); #line 258 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -261,12 +261,12 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; case 15: { #ifdef YYDEBUG - YYSTYPE YYFAR* yya[4]; - yyinitdebug((void YYFAR**)yya, 4); + YYSTYPE YYFAR* yya[2]; + yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 136 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(2 - 3).treenode; +#line 138 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 1).treenode; #line 271 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -278,7 +278,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 137 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 139 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 1).treenode; #line 284 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -291,7 +291,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 138 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 140 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 1).treenode; #line 297 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -304,7 +304,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 139 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 141 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 1).treenode; #line 310 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -313,12 +313,12 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; case 19: { #ifdef YYDEBUG - YYSTYPE YYFAR* yya[2]; - yyinitdebug((void YYFAR**)yya, 2); + YYSTYPE YYFAR* yya[4]; + yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 140 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 1).treenode; +#line 145 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(EQUAL_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); #line 323 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -330,8 +330,8 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 144 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(EQUAL_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); +#line 149 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(NOTEQUAL_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); #line 336 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -343,8 +343,8 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 148 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(NOTEQUAL_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); +#line 153 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(LESSTHAN_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); #line 349 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -356,8 +356,8 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 152 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(LESSTHAN_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); +#line 157 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(GREATERTHAN_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); #line 362 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -365,12 +365,12 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; case 23: { #ifdef YYDEBUG - YYSTYPE YYFAR* yya[4]; - yyinitdebug((void YYFAR**)yya, 4); + YYSTYPE YYFAR* yya[2]; + yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 156 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(GREATERTHAN_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); +#line 162 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(VARIABLE_EXPR,yyattribute(1 - 1).variableIdx); #line 375 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -382,8 +382,8 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 161 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(VARIABLE_EXPR,yyattribute(1 - 1).variableIdx); +#line 166 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(VALUE_EXPR,yyattribute(1 - 1).value); #line 388 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -391,12 +391,12 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; case 25: { #ifdef YYDEBUG - YYSTYPE YYFAR* yya[2]; - yyinitdebug((void YYFAR**)yya, 2); + YYSTYPE YYFAR* yya[4]; + yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 165 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(VALUE_EXPR,yyattribute(1 - 1).value); +#line 167 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(2 - 3).treenode; #line 401 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -408,7 +408,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 2); #endif { -#line 166 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 168 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(VARIABLE_EXPR,yyattribute(1 - 1).variableIdx); #line 414 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -421,7 +421,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 169 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 171 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(PLUS_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); #line 427 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -434,7 +434,7 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 170 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 172 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(SUBTRACT_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); #line 440 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } @@ -443,12 +443,12 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; case 29: { #ifdef YYDEBUG - YYSTYPE YYFAR* yya[2]; - yyinitdebug((void YYFAR**)yya, 2); + YYSTYPE YYFAR* yya[4]; + yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 171 "C:\\spongebob\\Utils\\scripter\\parser.y" -(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 1).treenode; +#line 173 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(MULTIPLY_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); #line 453 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } @@ -456,26 +456,52 @@ s_baseTreeNode=yyattribute(1 - 1).treenode; case 30: { #ifdef YYDEBUG - YYSTYPE YYFAR* yya[3]; - yyinitdebug((void YYFAR**)yya, 3); + YYSTYPE YYFAR* yya[4]; + yyinitdebug((void YYFAR**)yya, 4); #endif { -#line 176 "C:\\spongebob\\Utils\\scripter\\parser.y" -if(yyattribute(1 - 2).functionNumber!=-1){m_functionNumber=yyattribute(1 - 2).functionNumber;m_functionArgs=getFunctionArgs(yyattribute(1 - 2).functionNumber);} +#line 174 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(DIVIDE_EXPR,yyattribute(1 - 3).treenode,yyattribute(3 - 3).treenode); #line 466 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; case 31: { +#ifdef YYDEBUG + YYSTYPE YYFAR* yya[2]; + yyinitdebug((void YYFAR**)yya, 2); +#endif + { +#line 175 "C:\\spongebob\\Utils\\scripter\\parser.y" +(*(YYSTYPE YYFAR*)yyvalptr).treenode=yyattribute(1 - 1).treenode; +#line 479 "C:\\spongebob\\Utils\\scripter\\parser.cpp" + } + } + break; + case 32: + { +#ifdef YYDEBUG + YYSTYPE YYFAR* yya[3]; + yyinitdebug((void YYFAR**)yya, 3); +#endif + { +#line 180 "C:\\spongebob\\Utils\\scripter\\parser.y" +if(yyattribute(1 - 2).functionNumber!=-1){m_functionNumber=yyattribute(1 - 2).functionNumber;m_functionArgs=getFunctionArgs(yyattribute(1 - 2).functionNumber);} +#line 492 "C:\\spongebob\\Utils\\scripter\\parser.cpp" + } + } + break; + case 33: + { #ifdef YYDEBUG YYSTYPE YYFAR* yya[5]; yyinitdebug((void YYFAR**)yya, 5); #endif { -#line 177 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 181 "C:\\spongebob\\Utils\\scripter\\parser.y" (*(YYSTYPE YYFAR*)yyvalptr).treenode=new CTreeNode(STMT_LIST,m_functionArgs,new CTreeNode(FUNCTION_EXPR,m_functionNumber)); -#line 479 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 505 "C:\\spongebob\\Utils\\scripter\\parser.cpp" } } break; @@ -484,14 +510,14 @@ if(yyattribute(1 - 2).functionNumber!=-1){m_functionNumber=yyattribute(1 - 2).fu break; } } -#line 182 "C:\\spongebob\\Utils\\scripter\\parser.y" +#line 186 "C:\\spongebob\\Utils\\scripter\\parser.y" ///////////////////////////////////////////////////////////////////////////// // programs section -#line 495 "C:\\spongebob\\Utils\\scripter\\parser.cpp" +#line 521 "C:\\spongebob\\Utils\\scripter\\parser.cpp" void YYPARSENAME::yytables() { yyattribute_size = sizeof(YYSTYPE); @@ -515,14 +541,16 @@ void YYPARSENAME::yytables() { "GREATERTHAN", 268 }, { "PLUS", 269 }, { "SUBTRACT", 270 }, - { "END_STMT", 271 }, - { "OPEN_PAR", 272 }, - { "CLOSE_PAR", 273 }, - { "BEGIN_CS", 274 }, - { "END_CS", 275 }, - { "VARIABLE", 277 }, - { "VALUE", 278 }, - { "FUNCTION", 279 }, + { "MULTIPLY", 271 }, + { "DIVIDE", 272 }, + { "END_STMT", 273 }, + { "OPEN_PAR", 274 }, + { "CLOSE_PAR", 275 }, + { "BEGIN_CS", 276 }, + { "END_CS", 277 }, + { "VARIABLE", 279 }, + { "VALUE", 280 }, + { "FUNCTION", 281 }, { NULL, 0 } }; yysymbol = symbol; @@ -544,7 +572,6 @@ void YYPARSENAME::yytables() "statement: BEGIN_CS statement_list END_CS", "statement: function END_STMT", "assign_expression: variable ASSIGN value", - "expression: OPEN_PAR expression CLOSE_PAR", "expression: equal_expression", "expression: notequal_expression", "expression: lessthan_expression", @@ -555,9 +582,12 @@ void YYPARSENAME::yytables() "greaterthan_expression: value GREATERTHAN value", "variable: VARIABLE", "value: VALUE", + "value: OPEN_PAR value CLOSE_PAR", "value: VARIABLE", "value: value PLUS value", "value: value SUBTRACT value", + "value: value MULTIPLY value", + "value: value DIVIDE value", "value: function", "$$1:", "function: FUNCTION OPEN_PAR $$1 CLOSE_PAR" @@ -582,89 +612,114 @@ void YYPARSENAME::yytables() { 3, 3, 12 }, { 3, 2, 13 }, { 4, 3, 14 }, - { 5, 3, 15 }, + { 5, 1, 15 }, { 5, 1, 16 }, { 5, 1, 17 }, { 5, 1, 18 }, - { 5, 1, 19 }, - { 6, 3, 20 }, - { 7, 3, 21 }, - { 8, 3, 22 }, - { 9, 3, 23 }, - { 10, 1, 24 }, - { 11, 1, 25 }, + { 6, 3, 19 }, + { 7, 3, 20 }, + { 8, 3, 21 }, + { 9, 3, 22 }, + { 10, 1, 23 }, + { 11, 1, 24 }, + { 11, 3, 25 }, { 11, 1, 26 }, { 11, 3, 27 }, { 11, 3, 28 }, - { 11, 1, 29 }, - { 13, 0, 30 }, - { 12, 4, 31 } + { 11, 3, 29 }, + { 11, 3, 30 }, + { 11, 1, 31 }, + { 13, 0, 32 }, + { 12, 4, 33 } }; yyreduction = reduction; static const yytokenaction_t YYNEARFAR YYBASED_CODE tokenaction[] = { - { 67, YYAT_SHIFT, 3 }, - { 67, YYAT_SHIFT, 4 }, - { 68, YYAT_SHIFT, 70 }, - { 67, YYAT_SHIFT, 5 }, - { 67, YYAT_SHIFT, 6 }, - { 67, YYAT_SHIFT, 7 }, - { 67, YYAT_SHIFT, 8 }, + { 71, YYAT_SHIFT, 3 }, + { 71, YYAT_SHIFT, 4 }, + { 72, YYAT_SHIFT, 74 }, + { 71, YYAT_SHIFT, 5 }, + { 71, YYAT_SHIFT, 6 }, + { 71, YYAT_SHIFT, 7 }, + { 71, YYAT_SHIFT, 8 }, { 2, YYAT_SHIFT, 3 }, { 2, YYAT_SHIFT, 4 }, - { 65, YYAT_SHIFT, 68 }, + { 69, YYAT_SHIFT, 72 }, { 2, YYAT_SHIFT, 5 }, { 2, YYAT_SHIFT, 6 }, { 2, YYAT_SHIFT, 7 }, { 2, YYAT_SHIFT, 8 }, - { 67, YYAT_SHIFT, 9 }, - { 40, YYAT_SHIFT, 50 }, - { 40, YYAT_SHIFT, 51 }, - { 67, YYAT_SHIFT, 10 }, - { 57, YYAT_SHIFT, 67 }, - { 40, YYAT_SHIFT, 54 }, - { 67, YYAT_SHIFT, 11 }, + { 59, YYAT_SHIFT, 71 }, + { 56, YYAT_SHIFT, 70 }, + { 71, YYAT_SHIFT, 9 }, + { 42, YYAT_SHIFT, 57 }, + { 40, YYAT_SHIFT, 56 }, + { 71, YYAT_SHIFT, 10 }, + { 39, YYAT_SHIFT, 55 }, + { 38, YYAT_SHIFT, 54 }, + { 71, YYAT_SHIFT, 11 }, { 2, YYAT_SHIFT, 9 }, - { 67, YYAT_SHIFT, 12 }, - { 54, YYAT_SHIFT, 66 }, + { 71, YYAT_SHIFT, 12 }, + { 31, YYAT_SHIFT, 45 }, { 2, YYAT_SHIFT, 10 }, - { 63, YYAT_SHIFT, 50 }, - { 63, YYAT_SHIFT, 51 }, + { 23, YYAT_SHIFT, 41 }, + { 20, YYAT_SHIFT, 39 }, { 2, YYAT_SHIFT, 11 }, - { 51, YYAT_ERROR, 0 }, + { 16, YYAT_SHIFT, 27 }, { 2, YYAT_SHIFT, 12 }, { 36, YYAT_SHIFT, 46 }, { 36, YYAT_SHIFT, 47 }, { 36, YYAT_SHIFT, 48 }, { 36, YYAT_SHIFT, 49 }, - { 53, YYAT_SHIFT, 28 }, - { 62, YYAT_SHIFT, 50 }, - { 62, YYAT_SHIFT, 51 }, - { 44, YYAT_SHIFT, 56 }, - { 36, YYAT_ERROR, 0 }, - { 53, YYAT_SHIFT, 29 }, - { 53, YYAT_SHIFT, 30 }, - { 53, YYAT_SHIFT, 12 }, - { 61, YYAT_SHIFT, 50 }, - { 61, YYAT_SHIFT, 51 }, - { 60, YYAT_SHIFT, 50 }, - { 60, YYAT_SHIFT, 51 }, - { 59, YYAT_SHIFT, 50 }, - { 59, YYAT_SHIFT, 51 }, - { 58, YYAT_SHIFT, 50 }, - { 58, YYAT_SHIFT, 51 }, - { 43, YYAT_SHIFT, 50 }, - { 43, YYAT_SHIFT, 51 }, - { 42, YYAT_SHIFT, 55 }, - { 39, YYAT_SHIFT, 53 }, - { 38, YYAT_SHIFT, 52 }, - { 31, YYAT_SHIFT, 45 }, - { 23, YYAT_SHIFT, 41 }, - { 20, YYAT_SHIFT, 39 }, - { 16, YYAT_SHIFT, 27 }, { 15, YYAT_SHIFT, 26 }, + { 44, YYAT_SHIFT, 50 }, + { 44, YYAT_SHIFT, 51 }, + { 44, YYAT_SHIFT, 52 }, + { 44, YYAT_SHIFT, 53 }, + { 55, YYAT_SHIFT, 28 }, + { 36, YYAT_ERROR, 0 }, + { 44, YYAT_SHIFT, 58 }, { 14, YYAT_SHIFT, 25 }, { 12, YYAT_SHIFT, 24 }, + { 55, YYAT_SHIFT, 29 }, + { 55, YYAT_SHIFT, 30 }, + { 55, YYAT_SHIFT, 12 }, + { 67, YYAT_SHIFT, 50 }, + { 67, YYAT_SHIFT, 51 }, + { 67, YYAT_SHIFT, 52 }, + { 67, YYAT_SHIFT, 53 }, + { 66, YYAT_SHIFT, 50 }, + { 66, YYAT_SHIFT, 51 }, + { 66, YYAT_SHIFT, 52 }, + { 66, YYAT_SHIFT, 53 }, + { 65, YYAT_SHIFT, 50 }, + { 65, YYAT_SHIFT, 51 }, + { 65, YYAT_SHIFT, 52 }, + { 65, YYAT_SHIFT, 53 }, + { 64, YYAT_SHIFT, 50 }, + { 64, YYAT_SHIFT, 51 }, + { 64, YYAT_SHIFT, 52 }, + { 64, YYAT_SHIFT, 53 }, + { 63, YYAT_SHIFT, 50 }, + { 63, YYAT_SHIFT, 51 }, + { 63, YYAT_SHIFT, 52 }, + { 63, YYAT_SHIFT, 53 }, + { 62, YYAT_SHIFT, 50 }, + { 62, YYAT_SHIFT, 51 }, + { 62, YYAT_SHIFT, 52 }, + { 62, YYAT_SHIFT, 53 }, + { 61, YYAT_SHIFT, 50 }, + { 61, YYAT_SHIFT, 51 }, + { 61, YYAT_SHIFT, 52 }, + { 61, YYAT_SHIFT, 53 }, + { 60, YYAT_SHIFT, 50 }, + { 60, YYAT_SHIFT, 51 }, + { 60, YYAT_SHIFT, 52 }, + { 60, YYAT_SHIFT, 53 }, + { 43, YYAT_SHIFT, 50 }, + { 43, YYAT_SHIFT, 51 }, + { 43, YYAT_SHIFT, 52 }, + { 43, YYAT_SHIFT, 53 }, { 8, YYAT_SHIFT, 22 }, { 7, YYAT_SHIFT, 21 }, { 5, YYAT_SHIFT, 19 }, @@ -673,105 +728,111 @@ void YYPARSENAME::yytables() { 1, YYAT_ACCEPT, 0 } }; yytokenaction = tokenaction; - yytokenaction_size = 68; + yytokenaction_size = 91; static const yystateaction_t YYNEARFAR YYBASED_CODE stateaction[] = { { 0, 0, YYAT_REDUCE, 3 }, - { 67, 1, YYAT_ERROR, 0 }, + { 90, 1, YYAT_ERROR, 0 }, { -250, 1, YYAT_REDUCE, 1 }, - { -205, 1, YYAT_DEFAULT, 68 }, - { -207, 1, YYAT_DEFAULT, 39 }, - { -208, 1, YYAT_DEFAULT, 39 }, - { 0, 0, YYAT_DEFAULT, 67 }, - { -208, 1, YYAT_DEFAULT, 68 }, - { -210, 1, YYAT_DEFAULT, 39 }, + { -184, 1, YYAT_DEFAULT, 72 }, + { -186, 1, YYAT_DEFAULT, 39 }, + { -187, 1, YYAT_DEFAULT, 39 }, + { 0, 0, YYAT_DEFAULT, 71 }, + { -187, 1, YYAT_DEFAULT, 72 }, + { -189, 1, YYAT_DEFAULT, 39 }, { 0, 0, YYAT_REDUCE, 4 }, { 0, 0, YYAT_REDUCE, 3 }, - { 0, 0, YYAT_REDUCE, 25 }, - { -211, 1, YYAT_DEFAULT, 39 }, + { 0, 0, YYAT_REDUCE, 24 }, + { -229, 1, YYAT_DEFAULT, 39 }, { 0, 0, YYAT_REDUCE, 2 }, - { -211, 1, YYAT_DEFAULT, 68 }, - { -205, 1, YYAT_ERROR, 0 }, - { -213, 1, YYAT_DEFAULT, 68 }, + { -229, 1, YYAT_DEFAULT, 72 }, + { -228, 1, YYAT_ERROR, 0 }, + { -243, 1, YYAT_DEFAULT, 72 }, { 0, 0, YYAT_REDUCE, 5 }, - { 0, 0, YYAT_DEFAULT, 53 }, - { 0, 0, YYAT_DEFAULT, 53 }, - { -203, 1, YYAT_ERROR, 0 }, + { 0, 0, YYAT_DEFAULT, 55 }, + { 0, 0, YYAT_DEFAULT, 55 }, + { -232, 1, YYAT_ERROR, 0 }, { 0, 0, YYAT_REDUCE, 6 }, - { 0, 0, YYAT_DEFAULT, 51 }, - { -219, 1, YYAT_DEFAULT, 67 }, - { 0, 0, YYAT_REDUCE, 31 }, + { 0, 0, YYAT_DEFAULT, 55 }, + { -250, 1, YYAT_DEFAULT, 71 }, + { 0, 0, YYAT_REDUCE, 33 }, { 0, 0, YYAT_REDUCE, 8 }, - { 0, 0, YYAT_DEFAULT, 51 }, + { 0, 0, YYAT_DEFAULT, 55 }, { 0, 0, YYAT_REDUCE, 14 }, - { 0, 0, YYAT_DEFAULT, 53 }, + { 0, 0, YYAT_DEFAULT, 55 }, { 0, 0, YYAT_REDUCE, 27 }, - { 0, 0, YYAT_REDUCE, 26 }, - { -218, 1, YYAT_DEFAULT, 65 }, + { 0, 0, YYAT_REDUCE, 25 }, + { -250, 1, YYAT_DEFAULT, 69 }, + { 0, 0, YYAT_REDUCE, 16 }, { 0, 0, YYAT_REDUCE, 17 }, { 0, 0, YYAT_REDUCE, 18 }, { 0, 0, YYAT_REDUCE, 19 }, - { 0, 0, YYAT_REDUCE, 20 }, - { -235, 1, YYAT_DEFAULT, 40 }, - { 0, 0, YYAT_REDUCE, 30 }, - { -219, 1, YYAT_DEFAULT, 65 }, - { -219, 1, YYAT_ERROR, 0 }, - { -254, 1, YYAT_DEFAULT, 65 }, - { 0, 0, YYAT_REDUCE, 13 }, - { -221, 1, YYAT_DEFAULT, 65 }, - { -219, 1, YYAT_REDUCE, 15 }, - { -236, 1, YYAT_DEFAULT, 65 }, - { 0, 0, YYAT_DEFAULT, 67 }, - { 0, 0, YYAT_DEFAULT, 51 }, - { 0, 0, YYAT_DEFAULT, 51 }, - { 0, 0, YYAT_DEFAULT, 51 }, - { 0, 0, YYAT_DEFAULT, 51 }, - { 0, 0, YYAT_DEFAULT, 51 }, - { -244, 1, YYAT_DEFAULT, 53 }, - { 0, 0, YYAT_DEFAULT, 67 }, - { -238, 1, YYAT_DEFAULT, 39 }, - { -248, 1, YYAT_DEFAULT, 68 }, + { -233, 1, YYAT_DEFAULT, 44 }, { 0, 0, YYAT_REDUCE, 32 }, - { 0, 0, YYAT_REDUCE, 16 }, - { -241, 1, YYAT_REDUCE, 9 }, - { -221, 1, YYAT_REDUCE, 21 }, - { -223, 1, YYAT_REDUCE, 22 }, - { -225, 1, YYAT_REDUCE, 23 }, - { -227, 1, YYAT_REDUCE, 24 }, - { -234, 1, YYAT_REDUCE, 28 }, - { -244, 1, YYAT_REDUCE, 29 }, + { -254, 1, YYAT_DEFAULT, 69 }, + { -254, 1, YYAT_ERROR, 0 }, + { -257, 1, YYAT_DEFAULT, 44 }, + { 0, 0, YYAT_REDUCE, 13 }, + { -258, 1, YYAT_DEFAULT, 69 }, + { -188, 1, YYAT_REDUCE, 15 }, + { -232, 1, YYAT_DEFAULT, 69 }, + { 0, 0, YYAT_DEFAULT, 71 }, + { 0, 0, YYAT_DEFAULT, 55 }, + { 0, 0, YYAT_DEFAULT, 55 }, + { 0, 0, YYAT_DEFAULT, 55 }, + { 0, 0, YYAT_DEFAULT, 55 }, + { 0, 0, YYAT_DEFAULT, 55 }, + { 0, 0, YYAT_DEFAULT, 55 }, + { 0, 0, YYAT_DEFAULT, 55 }, + { 0, 0, YYAT_DEFAULT, 55 }, + { 0, 0, YYAT_DEFAULT, 71 }, + { -233, 1, YYAT_DEFAULT, 39 }, + { -258, 1, YYAT_DEFAULT, 72 }, + { 0, 0, YYAT_REDUCE, 34 }, + { 0, 0, YYAT_REDUCE, 26 }, + { -245, 1, YYAT_REDUCE, 9 }, + { -192, 1, YYAT_REDUCE, 20 }, + { -196, 1, YYAT_REDUCE, 21 }, + { -200, 1, YYAT_REDUCE, 22 }, + { -204, 1, YYAT_REDUCE, 23 }, + { -208, 1, YYAT_REDUCE, 28 }, + { -212, 1, YYAT_REDUCE, 29 }, + { -216, 1, YYAT_REDUCE, 30 }, + { -220, 1, YYAT_REDUCE, 31 }, { 0, 0, YYAT_REDUCE, 11 }, - { -264, 1, YYAT_ERROR, 0 }, + { -266, 1, YYAT_ERROR, 0 }, { 0, 0, YYAT_REDUCE, 7 }, - { -257, 1, YYAT_DEFAULT, 68 }, - { -269, 1, YYAT_ERROR, 0 }, + { -257, 1, YYAT_DEFAULT, 72 }, + { -271, 1, YYAT_ERROR, 0 }, { 0, 0, YYAT_REDUCE, 10 }, { 0, 0, YYAT_REDUCE, 12 } }; yystateaction = stateaction; static const yynontermgoto_t YYNEARFAR YYBASED_CODE nontermgoto[] = { - { 53, 65 }, - { 53, 32 }, - { 53, 33 }, - { 53, 34 }, - { 53, 35 }, - { 52, 64 }, - { 53, 36 }, - { 67, 69 }, - { 67, 14 }, - { 51, 63 }, - { 51, 37 }, + { 55, 69 }, + { 55, 32 }, + { 55, 33 }, + { 55, 34 }, + { 55, 35 }, + { 54, 68 }, + { 55, 36 }, + { 71, 73 }, + { 71, 14 }, + { 53, 67 }, + { 53, 37 }, { 0, 1 }, { 0, 2 }, - { 50, 62 }, - { 67, 15 }, - { 49, 61 }, - { 67, 16 }, - { 48, 60 }, - { 47, 59 }, - { 46, 58 }, - { 45, 57 }, + { 52, 66 }, + { 71, 15 }, + { 51, 65 }, + { 71, 16 }, + { 50, 64 }, + { 49, 63 }, + { 48, 62 }, + { 47, 61 }, + { 46, 60 }, + { 45, 59 }, { 28, 44 }, { 26, 43 }, { 24, 42 }, @@ -783,7 +844,7 @@ void YYPARSENAME::yytables() { 6, 20 } }; yynontermgoto = nontermgoto; - yynontermgoto_size = 30; + yynontermgoto_size = 32; static const yystategoto_t YYNEARFAR YYBASED_CODE stategoto[] = { { 10, -1 }, @@ -792,11 +853,11 @@ void YYPARSENAME::yytables() { 0, -1 }, { 0, -1 }, { 0, -1 }, - { 26, 67 }, + { 28, 71 }, { 0, -1 }, { 0, -1 }, { 0, -1 }, - { 26, -1 }, + { 28, -1 }, { 0, -1 }, { 0, -1 }, { 0, -1 }, @@ -804,17 +865,17 @@ void YYPARSENAME::yytables() { 0, -1 }, { 0, -1 }, { 0, -1 }, - { 22, 53 }, - { 21, 53 }, + { 24, 55 }, + { 23, 55 }, { 0, -1 }, { 0, -1 }, - { 14, 51 }, - { 21, 67 }, - { 10, -1 }, - { 0, -1 }, - { 11, 51 }, - { 0, -1 }, { 16, 53 }, + { 23, 71 }, + { 12, -1 }, + { 0, -1 }, + { 13, 53 }, + { 0, -1 }, + { 12, 53 }, { 0, -1 }, { 0, -1 }, { 0, -1 }, @@ -831,15 +892,19 @@ void YYPARSENAME::yytables() { 0, -1 }, { 0, -1 }, { 0, -1 }, - { 17, 67 }, - { 8, 51 }, - { 7, 51 }, - { 6, 51 }, - { 4, 51 }, - { 2, 51 }, + { 19, 71 }, + { 10, 53 }, + { 9, 53 }, + { 8, 53 }, + { 7, 53 }, + { 6, 53 }, + { 4, 53 }, + { 2, 53 }, { -2, -1 }, - { 2, 67 }, - { -5, 51 }, + { 2, 71 }, + { -5, 53 }, + { 0, -1 }, + { 0, -1 }, { 0, -1 }, { 0, -1 }, { 0, -1 }, diff --git a/Utils/Scripter/parser.h b/Utils/Scripter/parser.h index 18555d546..e1241b297 100644 --- a/Utils/Scripter/parser.h +++ b/Utils/Scripter/parser.h @@ -74,13 +74,15 @@ union tagYYSTYPE { #define GREATERTHAN 268 #define PLUS 269 #define SUBTRACT 270 -#define END_STMT 271 -#define OPEN_PAR 272 -#define CLOSE_PAR 273 -#define BEGIN_CS 274 -#define END_CS 275 -#define COMMA 276 -#define VARIABLE 277 -#define VALUE 278 -#define FUNCTION 279 +#define MULTIPLY 271 +#define DIVIDE 272 +#define END_STMT 273 +#define OPEN_PAR 274 +#define CLOSE_PAR 275 +#define BEGIN_CS 276 +#define END_CS 277 +#define COMMA 278 +#define VARIABLE 279 +#define VALUE 280 +#define FUNCTION 281 #endif diff --git a/Utils/Scripter/parser.v b/Utils/Scripter/parser.v index 0324a2a35..7ddbe849d 100644 --- a/Utils/Scripter/parser.v +++ b/Utils/Scripter/parser.v @@ -19,31 +19,33 @@ 15 assign_expression : variable ASSIGN value - 16 expression : OPEN_PAR expression CLOSE_PAR - 17 | equal_expression - 18 | notequal_expression - 19 | lessthan_expression - 20 | greaterthan_expression + 16 expression : equal_expression + 17 | notequal_expression + 18 | lessthan_expression + 19 | greaterthan_expression - 21 equal_expression : value EQUAL value + 20 equal_expression : value EQUAL value - 22 notequal_expression : value NOTEQUAL value + 21 notequal_expression : value NOTEQUAL value - 23 lessthan_expression : value LESSTHAN value + 22 lessthan_expression : value LESSTHAN value - 24 greaterthan_expression : value GREATERTHAN value + 23 greaterthan_expression : value GREATERTHAN value - 25 variable : VARIABLE + 24 variable : VARIABLE - 26 value : VALUE + 25 value : VALUE + 26 | OPEN_PAR value CLOSE_PAR 27 | VARIABLE 28 | value PLUS value 29 | value SUBTRACT value - 30 | function + 30 | value MULTIPLY value + 31 | value DIVIDE value + 32 | function - 31 $$1 : + 33 $$1 : - 32 function : FUNCTION OPEN_PAR $$1 CLOSE_PAR + 34 function : FUNCTION OPEN_PAR $$1 CLOSE_PAR state 0 @@ -151,9 +153,9 @@ state 10 state 11 - variable : VARIABLE . (25) + variable : VARIABLE . (24) - . reduce 25 + . reduce 24 state 12 @@ -242,6 +244,7 @@ state 21 state 22 statement : PRINT OPEN_PAR . value CLOSE_PAR END_STMT + OPEN_PAR shift 28 VARIABLE shift 29 VALUE shift 30 FUNCTION shift 12 @@ -274,9 +277,9 @@ state 23 state 24 function : FUNCTION OPEN_PAR . $$1 CLOSE_PAR - $$1 : . (31) + $$1 : . (33) - . reduce 31 + . reduce 33 $$1 goto 42 @@ -290,6 +293,7 @@ state 25 state 26 assign_expression : variable ASSIGN . value + OPEN_PAR shift 28 VARIABLE shift 29 VALUE shift 30 FUNCTION shift 12 @@ -305,19 +309,14 @@ state 27 state 28 - expression : OPEN_PAR . expression CLOSE_PAR + value : OPEN_PAR . value CLOSE_PAR OPEN_PAR shift 28 VARIABLE shift 29 VALUE shift 30 FUNCTION shift 12 - expression goto 44 - equal_expression goto 32 - notequal_expression goto 33 - lessthan_expression goto 34 - greaterthan_expression goto 35 - value goto 36 + value goto 44 function goto 37 @@ -328,9 +327,9 @@ state 29 state 30 - value : VALUE . (26) + value : VALUE . (25) - . reduce 26 + . reduce 25 state 31 @@ -341,29 +340,29 @@ state 31 state 32 - expression : equal_expression . (17) + expression : equal_expression . (16) + + . reduce 16 + + +state 33 + expression : notequal_expression . (17) . reduce 17 -state 33 - expression : notequal_expression . (18) +state 34 + expression : lessthan_expression . (18) . reduce 18 -state 34 - expression : lessthan_expression . (19) +state 35 + expression : greaterthan_expression . (19) . reduce 19 -state 35 - expression : greaterthan_expression . (20) - - . reduce 20 - - state 36 equal_expression : value . EQUAL value notequal_expression : value . NOTEQUAL value @@ -371,6 +370,8 @@ state 36 greaterthan_expression : value . GREATERTHAN value value : value . PLUS value value : value . SUBTRACT value + value : value . MULTIPLY value + value : value . DIVIDE value EQUAL shift 46 NOTEQUAL shift 47 @@ -378,34 +379,40 @@ state 36 GREATERTHAN shift 49 PLUS shift 50 SUBTRACT shift 51 + MULTIPLY shift 52 + DIVIDE shift 53 state 37 - value : function . (30) + value : function . (32) - . reduce 30 + . reduce 32 state 38 statement : WHILE OPEN_PAR expression . CLOSE_PAR statement - CLOSE_PAR shift 52 + CLOSE_PAR shift 54 state 39 statement : DO statement WHILE . OPEN_PAR expression CLOSE_PAR END_STMT - OPEN_PAR shift 53 + OPEN_PAR shift 55 state 40 statement : PRINT OPEN_PAR value . CLOSE_PAR END_STMT value : value . PLUS value value : value . SUBTRACT value + value : value . MULTIPLY value + value : value . DIVIDE value PLUS shift 50 SUBTRACT shift 51 - CLOSE_PAR shift 54 + MULTIPLY shift 52 + DIVIDE shift 53 + CLOSE_PAR shift 56 state 41 @@ -417,23 +424,35 @@ state 41 state 42 function : FUNCTION OPEN_PAR $$1 . CLOSE_PAR - CLOSE_PAR shift 55 + CLOSE_PAR shift 57 state 43 assign_expression : variable ASSIGN value . (15) value : value . PLUS value value : value . SUBTRACT value + value : value . MULTIPLY value + value : value . DIVIDE value PLUS shift 50 SUBTRACT shift 51 + MULTIPLY shift 52 + DIVIDE shift 53 . reduce 15 state 44 - expression : OPEN_PAR expression . CLOSE_PAR + value : OPEN_PAR value . CLOSE_PAR + value : value . PLUS value + value : value . SUBTRACT value + value : value . MULTIPLY value + value : value . DIVIDE value - CLOSE_PAR shift 56 + PLUS shift 50 + SUBTRACT shift 51 + MULTIPLY shift 52 + DIVIDE shift 53 + CLOSE_PAR shift 58 state 45 @@ -451,7 +470,7 @@ state 45 VARIABLE shift 11 FUNCTION shift 12 - statement goto 57 + statement goto 59 assign_expression goto 14 variable goto 15 function goto 16 @@ -460,28 +479,7 @@ state 45 state 46 equal_expression : value EQUAL . value - VARIABLE shift 29 - VALUE shift 30 - FUNCTION shift 12 - - value goto 58 - function goto 37 - - -state 47 - notequal_expression : value NOTEQUAL . value - - VARIABLE shift 29 - VALUE shift 30 - FUNCTION shift 12 - - value goto 59 - function goto 37 - - -state 48 - lessthan_expression : value LESSTHAN . value - + OPEN_PAR shift 28 VARIABLE shift 29 VALUE shift 30 FUNCTION shift 12 @@ -490,9 +488,10 @@ state 48 function goto 37 -state 49 - greaterthan_expression : value GREATERTHAN . value +state 47 + notequal_expression : value NOTEQUAL . value + OPEN_PAR shift 28 VARIABLE shift 29 VALUE shift 30 FUNCTION shift 12 @@ -501,9 +500,10 @@ state 49 function goto 37 -state 50 - value : value PLUS . value +state 48 + lessthan_expression : value LESSTHAN . value + OPEN_PAR shift 28 VARIABLE shift 29 VALUE shift 30 FUNCTION shift 12 @@ -512,9 +512,10 @@ state 50 function goto 37 -state 51 - value : value SUBTRACT . value +state 49 + greaterthan_expression : value GREATERTHAN . value + OPEN_PAR shift 28 VARIABLE shift 29 VALUE shift 30 FUNCTION shift 12 @@ -523,7 +524,55 @@ state 51 function goto 37 +state 50 + value : value PLUS . value + + OPEN_PAR shift 28 + VARIABLE shift 29 + VALUE shift 30 + FUNCTION shift 12 + + value goto 64 + function goto 37 + + +state 51 + value : value SUBTRACT . value + + OPEN_PAR shift 28 + VARIABLE shift 29 + VALUE shift 30 + FUNCTION shift 12 + + value goto 65 + function goto 37 + + state 52 + value : value MULTIPLY . value + + OPEN_PAR shift 28 + VARIABLE shift 29 + VALUE shift 30 + FUNCTION shift 12 + + value goto 66 + function goto 37 + + +state 53 + value : value DIVIDE . value + + OPEN_PAR shift 28 + VARIABLE shift 29 + VALUE shift 30 + FUNCTION shift 12 + + value goto 67 + function goto 37 + + +state 54 statement : WHILE OPEN_PAR expression CLOSE_PAR . statement STOP shift 3 @@ -537,13 +586,13 @@ state 52 VARIABLE shift 11 FUNCTION shift 12 - statement goto 64 + statement goto 68 assign_expression goto 14 variable goto 15 function goto 16 -state 53 +state 55 statement : DO statement WHILE OPEN_PAR . expression CLOSE_PAR END_STMT OPEN_PAR shift 28 @@ -551,7 +600,7 @@ state 53 VALUE shift 30 FUNCTION shift 12 - expression goto 65 + expression goto 69 equal_expression goto 32 notequal_expression goto 33 lessthan_expression goto 34 @@ -560,116 +609,180 @@ state 53 function goto 37 -state 54 +state 56 statement : PRINT OPEN_PAR value CLOSE_PAR . END_STMT - END_STMT shift 66 + END_STMT shift 70 -state 55 - function : FUNCTION OPEN_PAR $$1 CLOSE_PAR . (32) - - . reduce 32 - - -state 56 - expression : OPEN_PAR expression CLOSE_PAR . (16) - - . reduce 16 - - -57: shift-reduce conflict (shift 67, reduce 9) on ELSE state 57 - statement : IF OPEN_PAR expression CLOSE_PAR statement . (9) - statement : IF OPEN_PAR expression CLOSE_PAR statement . ELSE statement + function : FUNCTION OPEN_PAR $$1 CLOSE_PAR . (34) - ELSE shift 67 - . reduce 9 + . reduce 34 state 58 - equal_expression : value EQUAL value . (21) - value : value . PLUS value - value : value . SUBTRACT value + value : OPEN_PAR value CLOSE_PAR . (26) - PLUS shift 50 - SUBTRACT shift 51 - . reduce 21 + . reduce 26 +59: shift-reduce conflict (shift 71, reduce 9) on ELSE state 59 - notequal_expression : value NOTEQUAL value . (22) - value : value . PLUS value - value : value . SUBTRACT value + statement : IF OPEN_PAR expression CLOSE_PAR statement . (9) + statement : IF OPEN_PAR expression CLOSE_PAR statement . ELSE statement - PLUS shift 50 - SUBTRACT shift 51 - . reduce 22 + ELSE shift 71 + . reduce 9 state 60 - lessthan_expression : value LESSTHAN value . (23) + equal_expression : value EQUAL value . (20) value : value . PLUS value value : value . SUBTRACT value + value : value . MULTIPLY value + value : value . DIVIDE value PLUS shift 50 SUBTRACT shift 51 - . reduce 23 + MULTIPLY shift 52 + DIVIDE shift 53 + . reduce 20 state 61 - greaterthan_expression : value GREATERTHAN value . (24) + notequal_expression : value NOTEQUAL value . (21) value : value . PLUS value value : value . SUBTRACT value + value : value . MULTIPLY value + value : value . DIVIDE value PLUS shift 50 SUBTRACT shift 51 - . reduce 24 + MULTIPLY shift 52 + DIVIDE shift 53 + . reduce 21 -62: shift-reduce conflict (shift 50, reduce 28) on PLUS -62: shift-reduce conflict (shift 51, reduce 28) on SUBTRACT state 62 + lessthan_expression : value LESSTHAN value . (22) + value : value . PLUS value + value : value . SUBTRACT value + value : value . MULTIPLY value + value : value . DIVIDE value + + PLUS shift 50 + SUBTRACT shift 51 + MULTIPLY shift 52 + DIVIDE shift 53 + . reduce 22 + + +state 63 + greaterthan_expression : value GREATERTHAN value . (23) + value : value . PLUS value + value : value . SUBTRACT value + value : value . MULTIPLY value + value : value . DIVIDE value + + PLUS shift 50 + SUBTRACT shift 51 + MULTIPLY shift 52 + DIVIDE shift 53 + . reduce 23 + + +64: shift-reduce conflict (shift 50, reduce 28) on PLUS +64: shift-reduce conflict (shift 51, reduce 28) on SUBTRACT +64: shift-reduce conflict (shift 52, reduce 28) on MULTIPLY +64: shift-reduce conflict (shift 53, reduce 28) on DIVIDE +state 64 value : value PLUS value . (28) value : value . PLUS value value : value . SUBTRACT value + value : value . MULTIPLY value + value : value . DIVIDE value PLUS shift 50 SUBTRACT shift 51 + MULTIPLY shift 52 + DIVIDE shift 53 . reduce 28 -63: shift-reduce conflict (shift 50, reduce 29) on PLUS -63: shift-reduce conflict (shift 51, reduce 29) on SUBTRACT -state 63 +65: shift-reduce conflict (shift 50, reduce 29) on PLUS +65: shift-reduce conflict (shift 51, reduce 29) on SUBTRACT +65: shift-reduce conflict (shift 52, reduce 29) on MULTIPLY +65: shift-reduce conflict (shift 53, reduce 29) on DIVIDE +state 65 value : value . PLUS value value : value SUBTRACT value . (29) value : value . SUBTRACT value + value : value . MULTIPLY value + value : value . DIVIDE value PLUS shift 50 SUBTRACT shift 51 + MULTIPLY shift 52 + DIVIDE shift 53 . reduce 29 -state 64 +66: shift-reduce conflict (shift 50, reduce 30) on PLUS +66: shift-reduce conflict (shift 51, reduce 30) on SUBTRACT +66: shift-reduce conflict (shift 52, reduce 30) on MULTIPLY +66: shift-reduce conflict (shift 53, reduce 30) on DIVIDE +state 66 + value : value . PLUS value + value : value . SUBTRACT value + value : value MULTIPLY value . (30) + value : value . MULTIPLY value + value : value . DIVIDE value + + PLUS shift 50 + SUBTRACT shift 51 + MULTIPLY shift 52 + DIVIDE shift 53 + . reduce 30 + + +67: shift-reduce conflict (shift 50, reduce 31) on PLUS +67: shift-reduce conflict (shift 51, reduce 31) on SUBTRACT +67: shift-reduce conflict (shift 52, reduce 31) on MULTIPLY +67: shift-reduce conflict (shift 53, reduce 31) on DIVIDE +state 67 + value : value . PLUS value + value : value . SUBTRACT value + value : value . MULTIPLY value + value : value DIVIDE value . (31) + value : value . DIVIDE value + + PLUS shift 50 + SUBTRACT shift 51 + MULTIPLY shift 52 + DIVIDE shift 53 + . reduce 31 + + +state 68 statement : WHILE OPEN_PAR expression CLOSE_PAR statement . (11) . reduce 11 -state 65 +state 69 statement : DO statement WHILE OPEN_PAR expression . CLOSE_PAR END_STMT - CLOSE_PAR shift 68 + CLOSE_PAR shift 72 -state 66 +state 70 statement : PRINT OPEN_PAR value CLOSE_PAR END_STMT . (7) . reduce 7 -state 67 +state 71 statement : IF OPEN_PAR expression CLOSE_PAR statement ELSE . statement STOP shift 3 @@ -683,34 +796,36 @@ state 67 VARIABLE shift 11 FUNCTION shift 12 - statement goto 69 + statement goto 73 assign_expression goto 14 variable goto 15 function goto 16 -state 68 +state 72 statement : DO statement WHILE OPEN_PAR expression CLOSE_PAR . END_STMT - END_STMT shift 70 + END_STMT shift 74 -state 69 +state 73 statement : IF OPEN_PAR expression CLOSE_PAR statement ELSE statement . (10) . reduce 10 -state 70 +state 74 statement : DO statement WHILE OPEN_PAR expression CLOSE_PAR END_STMT . (12) . reduce 12 -State 57 contains 1 shift-reduce conflict -State 62 contains 2 shift-reduce conflicts -State 63 contains 2 shift-reduce conflicts +State 59 contains 1 shift-reduce conflict +State 64 contains 4 shift-reduce conflicts +State 65 contains 4 shift-reduce conflicts +State 66 contains 4 shift-reduce conflicts +State 67 contains 4 shift-reduce conflicts -24 tokens, 14 nonterminals -33 grammar rules, 71 states +26 tokens, 14 nonterminals +35 grammar rules, 75 states diff --git a/Utils/Scripter/parser.y b/Utils/Scripter/parser.y index 4fa80350f..656ee093e 100644 --- a/Utils/Scripter/parser.y +++ b/Utils/Scripter/parser.y @@ -77,6 +77,8 @@ private: %token GREATERTHAN %token PLUS %token SUBTRACT +%token MULTIPLY +%token DIVIDE %token END_STMT %token OPEN_PAR %token CLOSE_PAR @@ -133,8 +135,7 @@ assign_expression expression - :OPEN_PAR expression CLOSE_PAR {$$=$2;} - |equal_expression {$$=$1;} + :equal_expression {$$=$1;} |notequal_expression {$$=$1;} |lessthan_expression {$$=$1;} |greaterthan_expression {$$=$1;} @@ -163,11 +164,14 @@ variable value :VALUE {$$=new CTreeNode(VALUE_EXPR,$1);} + |OPEN_PAR value CLOSE_PAR {$$=$2;} |VARIABLE {$$=new CTreeNode(VARIABLE_EXPR,$1);} // variable value // |PLUS value {$$=$2;} -// |SUBTRACT value {$$=new CTreeNode(STMT_LIST,$1,new CTreeNode( +// |SUBTRACT value {$$=new CTreeNode(STMT_LIST,CTreeNodeCTreeNode(VALUE_EXPR,$2);} |value PLUS value {$$=new CTreeNode(PLUS_EXPR,$1,$3);} |value SUBTRACT value {$$=new CTreeNode(SUBTRACT_EXPR,$1,$3);} + |value MULTIPLY value {$$=new CTreeNode(MULTIPLY_EXPR,$1,$3);} + |value DIVIDE value {$$=new CTreeNode(DIVIDE_EXPR,$1,$3);} |function {$$=$1;} ; diff --git a/data/Scripts/test.scr b/data/Scripts/test.scr index 898f3d9cb..b2937df47 100644 --- a/data/Scripts/test.scr +++ b/data/Scripts/test.scr @@ -2,29 +2,13 @@ #include data/scripts/defs/charanim.scr -//do -//{ -// print($tmp1); -// $tmp1=$tmp1+1; -// pause; -//} -//while($tmp1<1); -//print(112-_setText(1)); -//do -//{ -// print($tmp1); -// $tmp1=$tmp1+1; -// pause; -//} -//while($tmp1<2); -//print(222); -//stop; +/* +_setCharacterAnimation(CHAR_SPONGEBOB,ANIM_QUIET); +_setText(123); +pause; +*/ -//_setCharacterAnimation(CHAR_SPONGEBOB,ANIM_QUIET); -//_setText(123); -//pause; - #define x $tmp1 #define y $tmp2 #define vx $tmp3 @@ -38,16 +22,14 @@ vy=velocity; while(1==1) { -// readout for fps :) -$tmp0=_getFrameTime(); -//print($tmp0); -$tmp5=50; -do{ - _drawSprite(4,$tmp5,50,10); - $tmp5=$tmp5+15; - $tmp0=$tmp0-1; -}while($tmp0>0); - + // readout for fps :) + $tmp0=_getFrameTime(); + $tmp5=50; + do{ + _drawSprite(4,$tmp5,50,10); + $tmp5=$tmp5+20; + $tmp0=$tmp0-1; + }while($tmp0>0); _drawSprite(0,x,y,100); $tmp0=_getFrameTime(); diff --git a/source/script/script.cpp b/source/script/script.cpp index 19aa0c1f9..4b633def4 100644 --- a/source/script/script.cpp +++ b/source/script/script.cpp @@ -295,6 +295,32 @@ PAUL_DBGMSG("pc:0x%04d sp:%03d",m_pc*2,m_sp); push(val1+val2); break; + case OP_MULTIPLY: // value, value pushes result to stack + val1=pop(); + val2=pop(); +#ifdef FULL_CODE_OUTPUT + PAUL_DBGMSG("MULTIPLY %d,%d",val1,val2); +#endif + push(val1*val2); + break; + + case OP_DIVIDE: // value, value pushes result to stack + val1=pop(); + val2=pop(); +#ifdef FULL_CODE_OUTPUT + PAUL_DBGMSG("DIVIDE %d,%d",val1,val2); +#endif + if(val2==0) + { + SYSTEM_DBGMSG("[SCRIPT] DIVIDE BY ZERO @%d",m_pc); + m_state=CRASHED_DIVIDE_BY_ZERO; + } + else + { + push(val1/val2); + } + break; + case OP_NEG: // value pushes result to stack val1=pop(); #ifdef FULL_CODE_OUTPUT @@ -327,7 +353,7 @@ PAUL_DBGMSG("pc:0x%04d sp:%03d",m_pc*2,m_sp); break; default: - PAUL_DBGMSG("ILLEGAL OPCODE@%d ( %d )",m_pc,instruction); + SYSTEM_DBGMSG("[SCRIPT] ILLEGAL OPCODE@%d ( %d )",m_pc,instruction); m_state=CRASHED_ILLEGAL_OPCODE; break; } diff --git a/source/script/script.h b/source/script/script.h index a4820a873..37e96ebb6 100644 --- a/source/script/script.h +++ b/source/script/script.h @@ -78,6 +78,7 @@ private: STOPPED_STACK_NOT_EMPTY, CRASHED_ILLEGAL_OPCODE, + CRASHED_DIVIDE_BY_ZERO, }ScriptState; enum @@ -104,6 +105,8 @@ private: OP_IS_GREATERTHAN_VALUE,// value, value pushes result ( 0 or 1 ) to stack OP_ASSIGN, // varidx, value OP_ADD, // value, value pushes result to stack + OP_MULTIPLY, // value, value pushes result to stack + OP_DIVIDE, // value, value pushes result to stack OP_NEG, // value pushes result to stack OP_PRINT, // value OP_CALL_FUNCTION, // functionnumber, argcount args pushes return value to stack diff --git a/tools/scripter.exe b/tools/scripter.exe index 54ee53ea026ff9eec8468efdf999efa9684dd783..6dd2867c41386d721b4d14388cb0cf6e7be1ac1b 100644 GIT binary patch delta 32273 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 delta 31174 zcmc${3s{s@*FSvU!vF&e2W3VMauifNaYG_#_zw6xO1LwU%I%*;wl%W4RpqOzn!`F?BP17bbz^?%;~^?lbz*V>1**IsMw zwfA28bUW?e9J7COOm!e+z|)Skjj59QdLfcu7{PVoIIc;;r3f{WKEfV8M>6M>@D1NX za$P4xN_y~91hr%o|H#gzlB#HzUdnL|B^Csi2O=;GM=;lhz-LB~qeif^JA$9W5gem} zU3LWh3HKKfR}wBmj$pD3!I?+|HMt08sSsQ>A;>L2aGq+cAZcT=5ZH+1A&m>+av~f> z^VcqVI)YrHTTFsWB?#u_BN%B!&_Jx1f*%pd6Fh>u z@(?%%Ab5uq?9vUvQmVEWoXri-lZL;Nr27~{5}c($aFPlp65(>HXQzT;q@|LwTo$)e zouAJO)t$p6FMK3y?0j2N#EsV0BLyw6KIbiHI>Kc%58%8-O@Yb6*PSyY(JKW$zPM}D zcq(lp^+8P#vF{qqyGM>MfADFYr}$6>@J;OG#kGN{(|M zmUgV5^9YXdJ*h(MEHG_n^wkP5%3zEhZ21SHqn>{-s$9{|=+d>;)^N_|2pV$g7mQgM{pPpM9ndV^A(k#aS>M9FwU z)=)}8DL+!^6mQ`O_W`~n@cEz24&HIi9?2dh2pS&}OG^SDt`co9u6ZWPx=`8e9cs${ z>QFO*O6`r>#@t2~nR7VUx*B_E>ZqFIrjB*w2n?-|N1)_)w;z;pW0Vf=LBLwTlYr*{uL9lz90Gg@_zZ9n&)r99$}(CqNA_0}246022WZ0tCQofSrIh0K0|P5^9CA#5?#}p)OG`ImV_+@`&bJ zr^<@(fo!V0epR^8IbCwz&F0EWw=?4&;dW7Rhq*GB%Eh_z{vZDs;-$;~F~mdN?L#~c z721dRE6dvFO5N}OV6@Tw4@L#c7^94?55!8KT|1+vmoi3mUHkWMhO*8k1c7)~U+!Kk z=NG5O?pKaQx492WMmrhF1tMu$CZwf|k$kX3xIV~A&ctQ=IG>wQgRbR@XL#T=Id17? zBfQy|@e@jX`}Sf+zjYGGJty$@+e;HYMNM!Oo~knV4EH_?(_01 zl}mi%0;9IU-Z&*y0daK1v2U zF`30dnG`dbRh05n#eoD>nKdyaO0vBS<&iXaMVUo=OQ@YwM45xyWJ<+)SePLa85ff& z_4=qF@boXldqhws#Z2aUN_p1HI>-##mQb*5BFPN%6>Md;Z2%Xv^W&;uJ6lj2x`r~D zl;JA6mER!kl7H!m(I6`+mw0_t5O|a+P>3WAA&Nx>3WXb~>8_1Y%$x-qnV5S>3>%1V zH-U?21r8Q?fXKppMN60k28i19Zqw!pm_nN{rVVA<2lqT;gTc*In@Jh2xIEPBBcec9 zQ)?I4W)RY(8pTXC-yq?Ev~<@cY!%97zV&735!TtSqdtuAgy@_+RhLl#V#AqO%5W7H zaZY{vvnYv)Jwq87q=n3Lj51It%m#bbP^OU)Nm7VnW}@{*;j{E~S5Fcv^;IQ8EE_|=gB)VdFAEOU)2INAVJ?WJ z3=LH_#(D%L!JiR6ATU8%BuNm(q996n)}KY#*7D#~0m?;lWh;yfpHL-l(_yZt!=yGH zPKb3eh@k^zxQa^XnAcW*7^wFPTIBA1lp>cA;q_56;Qu#dSE-OBohW8H`6%V_9i>r% zic#M6M}Y`B@nX~=bD~`&E6{YAc=Sb*cu*|zpp?f~kFc#>!5$?Pdh{elHcY#|1s;J- zfK6ZwwU;jqns)E?)*`A4H;i^6$GVg)O&>xg>A?E8jxy-dNUx8G0%c6093)90ikU*| zbA-Zf=`Ncnw(2s(vL2O_Sk_~=6Qi46K|z!fpYIYV*&O%=<>Cy~5G9&3EZZB09{Lf! z0hCqe+Ia41r;NCjXPrwV^_^~Gy1Je8>&9D{ZU{0x(Z+N}JLMZhc~j9@L@D+8_O|iN zBg&LOw|h=is8L4{ITr_2G-)0LhQJf|6^+s ztI`?Vy^k{O3cS-G%47<>LK$>LjMqm*fsx32s)WPoom{>|66M=0GV0hXghH?MB^@Nb z^~>9Oab3%+L`G<8FE@|V)Y4%jrIBnAGjVMu?i$X9G^!PR+ zZ0m^N>?Ra+cmaD9(qU1X4iAbt+|j1PDzR!j(}6NvMV6?;cF2s~kG98oeN+&5h$#_= zBq<@JW=4eg;;svSbx$km9u!m2CgwNLqN!gl3O04QC`Q4=P^P`9*`Oo~qp5@s{PBZO zlbPaLAy(*URzjgk&tj`bgMCJutU02r(l%L(#Hvari!$w9Tl0e`i*@Zf%3!c}^7@D< zphezOB|{R;6D-|2xt55Gm=3}5O(=}-&Y})gW1$1{UKdaq?LGQ%u)P&x)hE!6Ih!m!&NLo`G&Ug89-qfOLXs}6jzas+ZXQ&l37w7 z@AVNfu=_hQ0EZ-vF^W;ldDm0Qv)+l&02T?}DoT>&y=%9FU^HytBawju#-IfoY+^t$ zV^Gy1WaOmL+5A}5F*=(oOX+NW@F|!nc+O*I^QH5sF}TaQGQ&d)9-SPQ9v+0@jq~}s z2cQZ&pMQ|z;C==yO2ru*FgDG>9RcK}JGi$27Xh;~99&c;&hLOe-5lI2-5f)>IkKc9PKg3mzBqkdag_3SpIB=vbK-E7xf=T%^HUjN;BA9EU5rVkhO^B7ETf0*12U zkX|fec(B1mS!HkM&5G}wqq!n45!skPA*Qwi@4@v_hr5rd_prfoh|d4)Pl$t(E?uT3 zM@F|Kvf{uP))3hi2afh`D}`KTIQ%&5eakhCQ@al+c=@m(K z=yP^D^?&hvyfEF^JGn0;1>U}o^+}sd2wR2umH>`ekfJL9mV(p^|S z6%;jx9Q716H~1KP*=Q#pEY0dzdVgD~Bv=~SR;r}RCBb5}z*{H{RGt;?&r6WheLAG4>DW-nQ(_)nHJf`lUN?d{)C8vEPwipu^h@+j^9h1n#wt6 zNRUH15FtR2qiqRv3g(<)!D5af##7nvXZ{Bz&YdA8BqdA`U;9{Immcx}@nyQN{Cl-F z)(@N!%FN1??>m$?Y?H!C)4cW$lLbzk5!RZ!blC+0PeC*5fHtiaXM}y`O;CAwby8-ErJr@Yg#G(1=uRHYA-z&|4VVpjB!23`UwYvjxhbr`egAhV*=LW(V!-$xaU(!jRA z(?ta7_zndPMc5;>w^SB*AXs@)2O1_MGFbVIPdc=RzqN9Asw|ZTVonRAYze9NbR>NP zOIQavp9{}eyW||~K*6NQgHlpE6g1q!3kPh;k}aPI=WU5;o{mL5I&zf;hJC`uujUhB zjXfc4^{Ec3enH;q=3KgQiYUAO(1C<05F1orz$s$k>eZpVaRH;~6r_mhP{bHxVoe2( z_0caM-xS?em`{ZPJwj|%7}Wwq&R;PV{Z1ha#y1bhqVZ*g!B1C9XVts;y^{479f z!)o2c3&jJsW;5?y&SM9M;U0LxNvg!{fu(O=P~RoA49XE4gK{LZPYUIOGF-}&XmArP zI+!DYfyl8I-uRGwlBcq{aiDjce0007`W|?Y7sx>+3*@$uf7DK{aE>55nD1n(0?d#J zi?o@6ULlrF63rmvXxS1X3T{Z=a0(HF)3Q%c#ilZ5Kyi&M16%h|@t&R*7R^MgRQ-jr zPGQ25!Gk67r-Y+}oocq`8hUV?ry$@h3V4dDmoBcRSC@*;NYE2Y?DD<{8|KoeS6-MX zOdF!;+LH;AdJ0YlmqhpC(_F>q@{~ZdP(377V*NmPbx04%x5tIghV)9=bO&pXr{FNC z!G?1$KFn2&1og5zgp|S*$?M03yuxmhULOck3wtJCz?whPE1T&lI_F+|3G$yt6%e;h z6`mchs$db(Um@qU|GXIz`e`p`crDMXD zp}M=LfZu4R;wqkZOt+IJa?wC997A`&kp_5E!R5tjakp@H7ROoXS*jw#8%;G!oK0lf z)+rrKdp~M6hBkbM9jv$DQsYo4cgO95eOOn?!K1>IVOGhvV}rInBWxa?p1Cyw97-oM zD>#=^W_U1DK^fa*;ll8o>4lVzWd$;?lHL@s1~wN5N{-Ovk>TBHg4;@H*bbZElE6Ff zvss1Rk`6cd(Nq-p3OG+eQ{YZi@{YR#4ox3lD0XHL@12u`dq?!Vk|h#fxZlJr4f6s zD|E;UbnifsK@|Bwpy>){9ktC@Dy$uuDEXwgeUM)m*aL^kCV8kaB`C^ynKa*q zhi7yzu}eI}?7j3boe*K5M&Y#*nz5s3e;Kl3(mnbKq_AULhGa>kaBAGpXvpF`g^A$lQLYej#(UFGP|LI>Bq|PTwR?ert5Bf6 zw?r}8xdXMv_llreINF7-5Tp|>^^irOMk|^O&)=95`0E|?;ynn^X)%E^BrteJy(7ew zu8?Fz2^&l2g{-g+6gt(%`$r}6q5O8C=fu&HSy95n6KD6V#fgyZ%YR(JtOebjge&I) zXFFhoxJmc)ZKs{op+uxDY{x+JlE9L;gy$xWy;n!Gmu-{jdnuvs_kQh^LOOMob7r zC6ty`WS>SOopKwjJ~*FBu`^L<6JcVpbCFOy zZGQMBB0OyqKAdKcYNoWxj!I#|$J4q9{qFn$8&u`=Zu|_vI99`LZ<3;Xr!9 z&acah_^?%!J}l(Ua!HJGVdt#Z6p6zJa(gIn*TDz0c=8ABNfZ{`XXg`zJ@@q{s!R7R z2&<=hGU3kI6T%Ynkt`PW&%O=c?EEylKR;_{+WldnVM_?VXJ_wvX-uf%-5IBOh_3xknC=NV)8|$=&94vy)459xrWxwpUvQfdZ z7EFC-P8-$~#C}iMzQO~`loM5LWzoU1x2a6qhP~QPl(Cht#y0H5Aa*rjEp6Bjf>`<{ z1&#iCnKEHeTiG+gvJq5PC`7rl@cBW1cMiWu2m zE(ezm_zmgvfC!|A19X7509yb)z=ME~T*B|}bzxWBy1L?w+cV6DB^brR?lr|b%ba}5O_ZEZ$sH_9V@I_*}}b zD-FC{=;j@jrWlNZ5eNb`xKO-h&XIgfhG^{Ja7(xdi&(Lm!p`>eIw9USBz!ZmKRZ~M=Ia6)YRywVh5Qm>Q-(n3GzDvoO8C@g#!T5%KoHqg#$A#wcxs5*K5lNilc*FTK4X5NPG z7*UUJu<(0!p4sp%AHElroL7blbsKwyal?={?)-UUBp)_{(#vZTKt z`X_|DYT?eBhohE6)7nXM_Cxt-XQz zWvilZN(ZH$#FOnmm8uf4&U4X%`nd$ju4rM{b5r4;UU;qtdbIwzX&JSnV4i=)mrJpQ z86CLK%(!?8E;lM^DU9AMlx$mo3dgrmg*aZ}*MR!||$9XTiFU#;Pm3y&_t4wo_pvG|JI_IER;e!{lqEupDPx(Jz zNRP@8^9IUiy_gjx7xPBSm%R8=lvB(<=$sNOgunE3WGN|A5!R|K6<&R5_vo|OKk=2F zX!qBuoUs(PZB>>bIud%CN}%D&qPP{&^~m5WF|Kk5{4V3r7sf!sgMBfq7{FR8Q7V|9touqVjH--8wwW3aTStA#gWjnJF{P2CT-K! z=&XnpUVAOQZLF9m|K)4=ezRfnma;o#{A*Y}%P5$&M3t@5~J6K<#Xa6~5l7lUx`k zblKHIayC}5?J5f23KLSvW4j9Ci3>g`^(a|l@fEIOsL*d*mJt0$&ZJ9dTF5vV%8;nJ zOt}Kt7K**m6q=)(5YCr-m6Y=+Dd)BZ5ONjKH5AiGE0i`yu#>?BLeO*yOcK_-;V2-2 za;fIjO66rJfwO0eyDp_TaOQ3@upA}FRz_0^t`o5zZt;zX%P0x#5liX9NK?1@r(ru4 zZ;s)!I-0Hlv%RC~Oys$y#0e{RCl42GhD((uve`hcl0V@sN`wFf#5duhB@Ssh(z4=m zNvo18MuQHgfZJ5}Vw_<5v=KWmbrOEwof%%&Nwj3b9+jlJlQ48oVY_iR?&%*h3&rTX zX+aG>-BT2kEu!uXqEv5{#stJJrYjTDbHiIs7we1zyeC@hmCIb^c({=o>W4l9;go;^~b&;8M(fmk8xrMq5Hv{ei86F(W#$CZxlX*bg{A_QL zu=wpL$xp+Cm2W3YE)Ns7yAt6VgEZy z;{fRv*6k4Ukd&*4B{2i=2zkZZ$rIOTW`jiJu}I``FeqTpJ845`fV7RL7#cRLnVu49 zBgVs(HpX5h6?ib^uN-mUMjbw==!!?AX0JHHYh&UC)!qfSjFRnPw~msFA)@s^*lUQt z+3kIt(s;3lmHV`9-T7OPbi%%|7IEcu{wbnZ%U{vZ_*Kw@6MsT;s_Inb^EK_`Gq&nI zC|E9~kuChNPa|uhq3=A~S?Km|H?sBMck_a{+Rnm?cdaqAIXmt9QL5*pa+a!HYSbwh5k>jv~+$Jw_i$me`rFJ*8#REa2N ztT8HK>b@jFdq5i#G^ICKVg7-EZ7qB(h&pn>7DKa^xn>!u&k}(Cqb&E2er}E zgKbotaPZ)CNk+WT^UyGIg!2xKl$RWGaLx*a*tH)X$__6Mrkf9ChW8DoGY)5l%Yx}b zq|XJ1!koiBByeFH4^LN8?|H^urhBK$r%_xk-Hbkrd#{%SJ!(dT+|2h>67=Q9_Y7pO zkKap^Y>yXyd2fhhMZA#rzFIORUbydlZA??0gF6b?45+LVUVXny5{(+Rq{~_>B5(=p zi6#tOq43jzgihj^;$dt_qm?<;up__nn}k1)r16J^#G`)6rD4KrN5|%>DsCEs(&U4` zV{7x@7Uw?By}{-hj^$7jrya9U^vp3qvQZ&ukLSdY&+wG=g@YvjBa|OEgFik3b4K|iX0^@CC>DLJ8+990UQ6a6K7mBQO6dPsIDg>Oz2NtP%D^@kaW zq#IX}MCuiiA8v6U%oyFOR0;QdsFsu}g-st$mSii1KR;B3%Yy<`CzoI=_S(t5*ou91 za)5;EB6RzxkEBT{jQVISv!DB7T-C7(t9$WTuEOAybrBWY`%y(2n|UOxNah{8R7&fQ zm`oh)oY6%XS)U_ubP*QR_mE_C*}1v?kVJB2l5p22Pg4|nIx~C)@j5Y5=yy6}#3q=f zhJphDS$Deq+p--QZ#1EnUL=GkdMja+6dw3S7NR5qk8(4@V8yuZ^o7HgO~T`+Z*yeB z7J)k47j0<SG^vyA!9R&pvJ6nM|cTe`bH%&gC9wQy1ZbGk-?X z?zJLf>Eh;6;pArpF*{gw=VmmGC^FA3j4QhXrvt@-w)wD8c>U1iKVGDg z*W>M$W=-=(VZ|4#T^ZE%mGUE@ECCnN81J@HTCo@xge*aV+!V+X$a9oSYY1H&i29PQ zwG~^=mC<5BAy;YdQ0I}3b-dA3sU&dbi(4uQ>%Z(DnTQ5rzv5M%6Hb2FABX)LUna&= zo7|Rqt}+fq2QG#lS(+pCI@b+Hj}hla=u5wFaNZ+thd_k8K{{9Nz7P^}6#rId&gbl+ z!-?W*TzFhYwt5MIT0s5h!pUzW{_gh#SxhD$1Zl~H}CxU;zd3|#!kAS4M`Y0 zUM1x`<774Roj-h=DZ%MF;`{S_cpOF!X6(*?|IomPXNVc$e1j^Dkr!O@M$4&Q(FN=- zJ&cF9Aa09X==0+vkwoGhcfq5S3-A2+PPj41YH{O3lJLS{=K8;T@!_RGzWsjg)=5E1 zRrJ6+7M&1Ul?tKk=W&sBqX>%=OP#R)=Y;S%9V#4VMK>!P7UG(g_B{b?V_!TRx-T}v znT6t=t}&H1#nSauBrbH=w|W%56T-eGee_wXK(CBmh41WRza;Z#g|5FO-Nw+-xDaiS(A1YG_A^YI6zg^#jf_D6>e)HwW@M}(~>B}{+gJi zN(398St%73v&A0>nzyS#|Z!aHLn{rQT&H_3g;e?8_5dXw~ywq%vl>P4E?QVdM%le!?6j^ zCE#8hn0zno!xF3N7Au_KzUH?+n6>ZxmTae1;(&qCl!7yastdqv$NdqNQ<^xk zV{DXnT%2e9IiRSB;`Sm`JB$43pdyrpq<8;FN)t)s9C5A(`b3a~(jfW$kMvANvabmU zMs*a4x*!#$L8ZGoT6T#H?3|S-thw5?Yd!1sD<~}qe7{HR_RbkRZkiK?_pa9V>&r&u zZRNak$sh1<%1!7N+J9p~p(2`mjd88YjX-Z%Cp_JpJ$5S5Wv?HG$Qzvk8mvb&gOrqR zG}dGg3ZLQ7`H9kv-Mz|e!qI_SzJ-#FoxRaHgbLQo5xV?YYOBW1^WIbPr3d4XFpX=O zD`}K8et<)IWAu^GYOK!eL(-$Iv;$lGJN~&IU@c%P;Mng%?VlPxMY!;10-qr?|5-j@ zRWsAG0@0CzCQ^>Rl;xc4H5^>MGEdRv#=$_4V)X5(gf6diK;#Hp|C%~=1nG(M zQ79$o4+BqD8Sjl=M;m2)Vi-yZ`f!jHn7qmrR4}d?NB4qecO6f*h$dV}^eTj=qUOb& z@iiG*dSqFmPG8l+!B$xtzrebA)Dn~K?Ft3ZGKA&0%rx`@W30aWMq}71iPPB zB_-IFyoIai;IEf2sHVhl_;hMUJQz-IAGgfq+AoZ6^`SjZ?q;=(_@~PlO8Zf^Z*!MD10gd-a*AoeK zy`{?H-!0`Wyv2V-%9q9Lr3#$027FO@_no15dzI`;^4}B2_m-Sa@~;o$dv-Y;laJwg ziS+W0JG=B7a;G(${inkCf|#+%jKL%1;CKRN;*(@VjL7FM0AB?d2Yf5?^Fi|)VkPoF$anwPnXlvd8UB|PeAlR1%xL99oHLUB zA1nCwThc;8Tq8vAT68EOx-0p2BGxOIP483eZcy_7;v+kZfd>-!5j~#loX@=<4;272 z0NVhc0+)i=0r(T?Z{z*nCh!j=)0S=VB23Ko?HXN$(N@_%JCRSwXS+0cHSOsO8g1p{ zoJ&YwNqI(K-{ZkCg=;^e@<`X-!X`Gz=KVx|M(!pM%uC0*d*IJdY;WA(qt z`P&dp?#h3LNRz_PMD#=o?}#B6PQtNw^(fc*11WrW6vd?S8BtV}64c9-%J)?lw)q2` z+$r6@*}9D8^Lj2zSq->k8f7GvV#wo)ic@9&MKj3;^*!Xu%3 zsDNp^w>`Dl|6~@Qq9nwFqyEIuZ*3#%5pd?4i2>;T;L+QUpVSctT7D@z70`H^qSttc5NR>iGY z?7M{nF*Frz2x;~W$RoD-QW57~C~J+adJMm5fIaFGW(JX~9NwsyY{%39FZySI(PUH< zFr$hsJ*B82!-O0Z8M_ZC`Wz?@@;;~-&9o{Gyr`xvuNfyF^;dfX>0%J-h2ta%a6x5yU2ij2WXDoCgAdCSm5# z&4e6=mp8=j19A5rQF#L5n-YF0J zoBOjFG)TqwjbIk4-;B8d|!U=?rSE#KJ@>_=U%t-YWUFp4!*m!gSRil z`D7M`=7GOL>Ev}G-78-&7LPp;>i#RTVieE^nnST(xG$!A6;);awGLhnPDjBB(N7M( zTXeg>E@--l7@$p@0hwTQYf&Og| z7Nw>2 zL}1No+I~oh?#N(1kLW^%@P%2;pcow(UP-00BcYU~KYBu9i6fyF|Lh@ra(k+j-=~Z z95_7DJNzYu{31Tzf3lGOHY$HA)c!__BYc1VeM9+PyT2RC@8?na+;DyjqCbc8FDH$i zLanm4D$hbPj(6_Gm+1fCJVuT6 z|5C)yr0m3z{B+6DWdFM(`J5CQ=SM;}VSZ;&bsXGwxDVh!xx=e0^W%4`{7Nb_7i^04 zJqiNnn-rk(E2H=n0~L9SHeqm$+v+XYfrA6F!^Jo7^svYh^!~fUeNg5Zx5Hbo6_+Jt ze!iH09JAxeVm2Qy6!RzeP5zflcwH9Nr+>LhA1vU4i?YRm=gL`6VY7GyJHqEfNAr9x z2eWth$R)S!BbQ#z7HAmAL4dBuS3P7m_JM%kFoqwj*o={hClg8IR~V<5`eylioBeCY z@QM6Z|BGYzl)S$&9?-_vRL=QuoWuFZEB$mUxD*HaOkv{-568`3#fMurjKx^2jqy9i z^26eH;8F#%r6lk|EfL9`WvTwB#`4{h>9)nUz8K#fjShS@S!@_Ik-xXqe{L+Fgzr=Q zSHZ~HQBiuDAVo=c_U*2y0ev7HblL99a=0lo>&XA*Civ|4;r^Q7p2l3KXBs-YC+p`XI)iY<(ZBLPI7nHUW{ugH=~CC$??1| znFhyPI)Qh+#q*+P{R1ZOx#Dr-Vc7ZRal=U##&Kiy1U`X3=ifGg?~Ul=3A_T)_Y?T6 z9Af%^YBxUDsP?N%`K}mxMWuW}IBkas_joCv8eWYC;d|j7TCO&v4}yqV_r2o6Sk8C#k&6y*LGDcdxR-@0iH< zR4{I_Rdix@FHU47%XdFK5zAOc85_Q7H53;I-W5kRmS8z-hXuLJUpI+Y$TKG3w5M!= zMZ0Hy%O0!E<9C+v-4A2q*>2n(SXam7m@5jm#f@2Ts|+Prc}o%&)$Kf3J;Vl51((?t>oRSz zq*YY1V(d};D&A#sJB!M2e*jnw@B=mjIRDzte7t|>-F){DOfTW1<6YAG&C4Qh4)-Me zv=Fy5m7VF>ulR5T(jH~CKhDW3`_N7;8cH?hEL|+yi^Nn@evwbQ)9js zJ9&GIxKiAY{R^!V{->O94Q2i}oV*56gOg8}Y)|z^-ot0HHKm3vNp%@pD5h1eg{^Yz z!xySvd=Edg2bIOTmqO0pJrf#^cfi(4CsqUh{(JZd%u}*Qmjm!*38IE=*AnV-KCwV# z_T+zNcJoT30v9X)*yOq`2U;tpldRR{e2KV5OONA|*w%jvyH?Jpb|GQ&41d?!f7`u$ zS{E{uS9;*@O5S-d|MD$EA$b-q3d;PWX7PRaTK~hduz}sdO2yD zQuW2M8|6 zG_ubDY5_X|Z_n~~o5K%C3%2q|DCtXoqLyN6kbl`6ti&q+3v>8h=z&k>@Oxx~&=j1% zYW>0kSPp9aZ#}?gbtYs<;B6_jHiOQCwf>)g$JJ5ix%~KEqRryG>o4I0W|$2o^j1+C zpF1O5xh^_z4F%N>|Ju2Hww}u68DiOrrHq=@6zi;96&he{9I#zuw8-@RWe$JiTz-s; zi8>x9l8R$NWQ5&cn|xNW1ixwpHq+*s#l*q~bA$X>FdoO+$(aI7U3Z{etG@}SZfqFR z+Unmok57!Ck;YYo*VOvIn#U(7#7(=R{CeQ_X0|`WyN5rbf*(DC&64#0FyCU|g}-yt zJ0JCN+o6$8x%6~PSMrN9opq_S^>>ncaPCUo{d@&19!Xn>P&y1%`%hQ$tK!<+Sle@x zf6jbfA6}2Dw6}P9KHt??O?_WE0bgHW$H4X$P8w>ocgVn4qs1NUg5$3dzx&7NW<+jy zkXK?!=<*=nCz6UKm2j&m!u{VV{bdjG(F#^2wkm<<+2V}gE@J6}{0hl`wL7AQ`_&8C zk+ygt->dzEob9^Buh0ouSjcDgytz&+`TGeO0 zn3JJDnA}<%C_ zDCv~t-vNnnS3e+$dp1+alPKApzliS|_vnT1_}xw4@#~^PJdZp4;Z2hKsAMh~Gmg%4 zdi=n0NeJ@(=bI$mh0VOemBS@*J^su8$ji3&<(Fd3IFAP z{kSYNDICAk6Uu2}=l-y_2F=Z4FHJN!#6RL41)x7Y;x56oSjusoMgY+{h>St31jGjO zNr)5vOCW}E{&80%YxqR}v@4Q$fAbZ|lrix^R*GPZpCV#gq)V;z%uIh0bd~~L#^K5_ z72RcJ>7@w8|2S?DQq%^Tc|4cufBtt#CeQhg{VwTh?ZNpO{VQA|db5V5LBlA!BIMZf z8pkk3mgg`w`?3zm^7s5hl9iMTrU_7D1l+>eR-Snds;c(igJNFo_fd4*|Jomtp8mtp zA%%WtWQa<5Npf!d+BgU2xD#I}Oha4-nCjp%0BOM2-R|JZ0P~P;`}^yEps#b@q*p!d zU)d~~?V>tM!m;Y(Zvn+v?&l!p5zj&_K|BL-2;wP->87z1aVX+q#9@dF5r-poAeJFE zBBmeU?u$4QaR%Zj#Bqq}UwFw7M_ALE>97?s{XTZvUp4X-00*EiKmoWCI*>aJSO=H^$OhD7ky!;WN^xr? zMdCupK&}?B05BHN7a#?kl>iS|02l<20h)Nw15N;T09FAO0OkNJynoVP5~no;gF6(a zjALOZ7ItP~JlsVHMq)TZCHz$g#z+Lh1dKZ#qbrKz{jGmV5=PPRqC;mIC&y4qXHBGT z3gIY}vY*!)%+jGO3}az93uPQl#Sj)sxqPGt`R}_XNt#GiBiMqK%R&t!kK|0i4-^+N zh7sp-1WU^?qd9H>V;0HTk3}9?l1305Soz_-CQN9f-5hg#~~Z zj0iiRJ23)~ySD)!i$%+dI1Y=J1^AbEYKkn~<% zz*-4t!xDQXC?kWEH0r4=Zhdsfz^qOvkpUA92m?p~5&*XRtrC=7Yt^ie4bi=^C!~V+ zmr6oz_x~vg8M*uZkdU=})Ljea%)M*gynF7So#$7Fg{0BI+TAP-DGl+@kcF%pTtCaf zHQfux4T$N4kE0P61DeVmpcMb&fmc0^FSt9vjt77b33o6!TD*dv^ zkQ9GLWJtE(5gC%RHb=gDV`NAnzgs2`*~_o(t{Aoh{E6q^7oA%d5eK(qfk;QR1f=J! zvUg9435kphJNhwx$mnB#d1A;iSFi6JoE|`bbah1Wm>(PzaSFtl0KzZ&(ZMYP&>!V* zARXO!Gf()u%VItSaW??b5&p*@{siJvfc$y$?wVTxJ7)~ueQ#0-9~QQCd_MQ$c>mn= zki7T}75UsI0M%Yqna@2|nZL6}a#8B9?hzsj33MAsM%&RNM4GVqBR2U+1eXyiB++n7 z%(_`#_qXySlo#GCcU?d^N%<)lw*=$JdJ&%(jC%xQZ7?1XjEjTu)L=X-7%xN|1z9VC z`3=E%YcPIYj0d&W1raBM@ws69V=!(G#$ous50IjYVB8HcIak%k`D-(i$S~5-2x^@F zwd|0t19qU8{@w|azmJ$^_Q%2eImF~Ue+cG(MNBU6dN40L<^NZYkYs$+L+nBvr>Fz0 z^6(~=176>OOms+8+%}A`&m7$5IaC_Thb);uiHMMprn5wX#Ab$xmiUXUA#o#XW!S?& zN;P8YspW`CiweZ_M``+-5rxaV@eZyOaohw9d&Jd<3n^dfV00M~!dkw^o3@aElrP=g zFd!sKHj&=aY60|g*71*I5s(3|pZ}2C6pJkgpc=3OumsTYZ^w2AqtBQj;xl&V4-auk zB3>*S$PsXOA`OY(eXb~^g^!^(75b~kRH$$Ce?KZDEp02lMBW5g0dOQ^*#flv?da<7 zRvhxI%ZR%k8IW?s)N>b7$fe(hza>Vkz1;R406-J~p=bHzc z=eo@E%?r){GA}bfVqR%pZGOzW!Tf~zY4fw@ZRQuvub5vqziEEk{I2<+`F-=Xl82`X&%uuX?Sh8cB1yY-Zjf`kL@wr2HO+1r)|&Lw%J~^y<&Ua_NMJ^+q<@d zw)btvZ6|G~Y-em=*uJ7onnTpSLOmsSvSz;KdCe|Ons%`EA?*(B*V<5hsbMNCvBdD0 zVWZ(WgWWX3G|{xew88YU>8R4=!4`ACcY|tb?vmUO zazD$Ru34gaNwZV4Q9D@oj_!=Em;Q16%liHLUIwe-1;akWCx%`|tMLWn$Hu9qJ*GpZ zp?Mqg{+)M^*=6y<#GhEMSa|Cq>r(48)^pa2)>i9$+rzfKwga}q_8;sJRL0uCrKrZL z9#m~pxsIwnR2@)XQYYn}$^A0dV_0oCXS`^fW>VxO<@L4vTn%r%2_US_A+wFZOgceBE;3)WIN0W@)~kL}by3eyuT(#&-mN~Oj)ZdE zFvzMj_vmKpNW~ZQujms^&za`sWtpd%H<@Ft3Ts#EAZwNNC#%fX$>zhT`^she!PaDJ zw#n_??Y->=`%wE-`#k#w`!n{dc5X8>5toHgJzrI$dQ;V;3RPFCH>=-JA6I{^ZdRA( zx^ge(a+-%Un>7*I9POLh{n{_IziK7AA-eIpDY|l9h3*mEv%2lNH+B1U@9FAwpX-wJ z{q!1rfxbjPK|e?DdPx7Y{(1dT{m1%0^sV|@!yATi#;L~X=*ddsLSq+GmZ`T%WwM%v znns)MHZ3+SGp#YLGd*kCYx=}=(KOz6hi!??WBbdNVZUhqgDkWI9uv+;qDoWsRt;C( zrCOo#sSc|ytITSL`cZW?#>`LZ-_+OCd~SGdtSeWU+ch^USDR}^TRgd2au4PvX!~l7 z+OgU)ty}w)wodz=_Nq2tH(2+e&aFG8`$}iTfO|#1TmPQ^L;WZEbNWmA%lcpS*YrHx zRt%h$(JyYVB zQ)u2~jPzxB>+_E1)#qKwQ99(kG*z3vHt~6hdBgIa&-*;@ ztGqI^&s=Z5ZXRQ~%TjK+U}=F98foR~G5?yNUA$_i>Wu13RkP~4N}`TcE7h6mo@$j^ zuQsa-)pOMks+X!as5hyfRc}|nst(P~&ei3P&0UmRg)#qX?i>ui3hiR;A?-)n;krq> zCf%R99IO=Y8$L38X}Dzg)o{%aVT?56nE(5HD#c~|pV@;I~9oM|3z zUTj`&USVEkt~ReTZ^Sg)jCG;Oe8t>sZZW@Peam{n`lD58>tkC02hUxg8!e7oqFSxm zpxTqWLF;-_`-tAF-=}|He@g#_ewv}&(8JirxGnFcyffx6&8_BGm~1xs-D`Q(vfrY# z=3A#&XIZycU$xd*k6XX6Ub6mX4aID(u|1F8-)B2y`^`&T1vwusI8W%WN>k(zBtg3RCstSJYDb?$$LzvxHRXmKJu6{(lO8t!bIrU+6z50ea zJhv$Kx!l9K^|?RiMrf3pURckHHD#Jv7#)7i7R_PJXPR#{2CY>)Njp!Qsq3Rt>nyrL zU6F3C?jfB^=hZz1ceG9Sn(i(5fHZwiy;(m@KT#PBxaK&lVUL8J8HB8&?>28|%?`-x+^0rki@2`kBn80@E;4 zv1y8Frs-bO9MeLR%T#4rZFZy+RoW7 zz{~+S<|ZsK&9)XBXP4S#_EdW&JZUd`KYN*dhTUnOWuIfOz_PQ*zQn%VzQVrBUTt4z z-$>nnyR#E?uAZcxuXe$yz5u8CiMl%14+oT?y-)jqwi4_5V(n6GmDZ#6Y1e9{x)@!m zP6t;sSvONxsry3rvkw1YK|f7jq2B;!bVfhh;5Mu`JcDr`Y5c}`*_Z^sIR=A!rO9vF zXZp$%Fe&pg^R#&dd8hLxVxv>zGXG+>S_WC(uuQQ|$Ff7iX|nB3TeZ!PAytcw$RD#)PV+rH0!*nZl6g<6xr({jN@sXD6?RH<;iDwSU4Pz_Vv zt(pVJvr@M~_YC$E@9RF)orV8sz$6XV$Ln3$`u;HQNPVe(s=i$R0G3mi{!zW4-=u#@ zzYFu?r2e%2y#70VGu-PKgMhZ3G_)F`Fe>I6o6RAXD2vWwwhXis!$00(Sz!5>h8hfw8*8a(yiBR(Y>mx(|w>j z4b1|&E4phsP9LG~q)*ZJ(ChRz`1?uv8Txzmi}f#Jp?cBqu%+7atfkiSl|^dJvO25} zTA#8$Z+#6@@`SaMZHTSR_7FB7^_YYa_Cxj$G4&wX!E=WZMXScC{!&@gL)4Shv(>H& zbrsg6t#HAgsxPZUa+7n_x#rvvxwCU0g)@FWcUSH{xa5{x3*7N^IONwf*EEsZR4h=# zw4=49+9}#;+S%F#+AUb5INf61H2qlPcH?-{9j4is2OiTV)2pVWyk2m{_hT=$Id5lP zxH-o>%sdMl-A(4#T;{LMLoHJ*3t_a!EKgc?STxpQ)-~3TF%qWOreph2W7}nW!~U-Q zi2c0%dplRmQ&)5S(6`!g?g zXNU8S=AFP|d^+!J-nqOBdA-dlv({`hTg24t2Jxw+JV|3 z+Tq$2+LvL2{n}5pziC^wcHIcw4BbZE9^HA}H@Y8nt-7K5JN2{me*JU$omel<=r8F1 zgy&RaV?M($$FK-C*lc*waMW-fTaR#KC*y3abNh|Qj5mzEO>?mYJ#I?P%gXDUXG1eb zVnJJxSMADs4eN75-p_f(<|$aos>=<1AAxg5?QIo#n9Q zsO1D&uCS(Bds@}jQtL8oxXrc!Hm7Zs?I~^amvhr|Lhj>b5ERMKA^t%!1j*1LNQVqXN|PZ&hYUf3=@7*sU@1~E zWQdv}NQ6>?gp#3%XoLzP0W*j?IQYGEdG8G`Ip^lyd%oXy?vM>wr6=@^_USFX$6`5$ zb#Lpt`Uq?NM)WZH2j=88D#Qrncm>*#gohcw;lL0@jnVeZSdDO{GQ}o^NfZO9igFJMPduc1NfT_(VuqY1{^pG5CL(Y)Vp!(v*dI=HYQmRHiD` zsX?#6j~y^VpN8~_PH0TO=pW7KAf_@2%1-O7&gs0~)FoX8W%jgXE8kRGGtR8Dq?aLv z;b<*aRKeTZZrQE4ekOJI1#FU)P-rcqB@#K^trNiW-zl3d#Fyfsxc^Su>q4bYApc`; z;%n8anl=C|yMdkAvOBdeMRnn#?Py0F1CMas*`+3uZX@k35$kxC(~1fP K?$_ojD)Jw=7$0K*