diff --git a/Engine/source/console/console.cpp b/Engine/source/console/console.cpp index 4b9316e6f9..6dc846b9fa 100644 --- a/Engine/source/console/console.cpp +++ b/Engine/source/console/console.cpp @@ -69,6 +69,28 @@ char* ConsoleValue::convertToBuffer() const return buffer; } +char* ConsoleValue::convertVectorToBuffer() const +{ + if (!vec || vec->size() == 0) + return (char*)""; + + // use FrameAllocator to avoid static overwrite + char* buffer = static_cast(sConversionAllocator.alloc(4096)); + buffer[0] = 0; + + for (U32 v = 0; v < vec->size(); v++) + { + const char* elemStr = (*vec)[v].getString(); + + if (v > 0) + dStrcat(buffer, " ", 4096); + + dStrcat(buffer, elemStr, 4096); + } + + return buffer; +} + const char* ConsoleValue::getConsoleData() const { return Con::getData(type, dataPtr, 0, enumTable); diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index 82f953eb17..3a75edf07c 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -32,8 +32,10 @@ #ifndef _REFBASE_H_ #include "core/util/refBase.h" #endif +#ifndef __RESOURCE_H__ +#include "core/resource.h" +#endif #include - #include "core/util/str.h" #include "core/util/journal/journaledSignal.h" #include "core/stringTable.h" @@ -120,12 +122,13 @@ typedef const char *StringTableEntry; enum ConsoleValueType { - cvNULL = -5, + cvNULL = -6, + cvVector = -5, cvInteger = -4, cvFloat = -3, cvString = -2, cvSTEntry = -1, - cvConsoleValueType = 0 + cvConsoleValueType = 0, }; class ConsoleValue @@ -151,22 +154,29 @@ class ConsoleValue S32 type; U32 bufferLen; - + std::shared_ptr> vec; static DataChunker sConversionAllocator; char* convertToBuffer() const; + char* convertVectorToBuffer() const; const char* getConsoleData() const; TORQUE_FORCEINLINE void cleanupData() { - if (type <= cvString && bufferLen > 0) + if (type <= ConsoleValueType::cvString && bufferLen > 0) { dFree(s); bufferLen = 0; } s = const_cast(StringTable->EmptyString()); + + if (type == ConsoleValueType::cvVector) + { + vec.reset(); + } + type = ConsoleValueType::cvNULL; } ConsoleValue() @@ -199,6 +209,9 @@ class ConsoleValue case cvString: setString(ref.s); break; + case cvVector: + setVector(ref.vec); // copy-by-reference, no ownership + break; default: setConsoleData(ref.type, ref.dataPtr, ref.enumTable); break; @@ -212,6 +225,9 @@ class ConsoleValue case cvNULL: std::cout << "Ref already cleared!"; break; + case cvVector: + setVector(ref.vec); + break; case cvInteger: setInt(ref.i); break; @@ -251,6 +267,8 @@ class ConsoleValue return s == StringTable->EmptyString() ? 0.0f : dAtof(s); if (type == ConsoleValueType::cvString) return dStrcmp(s, "") == 0 ? 0.0f : dAtof(s); + if (type == ConsoleValueType::cvVector) + return vec->size(); return dAtof(getConsoleData()); } @@ -264,16 +282,79 @@ class ConsoleValue return s == StringTable->EmptyString() ? 0 : dAtoi(s); if (type == ConsoleValueType::cvString) return dStrcmp(s, "") == 0 ? 0 : dAtoi(s); - + if (type == ConsoleValueType::cvVector) + return vec->size(); return dAtoi(getConsoleData()); } + TORQUE_FORCEINLINE void setVector(std::shared_ptr> v) + { + cleanupData(); + type = ConsoleValueType::cvVector; + vec = v; + } + + TORQUE_FORCEINLINE std::shared_ptr> getVector() const + { + if (type == cvVector) + return vec; + + // Handle string or string table entry as a space-delimited vector + if (isNumberType() || isStringType()) + { + if (type == cvString || type == cvSTEntry) + { + if (s == StringTable->EmptyString()) + return NULL; + } + + std::shared_ptr> temp = std::make_shared>(); + if (isNumberType()) + { + ConsoleValue elem; + if (type == cvFloat) + elem.setFloat(f); + else if (type == cvInteger) + elem.setInt(i); + + temp->push_back(elem); + return temp; + } + + if (type == cvString || type == cvSTEntry) + { + if (s == StringTable->EmptyString()) + return NULL; + + const char* str = s ? s : ""; + + char* buffer = dStrdup(str); + char* tok = dStrtok(buffer, " \t\r\n"); + + while (tok) + { + ConsoleValue elem; + elem.setString(tok); + temp->push_back(elem); + tok = dStrtok(NULL, " \t\r\n"); + } + + dFree(buffer); + return temp; + } + } + + return NULL; + } + TORQUE_FORCEINLINE const char* getString() const { if (isStringType()) return s; if (isNumberType()) return convertToBuffer(); + if ((type == cvVector)) + return convertVectorToBuffer(); return getConsoleData(); } @@ -292,6 +373,8 @@ class ConsoleValue return s == StringTable->EmptyString() ? false : dAtob(s); if (type == ConsoleValueType::cvString) return dStrcmp(s, "") == 0 ? false : dAtob(s); + if (type == ConsoleValueType::cvVector) + return vec->size() > 0; return dAtob(getConsoleData()); } diff --git a/Engine/source/console/consoleInternal.h b/Engine/source/console/consoleInternal.h index beffb2e2c4..e1d7830248 100644 --- a/Engine/source/console/consoleInternal.h +++ b/Engine/source/console/consoleInternal.h @@ -338,6 +338,11 @@ class Dictionary return value.getString(); } + inline std::shared_ptr> getVectorValue() + { + return value.getVector(); + } + void setIntValue(U32 val) { if (mIsConstant) @@ -406,6 +411,28 @@ class Dictionary if (notify) notify->trigger(); } + + void setVectorValue(std::shared_ptr> val) + { + if (mIsConstant) + { + Con::errorf("Cannot assign value to constant '%s'.", name); + return; + } + + if (value.isConsoleType()) + { + Con::setData(value.type, value.dataPtr, 0, 1, NULL, value.enumTable); // null for now + } + else + { + value.setVector(val); + } + + // Fire off the notification if we have one. + if (notify) + notify->trigger(); + } }; struct HashTableData diff --git a/Engine/source/console/torquescript/CMDgram.y b/Engine/source/console/torquescript/CMDgram.y index 9e1b305435..d760307ba4 100644 --- a/Engine/source/console/torquescript/CMDgram.y +++ b/Engine/source/console/torquescript/CMDgram.y @@ -461,6 +461,19 @@ expr { $$ = (ExprNode*)VarNode::alloc( $1.lineNumber, $1.value, NULL); } | VAR '[' aidx_expr ']' { $$ = (ExprNode*)VarNode::alloc( $1.lineNumber, $1.value, $3 ); } + | expr '[' expr ']' + { $$ = VectorIndexNode::alloc($1->dbgLineNumber, $1, $3); } + | '[' expr_list_decl ']' + { + Vector elems; + if ($2) { + // expr_list already chains ExprNodes using append(), + // so walk and collect them + for (ExprNode* e = $2; e; e = (ExprNode*)e->getNext()) + elems.push_back(e); + } + $$ = VectorExprNode::alloc(@1.first_line, elems); + } ; /* | rwDEFINE '(' var_list_decl ')' '{' statement_list '}' diff --git a/Engine/source/console/torquescript/ast.h b/Engine/source/console/torquescript/ast.h index 1c41958a3a..08ffcdb746 100644 --- a/Engine/source/console/torquescript/ast.h +++ b/Engine/source/console/torquescript/ast.h @@ -40,7 +40,8 @@ enum TypeReq TypeReqNone, TypeReqUInt, TypeReqFloat, - TypeReqString + TypeReqString, + TypeReqVector }; enum ExprNodeName @@ -134,6 +135,32 @@ struct ExprNode : StmtNode virtual ExprNodeName getExprNodeNameEnum() const { return NameExprNode; } }; +struct VectorExprNode : ExprNode +{ + Vector elements; ///< Elements of the vector literal + + static VectorExprNode* alloc(S32 lineNumber, const Vector& elements); + + U32 compile(CodeStream& codeStream, U32 ip, TypeReq type) override; + TypeReq getPreferredType() override { return TypeReqVector; } + DBG_STMT_TYPE(VectorExprNode); +}; + +struct VectorIndexNode : ExprNode +{ + ExprNode* base; + ExprNode* index; + + static VectorIndexNode* alloc(S32 lineNumber, ExprNode* b, ExprNode* i); + + U32 compile(CodeStream& codeStream, U32 ip, TypeReq type) override; + TypeReq getPreferredType() override { return TypeReqNone; } + DBG_STMT_TYPE(VectorIndexNode); + + ExprNode* getBase() const { return base; } + ExprNode* getIndex() const { return index; } +}; + struct ReturnStmtNode : StmtNode { ExprNode* expr; diff --git a/Engine/source/console/torquescript/astAlloc.cpp b/Engine/source/console/torquescript/astAlloc.cpp index 9b149b598f..72416e0dba 100644 --- a/Engine/source/console/torquescript/astAlloc.cpp +++ b/Engine/source/console/torquescript/astAlloc.cpp @@ -37,6 +37,27 @@ using namespace Compiler; //------------------------------------------------------------ +VectorExprNode* VectorExprNode::alloc(S32 lineNumber, const Vector& elements) +{ + VectorExprNode* ret = (VectorExprNode*)consoleAlloc(sizeof(VectorExprNode)); + constructInPlace(ret); + ret->dbgLineNumber = lineNumber; + ret->optimizedNode = NULL; + ret->elements = elements; + return ret; +} + +VectorIndexNode* VectorIndexNode::alloc(S32 lineNumber, ExprNode* b, ExprNode* i) +{ + VectorIndexNode* ret = (VectorIndexNode*)consoleAlloc(sizeof(VectorIndexNode)); + constructInPlace(ret); + ret->dbgLineNumber = lineNumber; + ret->optimizedNode = NULL; + ret->base = b; + ret->index = i; + return ret; +} + BreakStmtNode* BreakStmtNode::alloc(S32 lineNumber) { BreakStmtNode* ret = (BreakStmtNode*)consoleAlloc(sizeof(BreakStmtNode)); diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index df824c260a..c78ff2cad2 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -154,7 +154,7 @@ U32 ReturnStmtNode::compileStmt(CodeStream& codeStream, U32 ip) else { TypeReq walkType = expr->getPreferredType(); - if (walkType == TypeReqNone) walkType = TypeReqString; + if (walkType == TypeReqNone || walkType == TypeReqVector) walkType = TypeReqString; ip = expr->compile(codeStream, ip, walkType); // Return the correct type @@ -372,6 +372,51 @@ U32 IterStmtNode::compileStmt(CodeStream& codeStream, U32 ip) //------------------------------------------------------------ +U32 VectorExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) +{ + // Emit instruction to create vector + codeStream.emit(OP_CREATE_VECTOR); + codeStream.emit(elements.size()); + + for (U32 i = 0; i < elements.size(); i++) + { + TypeReq req = elements[i]->getPreferredType(); + + if (req == TypeReqNone) + { + req = type; + } + + ip = elements[i]->compile(codeStream, ip, req); + codeStream.emit(OP_POP_STK); + codeStream.emit(OP_VECTOR_PUSH); + } + + return ip; +} + + +//------------------------------------------------------------ + +U32 VectorIndexNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) +{ + // Compile base expression as vector + if (VectorIndexNode* innerVec = dynamic_cast(base)) + ip = innerVec->compile(codeStream, ip, TypeReqVector); + else + ip = base->compile(codeStream, ip, TypeReqVector); + // Compile index + ip = index->compile(codeStream, ip, TypeReqUInt); + + // Emit load member + codeStream.emit(OP_LOADVAR_VECTOR_MEMBER); + codeStream.emit(type); + + return ip; +} + +//------------------------------------------------------------ + U32 ConditionalExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { // code is testExpr @@ -645,40 +690,99 @@ TypeReq FloatUnaryExprNode::getPreferredType() U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { - // if this has an arrayIndex... - // OP_LOADIMMED_IDENT - // varName - // OP_ADVANCE_STR - // evaluate arrayIndex TypeReqString - // OP_REWIND_STR - // OP_SETCURVAR_ARRAY - // OP_LOADVAR (type) - - // else - // OP_SETCURVAR - // varName - // OP_LOADVAR (type) +// If this variable has an array or vector index, the logic is: +// +// eval arrayIndex +// +// if arrayIndex is a string expression (CommaCatExprNode or TypeReqString): +// OP_LOADIMMED_IDENT +// varName +// eval arrayIndex as TypeReqString +// OP_REWIND_STR +// OP_SETCURVAR_ARRAY +// OP_POP_STK +// +// else if it's a numeric or vector index: +// if global ($var): +// OP_SETCURVAR +// varName +// OP_LOADVAR_VECTOR +// else (local): +// OP_LOAD_LOCAL_VAR_VECTOR +// (emit local var lookup index) +// +// eval arrayIndex as TypeReqUInt +// OP_LOADVAR_VECTOR_MEMBER +// emit requested type (TypeReqUInt / TypeReqFloat / TypeReqString / TypeReqVector) +// +// else if it's a global variable (starts with '$'): +// OP_SETCURVAR +// varName +// OP_LOADVAR_ +// +// else (local variable): +// OP_LOAD_LOCAL_VAR_ +// (emit local variable lookup index) +// +// return current instruction pointer if (type == TypeReqNone) return codeStream.tell(); precompileIdent(varName); - bool oldVariables = arrayIndex || varName[0] == '$'; + bool isGlobal = varName[0] == '$'; + bool isVector = arrayIndex; - if (oldVariables) + if (isVector || isGlobal) { - codeStream.emit(arrayIndex ? OP_LOADIMMED_IDENT : OP_SETCURVAR); - codeStream.emitSTE(varName); + if (isVector) + { + if (dynamic_cast(arrayIndex) || arrayIndex->getPreferredType() == TypeReqString) + { + type = TypeReqString; + codeStream.emit(OP_LOADIMMED_IDENT); + codeStream.emitSTE(varName); - if (arrayIndex) + ip = arrayIndex->compile(codeStream, ip, TypeReqString); + codeStream.emit(OP_REWIND_STR); + codeStream.emit(OP_SETCURVAR_ARRAY); + codeStream.emit(OP_POP_STK); + } + else + { + // Compile the index expression + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + + // Load the base vector + if (isGlobal) + { + codeStream.emit(OP_SETCURVAR); + codeStream.emitSTE(varName); + } + + // Emit the correct vector member load opcode + if (isGlobal) + { + codeStream.emit(OP_LOADVAR_VECTOR_MEMBER_GLOBAL); + codeStream.emit(type); + } + else + { + codeStream.emit(OP_LOADVAR_VECTOR_MEMBER_LOCAL); + codeStream.emit(type); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber, TypeReqVector)); + } + + return codeStream.tell(); + } + } + else { - //codeStream.emit(OP_ADVANCE_STR); - ip = arrayIndex->compile(codeStream, ip, TypeReqString); - codeStream.emit(OP_REWIND_STR); - codeStream.emit(OP_SETCURVAR_ARRAY); - codeStream.emit(OP_POP_STK); + codeStream.emit(OP_SETCURVAR); + codeStream.emitSTE(varName); } + switch (type) { case TypeReqUInt: @@ -690,6 +794,9 @@ U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) case TypeReqString: codeStream.emit(OP_LOADVAR_STR); break; + case TypeReqVector: + codeStream.emit(OP_LOADVAR_VECTOR); + break; case TypeReqNone: break; default: @@ -700,9 +807,10 @@ U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { switch (type) { - case TypeReqUInt: codeStream.emit(OP_LOAD_LOCAL_VAR_UINT); break; - case TypeReqFloat: codeStream.emit(OP_LOAD_LOCAL_VAR_FLT); break; - default: codeStream.emit(OP_LOAD_LOCAL_VAR_STR); + case TypeReqUInt: codeStream.emit(OP_LOAD_LOCAL_VAR_UINT); break; + case TypeReqFloat: codeStream.emit(OP_LOAD_LOCAL_VAR_FLT); break; + case TypeReqVector: codeStream.emit(OP_LOAD_LOCAL_VAR_VECTOR); break; + default: codeStream.emit(OP_LOAD_LOCAL_VAR_STR); } codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber)); @@ -713,8 +821,23 @@ U32 VarNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) TypeReq VarNode::getPreferredType() { - bool oldVariables = arrayIndex || varName[0] == '$'; - return oldVariables ? TypeReqNone : getFuncVars(dbgLineNumber)->lookupType(varName, dbgLineNumber); + bool globalScope = varName[0] == '$'; + TypeReq actType = TypeReqNone; + bool isVector = arrayIndex; + bool isOldArray = dynamic_cast(arrayIndex); + + if (!globalScope && !isOldArray) + { + actType = getFuncVars(dbgLineNumber)->lookupType(varName, dbgLineNumber); + } + + + if (globalScope && isVector) + return TypeReqNone; + else if (isOldArray) + return TypeReqNone; + else + return actType; } //------------------------------------------------------------ @@ -885,73 +1008,143 @@ TypeReq ConstantNode::getPreferredType() U32 AssignExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { +// If it's an array or vector expression, the general logic is: +// +// eval expr +// +// if arrayIndex exists: +// if arrayIndex is a string expression (CommaCatExprNode or TypeReqString): +// OP_LOADIMMED_IDENT +// varName +// eval arrayIndex as string +// OP_REWIND_STR +// OP_SETCURVAR_ARRAY_CREATE +// (if type == TypeReqNone) OP_POP_STK +// +// else if arrayIndex is a VectorIndexNode: +// eval vector expression (TypeReqVector) +// eval index expression (TypeReqUInt) +// OP_SETCURVAR_VECTOR_MEMBER +// +// else: +// if global ($var): +// OP_SETCURVAR_CREATE +// varName +// ensure global var exists as vector +// OP_LOADVAR_VECTOR +// else (local): +// ensure local vector variable is registered in function scope +// OP_LOAD_LOCAL_VAR_VECTOR +// (emit var lookup index) +// eval arrayIndex as UInt +// OP_SETCURVAR_VECTOR_MEMBER +// +// (then return ip after setting vector member) +// +// else if it's a global variable (starts with '$'): +// OP_SETCURVAR_CREATE +// varName +// OP_SAVEVAR_ +// +// else (local variable): +// OP_SAVE_LOCAL_VAR_ +// (register or assign varName in local function scope) +// +// if type == TypeReqNone: +// OP_POP_STK + subType = expr->getPreferredType(); if (subType == TypeReqNone) subType = type; if (subType == TypeReqNone) subType = TypeReqString; - // if it's an array expr, the formula is: - // eval expr - // (push and pop if it's TypeReqString) OP_ADVANCE_STR - // OP_LOADIMMED_IDENT - // varName - // OP_ADVANCE_STR - // eval array - // OP_REWIND_STR - // OP_SETCURVAR_ARRAY_CREATE - // OP_TERMINATE_REWIND_STR - // OP_SAVEVAR - - //else - // eval expr - // OP_SETCURVAR_CREATE - // varname - // OP_SAVEVAR - precompileIdent(varName); ip = expr->compile(codeStream, ip, subType); - bool oldVariables = arrayIndex || varName[0] == '$'; + bool isGlobal = varName[0] == '$'; + bool isVector = arrayIndex; - if (oldVariables) + if (isVector || isGlobal) { - if (arrayIndex) + if (isVector) { - //if (subType == TypeReqString) - // codeStream.emit(OP_ADVANCE_STR); - - codeStream.emit(OP_LOADIMMED_IDENT); - codeStream.emitSTE(varName); + if (dynamic_cast(arrayIndex) || arrayIndex->getPreferredType() == TypeReqString) + { + codeStream.emit(OP_LOADIMMED_IDENT); + codeStream.emitSTE(varName); - //codeStream.emit(OP_ADVANCE_STR); - ip = arrayIndex->compile(codeStream, ip, TypeReqString); - codeStream.emit(OP_REWIND_STR); - codeStream.emit(OP_SETCURVAR_ARRAY_CREATE); - if (type == TypeReqNone) - codeStream.emit(OP_POP_STK); + //codeStream.emit(OP_ADVANCE_STR); + ip = arrayIndex->compile(codeStream, ip, TypeReqString); + codeStream.emit(OP_REWIND_STR); + codeStream.emit(OP_SETCURVAR_ARRAY_CREATE); + if (type == TypeReqNone) + codeStream.emit(OP_POP_STK); + } + else + { + if (VectorIndexNode* vecIndex = dynamic_cast(arrayIndex)) + { + ip = vecIndex->compile(codeStream, ip, TypeReqVector); + + ip = vecIndex->getIndex()->compile(codeStream, ip, TypeReqUInt); + + // emit the opcode to store the value in the nested vector + codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER); + return ip; + } + + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + + if (isGlobal) + { + codeStream.emit(OP_SETCURVAR_CREATE); + codeStream.emitSTE(varName); + Dictionary::Entry* ent = Con::gGlobalVars.lookup(varName); + if (!ent) + { + ent = Con::gGlobalVars.add(varName); + } + + codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER_GLOBAL); + } + else // the issue with locals is that the framestack only exists after the op_ codes are run. + { + if(getFuncVars(dbgLineNumber)->count() == 0 || !getFuncVars(dbgLineNumber)->find(varName))// no frame stack, if func vars count is 0, save the var. + { + getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber); + } + + codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER_LOCAL); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber, TypeReqVector)); + } + + return ip; + } } else { codeStream.emit(OP_SETCURVAR_CREATE); codeStream.emitSTE(varName); } + switch (subType) { - case TypeReqString: codeStream.emit(OP_SAVEVAR_STR); break; - case TypeReqUInt: codeStream.emit(OP_SAVEVAR_UINT); break; - case TypeReqFloat: codeStream.emit(OP_SAVEVAR_FLT); break; - default: break; + case TypeReqUInt: codeStream.emit(OP_SAVEVAR_UINT); break; + case TypeReqFloat: codeStream.emit(OP_SAVEVAR_FLT); break; + case TypeReqVector: codeStream.emit(OP_SAVEVAR_VECTOR); break; + default: codeStream.emit(OP_SAVEVAR_STR); break; } } else { switch (subType) { - case TypeReqUInt: codeStream.emit(OP_SAVE_LOCAL_VAR_UINT); break; - case TypeReqFloat: codeStream.emit(OP_SAVE_LOCAL_VAR_FLT); break; - default: codeStream.emit(OP_SAVE_LOCAL_VAR_STR); + case TypeReqUInt: codeStream.emit(OP_SAVE_LOCAL_VAR_UINT); break; + case TypeReqFloat: codeStream.emit(OP_SAVE_LOCAL_VAR_FLT); break; + case TypeReqVector: codeStream.emit(OP_SAVE_LOCAL_VAR_VECTOR); break; + default: codeStream.emit(OP_SAVE_LOCAL_VAR_STR); } codeStream.emit(getFuncVars(dbgLineNumber)->assign(varName, subType == TypeReqNone ? TypeReqString : subType, dbgLineNumber)); } @@ -1023,52 +1216,91 @@ static void getAssignOpTypeOp(S32 op, TypeReq& type, U32& operand) U32 AssignOpExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) { - - // goes like this... - // eval expr as float or int - // if there's an arrayIndex - - // OP_LOADIMMED_IDENT - // varName - // OP_ADVANCE_STR - // eval arrayIndex stringwise - // OP_REWIND_STR - // OP_SETCURVAR_ARRAY_CREATE - - // else - // OP_SETCURVAR_CREATE - // varName - - // OP_LOADVAR_FLT or UINT - // operand - // OP_SAVEVAR_FLT or UINT +// If it's a vector, array, or global assignment, the general logic is: +// +// 1. Determine assignment type and operand: +// getAssignOpTypeOp(op, subType, operand) +// +// 2. Special case: local ++/-- with no vector or global +// - assign local var as float if not already +// - emit OP_INC and var index +// - return +// +// 3. If vector or global variable (arrayIndex exists or varName starts with '$'): +// +// a. String-based arrayIndex (CommaCatExprNode or TypeReqString): +// - Compile expr +// - OP_LOADIMMED_IDENT +// - varName +// - Compile arrayIndex as string +// - OP_REWIND_STR +// - OP_SETCURVAR_ARRAY_CREATE +// - (if type == TypeReqNone) OP_POP_STK +// +// b. Numeric vector/array index: +// - If global: +// - OP_SETCURVAR_CREATE +// - varName +// - Ensure global vector exists +// - OP_LOADVAR_VECTOR +// - Else (local): +// - Ensure local vector variable is registered +// - OP_LOAD_LOCAL_VAR_VECTOR +// - emit local var lookup index +// - Compile arrayIndex as UInt +// - OP_LOADVAR_VECTOR_MEMBER +// - emit subType +// - Compile expr +// - emit operand +// - emit OP_LOADVAR_FLT or OP_LOADVAR_UINT as needed +// - Reload vector +// - Recompile arrayIndex as UInt +// - OP_SETCURVAR_VECTOR_MEMBER +// - (if type == TypeReqNone) OP_POP_STK +// - return ip +// +// c. If no vector (but still global): +// - Compile expr +// - OP_SETCURVAR_CREATE +// - varName +// - OP_LOADVAR_FLT or OP_LOADVAR_UINT +// - emit operand +// - OP_SAVEVAR_FLT or OP_SAVEVAR_UINT +// +// 4. Else (local variable, not vector/array): +// - Compile expr +// - Assign/register local variable +// - OP_LOAD_LOCAL_VAR_FLT or OP_LOAD_LOCAL_VAR_UINT +// - emit operand +// - OP_SAVE_LOCAL_VAR_FLT or OP_SAVE_LOCAL_VAR_UINT +// +// 5. If type == TypeReqNone: +// - OP_POP_STK // conversion OP if necessary. getAssignOpTypeOp(op, subType, operand); precompileIdent(varName); - bool oldVariables = arrayIndex || varName[0] == '$'; + bool isGlobal = varName[0] == '$'; + bool isVector = arrayIndex; - if (op == opPLUSPLUS && !oldVariables && type == TypeReqNone) + // Special case: ++/-- locals + if (op == opPLUSPLUS && !isGlobal && !isVector && type == TypeReqNone) { const S32 varIdx = getFuncVars(dbgLineNumber)->assign(varName, TypeReqFloat, dbgLineNumber); - codeStream.emit(OP_INC); codeStream.emit(varIdx); + return codeStream.tell(); } - else - { - ip = expr->compile(codeStream, ip, subType); - if (oldVariables) + // Vector compound assignment branch + if (isVector || isGlobal) + { + if (isVector) { - if (!arrayIndex) - { - codeStream.emit(OP_SETCURVAR_CREATE); - codeStream.emitSTE(varName); - } - else + if (dynamic_cast(arrayIndex) || arrayIndex->getPreferredType() == TypeReqString) { + ip = expr->compile(codeStream, ip, subType); codeStream.emit(OP_LOADIMMED_IDENT); codeStream.emitSTE(varName); @@ -1079,25 +1311,90 @@ U32 AssignOpExprNode::compile(CodeStream& codeStream, U32 ip, TypeReq type) if (type == TypeReqNone) codeStream.emit(OP_POP_STK); } - codeStream.emit((subType == TypeReqFloat) ? OP_LOADVAR_FLT : OP_LOADVAR_UINT); - codeStream.emit(operand); - codeStream.emit((subType == TypeReqFloat) ? OP_SAVEVAR_FLT : OP_SAVEVAR_UINT); + else + { + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + + if (isGlobal) + { + codeStream.emit(OP_SETCURVAR_CREATE); + codeStream.emitSTE(varName); + Dictionary::Entry* ent = Con::gGlobalVars.lookup(varName); + if (!ent) + { + ent = Con::gGlobalVars.add(varName); + } + + codeStream.emit(OP_LOADVAR_VECTOR_MEMBER_GLOBAL); + codeStream.emit(subType); + } + else // the issue with locals is that the framestack only exists after the op_ codes are run. + { + if (getFuncVars(dbgLineNumber)->count() == 0)// no frame stack, if func vars count is 0, save the var. + { + getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber); + } + else if (!getFuncVars(dbgLineNumber)->find(varName)) + { + getFuncVars(dbgLineNumber)->assign(varName, TypeReqVector, dbgLineNumber); + } + + codeStream.emit(OP_LOADVAR_VECTOR_MEMBER_LOCAL); + codeStream.emit(subType); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber, TypeReqVector)); + } + + ip = expr->compile(codeStream, ip, subType); + codeStream.emit(operand); + codeStream.emit((subType == TypeReqFloat) ? OP_LOADVAR_FLT : OP_LOADVAR_UINT); + + ip = arrayIndex->compile(codeStream, ip, TypeReqUInt); + + if (isGlobal) + { + codeStream.emit(OP_SETCURVAR_CREATE); + codeStream.emitSTE(varName); + codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER_GLOBAL); + } + else // the issue with locals is that the framestack only exists after the op_ codes are run. + { + codeStream.emit(OP_SETCURVAR_VECTOR_MEMBER_LOCAL); + codeStream.emit(getFuncVars(dbgLineNumber)->lookup(varName, dbgLineNumber, TypeReqVector)); + } + + if (type == TypeReqNone) + codeStream.emit(OP_POP_STK); + + return codeStream.tell(); + } } - else + else if (!isVector) { - const bool isFloat = subType == TypeReqFloat; - const S32 varIdx = getFuncVars(dbgLineNumber)->assign(varName, subType == TypeReqNone ? TypeReqString : subType, dbgLineNumber); - - codeStream.emit(isFloat ? OP_LOAD_LOCAL_VAR_FLT : OP_LOAD_LOCAL_VAR_UINT); - codeStream.emit(varIdx); - codeStream.emit(operand); - codeStream.emit(isFloat ? OP_SAVE_LOCAL_VAR_FLT : OP_SAVE_LOCAL_VAR_UINT); - codeStream.emit(varIdx); + ip = expr->compile(codeStream, ip, subType); + codeStream.emit(OP_SETCURVAR_CREATE); + codeStream.emitSTE(varName); } - if (type == TypeReqNone) - codeStream.emit(OP_POP_STK); + codeStream.emit((subType == TypeReqFloat) ? OP_LOADVAR_FLT : OP_LOADVAR_UINT); + codeStream.emit(operand); + codeStream.emit((subType == TypeReqFloat) ? OP_SAVEVAR_FLT : OP_SAVEVAR_UINT); } + else + { + ip = expr->compile(codeStream, ip, subType); + const bool isFloat = subType == TypeReqFloat; + const S32 varIdx = getFuncVars(dbgLineNumber)->assign(varName, subType == TypeReqNone ? TypeReqString : subType, dbgLineNumber); + + codeStream.emit(isFloat ? OP_LOAD_LOCAL_VAR_FLT : OP_LOAD_LOCAL_VAR_UINT); + codeStream.emit(varIdx); + codeStream.emit(operand); + codeStream.emit(isFloat ? OP_SAVE_LOCAL_VAR_FLT : OP_SAVE_LOCAL_VAR_UINT); + codeStream.emit(varIdx); + } + + if (type == TypeReqNone) + codeStream.emit(OP_POP_STK); + return codeStream.tell(); } diff --git a/Engine/source/console/torquescript/cmdgram.cpp b/Engine/source/console/torquescript/cmdgram.cpp index ab15ffc736..2db5ac3bbb 100644 --- a/Engine/source/console/torquescript/cmdgram.cpp +++ b/Engine/source/console/torquescript/cmdgram.cpp @@ -629,16 +629,16 @@ union yyalloc /* YYFINAL -- State number of the termination state. */ #define YYFINAL 3 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 2858 +#define YYLAST 3058 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 100 /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 41 /* YYNRULES -- Number of rules. */ -#define YYNRULES 162 +#define YYNRULES 164 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 380 +#define YYNSTATES 387 /* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 329 @@ -705,12 +705,12 @@ static const yytype_int16 yyrline[] = 394, 396, 398, 400, 402, 404, 406, 408, 410, 412, 414, 416, 418, 420, 422, 424, 426, 428, 430, 432, 434, 436, 438, 440, 442, 444, 446, 448, 450, 452, - 454, 456, 458, 460, 462, 484, 486, 491, 493, 498, - 500, 505, 507, 509, 511, 513, 515, 517, 519, 521, - 523, 525, 527, 532, 534, 536, 538, 540, 542, 544, - 546, 548, 550, 555, 557, 559, 569, 571, 577, 578, - 583, 585, 591, 592, 597, 599, 604, 606, 608, 610, - 612, 617, 619 + 454, 456, 458, 460, 462, 464, 466, 497, 499, 504, + 506, 511, 513, 518, 520, 522, 524, 526, 528, 530, + 532, 534, 536, 538, 540, 545, 547, 549, 551, 553, + 555, 557, 559, 561, 563, 568, 570, 572, 582, 584, + 590, 591, 596, 598, 604, 605, 610, 612, 617, 619, + 621, 623, 625, 630, 632 }; #endif @@ -757,12 +757,12 @@ yysymbol_name (yysymbol_kind_t yysymbol) } #endif -#define YYPACT_NINF (-310) +#define YYPACT_NINF (-286) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) -#define YYTABLE_NINF (-76) +#define YYTABLE_NINF (-153) #define yytable_value_is_error(Yyn) \ 0 @@ -771,44 +771,45 @@ yysymbol_name (yysymbol_kind_t yysymbol) STATE-NUM. */ static const yytype_int16 yypact[] = { - -310, 31, 397, -310, 4, 2, 2, -3, 32, 27, - 167, 34, 489, 40, 41, 43, 2, 44, 47, 66, - 55, -310, 67, 115, -33, -310, -310, -310, -310, 1002, - 1002, 1002, 1002, 1002, -310, -310, -310, -310, -310, -310, - -310, -310, -310, -310, -310, 59, 2465, 2727, -310, 71, - -310, -310, -12, -310, 1002, 81, 82, -310, -310, 1002, - -310, -310, -310, 1115, -310, 1002, -310, -310, 124, 708, - 108, 129, 97, 1002, 1002, 107, 1002, 1002, 1002, -310, - -310, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, 1002, - 1002, 1002, -310, 1002, 133, -34, -34, 1169, -34, -34, - -310, 1002, 1002, 1002, 1002, 1002, 1002, 137, 1002, 1002, - 1002, 1002, 1002, 2, 2, 1002, 1002, 1002, 1002, 1002, - 1002, 1002, 1002, 1002, 1002, 1002, 750, -310, 141, 143, - 1223, 9, 1002, 1277, -310, 1331, 549, 127, 792, 1385, - 156, 162, 1002, 1439, 1493, 183, 1007, 1061, 2465, 2465, - 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465, 2465, - -39, 2465, 131, 149, 159, -310, 292, 292, -34, -34, - 2722, 2722, -43, 2606, 2664, -34, 2635, 2786, -310, -310, - 39, 39, 2693, 2693, 2722, 2722, 2577, 2548, 2786, 1547, - 2786, 1002, 2465, -310, 142, 154, 160, -310, 1002, 158, - 2465, 158, 489, 489, -310, -310, 1002, 319, 1601, 834, - 1002, 1002, 1655, 157, 161, 5, -310, -310, 179, 1002, - -310, 1002, 2747, -310, 1002, 1002, 1002, 1002, 1002, -31, - 165, 190, 141, 135, 197, 171, 171, 231, -310, 1709, - 489, 1763, 876, 918, 1817, 1871, 1925, 184, 217, 217, - 187, -310, 194, 1979, 2465, 1002, -310, 2465, 199, 200, - -38, 2519, -310, -310, -310, 204, 158, -310, 1002, 205, - 211, 489, -310, -310, 489, 489, 2033, 489, 2087, 960, - 489, 489, 193, 1002, 207, 210, -310, -310, -310, 2465, - -310, -310, -310, 594, 214, 171, 149, 216, 222, -310, - -310, -310, 489, -310, 489, 489, 2141, -310, -310, 70, - -5, 2465, -310, -310, -310, -310, 221, 213, 213, -310, - -310, -310, 489, 233, -30, 246, 224, 70, -310, 1002, - -310, 639, 226, 228, 227, 23, 213, 229, -310, 1002, - 1002, 1002, -29, 230, -310, 2465, 444, -310, 213, -310, - -310, 235, 23, -310, 2195, 2249, -23, 1002, 1002, -310, - 237, -310, 236, -310, -310, -310, 248, 2303, -19, -310, - -310, 1002, -310, 249, 684, 2357, 1002, -310, 2411, -310 + -286, 27, 404, -286, -5, -29, -29, 2, 31, 39, + 46, 42, 510, 44, 47, 48, -29, 51, 52, 57, + 56, -286, 36, -38, -44, -286, -286, -286, -286, 1066, + 1066, 1066, 1066, 1066, 1066, -286, -286, -286, -286, -286, + -286, -286, -286, -286, -286, -286, 60, 2686, 266, -286, + 72, -286, -286, -27, -286, 1066, 81, 82, -286, -286, + 1066, -286, -286, -286, 1282, -286, 1066, -286, -286, 128, + 730, 112, 134, 118, 1066, 1066, 116, 1066, 1066, 1066, + -286, -286, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, + 1066, 1066, 1066, -286, 1066, 145, 182, 182, 1336, 182, + 182, 2686, 87, 137, -286, 1066, 1066, 1066, 1066, 1066, + 1066, 158, 1066, 1066, 1066, 1066, 1066, -29, -29, 1066, + 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, 1066, + 1066, 772, -286, 166, 174, 1390, 1090, 1066, 1444, -286, + 1498, 571, 159, 814, 1552, 190, 198, 1066, 1606, 1660, + 219, 1174, 1228, 2740, 2740, 2740, 2740, 2740, 2740, 2740, + 2740, 2740, 2740, 2740, 2686, -43, 168, 170, -286, -286, + 1066, 193, 193, 182, 182, 2939, 2939, -37, 2852, 2881, + 182, 144, 2986, -286, -286, 133, 133, 2910, 2910, 2939, + 2939, 2823, 2794, 2986, 1118, 1714, 2986, 1066, 2740, -286, + 171, 169, 188, -286, 1066, 187, 2686, 187, 510, 510, + -286, -286, 1066, 856, 1768, 898, 1066, 1066, 1822, 192, + 196, 13, -286, -286, 217, 1066, -286, 1066, 2944, -286, + 1066, 2686, 1066, 1066, -286, 1066, -32, 201, 225, 166, + 165, 1876, 228, 210, 210, 261, -286, 1930, 510, 1984, + 940, 982, 2038, 2092, 2146, 216, 248, 248, 218, -286, + 222, 2200, 2686, 1066, -286, 227, 236, -42, 311, -286, + -286, -286, 238, 187, -286, 1066, 239, 244, 510, -286, + -286, 510, 510, 2254, 510, 2308, 1024, 510, 510, 215, + 1066, 220, 223, -286, -286, -286, 2740, -286, -286, -286, + 616, 242, 210, 137, 243, 245, -286, -286, -286, 510, + -286, 510, 510, 2362, -286, -286, 117, 22, 2686, -286, + -286, -286, -286, 250, 199, 199, -286, -286, -286, 510, + 254, -33, 270, 251, 117, -286, 1066, -286, 661, 255, + 252, 253, 40, 199, 256, -286, 1066, 1066, 1066, -30, + 260, -286, 2686, 465, -286, 199, -286, -286, 263, 40, + -286, 2416, 2470, -36, 1066, 1066, -286, 265, -286, 264, + -286, -286, -286, 276, 2524, -34, -286, -286, 1066, -286, + 279, 706, 2578, 1066, -286, 2632, -286 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -819,61 +820,62 @@ static const yytype_uint8 yydefact[] = 3, 0, 2, 1, 0, 0, 0, 108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107, 88, 113, 111, 26, 112, 105, 106, 0, - 0, 0, 0, 0, 4, 7, 5, 6, 17, 135, - 18, 13, 14, 15, 16, 0, 0, 109, 110, 76, - 133, 134, 0, 119, 0, 0, 0, 19, 20, 0, - 108, 88, 21, 0, 76, 0, 11, 53, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, - 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 138, 148, 0, 86, 87, 0, 104, 103, - 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 150, 4, 7, 5, 6, 17, + 137, 18, 13, 14, 15, 16, 0, 0, 109, 110, + 76, 135, 136, 0, 121, 0, 0, 0, 19, 20, + 0, 108, 88, 21, 0, 76, 0, 11, 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 140, 29, 0, - 0, 42, 42, 0, 22, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 136, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 161, - 0, 150, 0, 149, 0, 77, 82, 83, 84, 85, - 90, 91, 115, 81, 80, 79, 78, 102, 117, 118, - 97, 98, 94, 95, 92, 93, 99, 96, 100, 0, - 101, 0, 141, 31, 0, 30, 0, 120, 42, 40, - 43, 40, 0, 0, 52, 12, 0, 0, 0, 0, - 0, 0, 40, 0, 0, 0, 9, 146, 0, 0, - 24, 0, 114, 143, 0, 148, 148, 0, 0, 0, - 0, 0, 29, 0, 0, 44, 44, 61, 63, 0, + 124, 123, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 140, 150, 0, 86, 87, 0, 104, + 103, 152, 0, 151, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 10, 0, 0, 162, 0, 139, 151, 0, 0, - 0, 89, 142, 11, 32, 0, 40, 41, 0, 0, - 0, 0, 64, 72, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 8, 147, 25, 137, - 144, 145, 116, 0, 0, 44, 45, 35, 39, 62, - 71, 70, 0, 68, 0, 0, 0, 73, 74, 152, - 0, 59, 54, 55, 27, 11, 0, 46, 46, 69, - 67, 66, 0, 0, 0, 0, 0, 153, 154, 0, - 11, 0, 37, 0, 0, 48, 47, 0, 65, 0, - 0, 0, 0, 0, 155, 60, 56, 28, 46, 50, - 34, 0, 49, 38, 0, 0, 0, 0, 0, 33, - 0, 58, 0, 51, 158, 156, 0, 0, 0, 11, - 36, 0, 157, 0, 57, 0, 0, 159, 0, 160 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 142, 29, 0, 0, 42, 42, 0, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 138, 125, 126, 127, 128, 129, 130, + 131, 132, 133, 134, 163, 0, 0, 0, 77, 116, + 0, 82, 83, 84, 85, 90, 91, 117, 81, 80, + 79, 78, 102, 119, 120, 97, 98, 94, 95, 92, + 93, 99, 96, 100, 0, 0, 101, 0, 143, 31, + 0, 30, 0, 122, 42, 40, 43, 40, 0, 0, + 52, 12, 0, 0, 0, 0, 0, 0, 40, 0, + 0, 0, 9, 148, 0, 0, 24, 0, 114, 145, + 150, 153, 150, 0, 115, 0, 0, 0, 0, 29, + 0, 43, 0, 44, 44, 61, 63, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, + 0, 0, 164, 0, 141, 0, 0, 0, 89, 144, + 11, 32, 0, 40, 41, 0, 0, 0, 0, 64, + 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 149, 25, 139, 146, 147, 118, + 0, 0, 44, 45, 35, 39, 62, 71, 70, 0, + 68, 0, 0, 0, 73, 74, 154, 0, 59, 54, + 55, 27, 11, 0, 46, 46, 69, 67, 66, 0, + 0, 0, 0, 0, 155, 156, 0, 11, 0, 37, + 0, 0, 48, 47, 0, 65, 0, 0, 0, 0, + 0, 157, 60, 56, 28, 46, 50, 34, 0, 49, + 38, 0, 0, 0, 0, 0, 33, 0, 58, 0, + 51, 160, 158, 0, 0, 0, 11, 36, 0, 159, + 0, 57, 0, 0, 161, 0, 162 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { - -310, -310, -310, -310, -310, -310, -256, -1, -140, 64, - -310, -310, -94, -188, -121, -230, -309, -28, 30, -310, - -246, -310, -310, -310, -310, -310, -310, 38, -310, -310, - 19, -45, -2, -310, -310, -138, -187, -310, 0, -300, - -190 + -286, -286, -286, -286, -286, -286, -262, -1, -145, 91, + -286, -286, -123, -194, -131, -225, -259, -12, 9, -286, + -253, -286, -286, -286, -286, -286, -286, 38, -286, -286, + 16, -46, -2, -286, -286, -60, -190, -286, 17, -285, + -230 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int16 yydefgoto[] = { - 0, 1, 2, 34, 35, 215, 136, 67, 37, 194, - 195, 38, 39, 235, 199, 269, 334, 335, 68, 40, - 284, 310, 41, 42, 43, 44, 45, 46, 47, 48, - 55, 92, 64, 50, 51, 162, 163, 326, 336, 328, - 160 + 0, 1, 2, 35, 36, 221, 141, 68, 38, 200, + 201, 39, 40, 243, 205, 276, 341, 342, 69, 41, + 291, 317, 42, 43, 44, 45, 46, 47, 48, 49, + 56, 93, 65, 51, 52, 102, 103, 333, 343, 335, + 165 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -881,580 +883,620 @@ static const yytype_int16 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_int16 yytable[] = { - 49, 36, 127, 285, 229, 216, 270, 293, 4, 337, - 49, 201, 226, 236, 5, 6, 60, 107, 221, 221, - 340, 357, 93, 329, 247, 56, 224, 344, 5, 6, - 262, 3, 113, 114, 221, 72, 344, 260, 221, 362, - 53, 20, 52, 128, 21, 61, 23, 24, 63, 227, - 26, 27, 28, 330, 29, 30, 57, 54, 94, 331, - 222, 292, 341, 358, 31, 316, 250, 95, 96, 97, - 98, 99, 32, 33, 346, 251, 366, 233, 295, 129, - 373, 296, 59, 101, 102, 103, 104, 258, 259, 65, - 107, 58, 130, 110, 323, 69, 70, 133, 71, 73, - 361, 198, 74, 135, 75, 113, 114, 139, 324, 325, - 76, 143, 144, 374, 146, 147, 148, 77, 100, 149, - 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, - -75, 161, 178, 179, 49, 205, 131, 132, 137, 166, - 167, 168, 169, 170, 171, 140, 173, 174, 175, 176, - 177, 356, 142, 180, 181, 182, 183, 184, 185, 186, - 187, 188, 189, 190, 192, 78, 141, 145, 368, 200, - 200, 164, 5, 6, 60, 172, 208, 256, 193, 210, - 212, 196, 206, 79, 80, 211, 4, 223, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 230, 20, - 49, 49, 21, 61, 23, 24, 224, 91, 26, 27, - 28, 231, 29, 30, 225, 232, 234, 248, 5, 6, - 252, 249, 31, 333, 333, 263, 62, 264, 268, 161, - 32, 33, 237, 238, 266, 267, 200, 323, 49, 271, - 282, 351, 333, 283, 239, 241, 286, 244, 245, 246, - 287, 324, 325, 309, 333, 290, 291, 253, 351, 254, - 294, 297, 257, 161, 161, 159, 261, 298, 312, 49, - 273, 313, 49, 49, 315, 49, 317, 332, 49, 49, - 276, 278, 318, 339, 342, 343, 348, 349, 350, 359, - 353, 49, 205, 289, 363, 369, 265, 370, 371, 376, - 49, 299, 49, 49, 300, 301, 161, 303, 352, 327, - 307, 308, 0, 0, 0, 0, 0, 306, 0, 0, - 49, 311, 0, 0, 5, 6, 60, 0, 0, 49, - 205, 0, 319, 0, 320, 321, 0, 0, 103, 104, - 0, 0, 0, 107, 49, 205, 110, 0, 0, 0, - 0, 20, 338, 0, 21, 61, 23, 24, 113, 114, - 26, 27, 28, 0, 29, 30, 0, 345, 0, 0, - 0, 0, 49, 205, 31, 240, 0, 354, 355, 159, - 0, 0, 32, 33, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 367, 159, 0, 0, 0, - 4, 0, 5, 6, 7, 0, 8, 0, 9, 375, - 10, 11, 12, 0, 378, 0, 0, 13, 14, 15, - 0, 16, 17, 0, 18, 0, 19, 0, 0, 20, - 0, 0, 21, 22, 23, 24, 0, 25, 26, 27, - 28, 0, 29, 30, 0, 0, 0, 0, 0, 5, - 6, 7, 31, 8, 0, 9, 0, 10, 11, 12, - 32, 33, 0, 360, 13, 14, 15, 0, 16, 17, - 283, 18, 0, 0, 0, 0, 20, 0, 0, 21, - 22, 23, 24, 0, 25, 26, 27, 28, 0, 29, - 30, 0, 0, 0, 5, 6, 7, 0, 8, 31, - 9, 0, 10, 11, 12, 0, 0, 32, 33, 13, - 14, 15, 0, 16, 17, 0, 18, 0, 0, 0, - 0, 20, 0, 0, 21, 22, 23, 24, 0, 25, - 26, 27, 28, 0, 29, 30, 0, 0, 0, 0, - 0, 0, 0, 0, 31, 0, 0, 0, 0, 66, - 0, 0, 32, 33, 5, 6, 7, 0, 8, 0, - 9, 0, 10, 11, 12, 0, 0, 0, 0, 13, - 14, 15, 0, 16, 17, 0, 18, 0, 0, 0, - 0, 20, 0, 0, 21, 22, 23, 24, 0, 25, - 26, 27, 28, 0, 29, 30, 0, 0, 0, 5, - 6, 7, 0, 8, 31, 9, 0, 10, 11, 12, - 204, 0, 32, 33, 13, 14, 15, 0, 16, 17, - 0, 18, 0, 0, 0, 0, 20, 0, 0, 21, - 22, 23, 24, 0, 25, 26, 27, 28, 0, 29, - 30, 0, 0, 0, 5, 6, 7, 0, 8, 31, - 9, 0, 10, 11, 12, 314, 0, 32, 33, 13, - 14, 15, 0, 16, 17, 0, 18, 0, 0, 0, - 0, 20, 0, 0, 21, 22, 23, 24, 0, 25, - 26, 27, 28, 0, 29, 30, 0, 0, 0, 5, - 6, 7, 0, 8, 31, 9, 0, 10, 11, 12, - 347, 0, 32, 33, 13, 14, 15, 0, 16, 17, - 0, 18, 0, 5, 6, 60, 20, 0, 0, 21, + 50, 37, 132, 267, 292, 222, 207, 236, 300, 54, + 50, 94, 79, 244, 227, 227, 4, 347, 232, 277, + 364, 227, 57, 227, 255, 170, 55, 3, 133, 269, + 80, 81, 73, 53, 166, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 5, 6, 95, 64, 351, + 336, 5, 6, 61, 92, 233, 228, 299, 351, 348, + 338, 58, 365, 373, 134, 380, 344, 96, 97, 98, + 99, 100, 101, 240, 258, 353, 259, 323, 20, 302, + 337, 21, 62, 23, 24, 303, 78, 26, 27, 28, + 59, 29, 30, 135, 60, 76, 369, 66, 138, 70, + 368, 31, 71, 72, 140, 63, 74, 75, 144, 32, + 33, 77, 148, 149, 381, 151, 152, 153, 363, 104, + 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 164, -75, 101, 183, 184, 375, 136, 137, 34, 50, + 211, 330, 142, 171, 172, 173, 174, 175, 176, 145, + 178, 179, 180, 181, 182, 331, 332, 185, 186, 187, + 188, 189, 190, 191, 192, 193, 194, 195, 196, 198, + 265, 146, 266, 147, 206, 206, 150, 105, 106, 107, + 108, 214, 264, 167, 111, 218, 169, 114, 105, 106, + 107, 108, 109, 110, 170, 111, 177, 113, 114, 117, + 118, 340, 340, 199, 5, 6, 50, 50, 231, 116, + 117, 118, 202, 216, 212, 119, 120, 245, 246, 358, + 340, 217, 4, 330, 229, 230, 238, 237, 121, 122, + 123, 124, 340, 111, 127, 101, 358, 331, 332, 107, + 108, 130, 241, 239, 111, 242, 50, 114, 117, 118, + 247, 249, 256, 252, 253, 254, 257, 280, 260, 117, + 118, 270, 271, 261, 273, 262, 274, 275, 101, 278, + 101, 164, 289, 268, 290, 316, 50, 293, 294, 50, + 50, 319, 50, 297, 320, 50, 50, 306, 283, 285, + 307, 308, 298, 310, 301, 304, 314, 315, 50, 211, + 305, 296, 322, 324, 346, 325, 339, 50, 349, 50, + 50, 356, 350, 101, 357, 355, 131, 360, 326, 366, + 327, 328, 370, 376, 313, 377, 378, 50, 318, 383, + 272, 359, 0, 334, 80, 81, 50, 211, 345, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 0, + 0, 50, 211, 0, 0, 105, 106, 107, 108, 109, + 110, 0, 111, 112, 113, 114, 0, 0, 0, 0, + 0, 0, 0, 115, 352, 0, 116, 117, 118, 50, + 211, 0, 119, 120, 361, 362, 164, 0, 0, 0, + 0, 0, 0, 0, 0, 121, 122, 123, 124, 125, + 126, 127, 374, 164, 0, 0, 0, 4, 130, 5, + 6, 7, 0, 8, 0, 9, 382, 10, 11, 12, + 0, 385, 0, 0, 13, 14, 15, 0, 16, 17, + 0, 18, 0, 19, 0, 0, 20, 0, 0, 21, 22, 23, 24, 0, 25, 26, 27, 28, 0, 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 31, - 20, 0, 0, 21, 61, 23, 24, 32, 33, 26, - 27, 28, 0, 29, 30, 5, 6, 60, 0, 0, - 0, 0, 0, 31, 0, 0, 0, 138, 0, 0, - 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 20, 0, 0, 21, 61, 23, 24, 0, - 0, 26, 27, 28, 0, 29, 30, 5, 6, 60, + 0, 0, 0, 0, 0, 0, 0, 32, 33, 0, + 5, 6, 7, 0, 8, 0, 9, 0, 10, 11, + 12, 0, 0, 0, 367, 13, 14, 15, 0, 16, + 17, 290, 18, 0, 0, 0, 34, 20, 0, 0, + 21, 22, 23, 24, 0, 25, 26, 27, 28, 0, + 29, 30, 0, 0, 0, 5, 6, 7, 0, 8, + 31, 9, 0, 10, 11, 12, 0, 0, 32, 33, + 13, 14, 15, 0, 16, 17, 0, 18, 0, 0, + 0, 0, 20, 0, 0, 21, 22, 23, 24, 0, + 25, 26, 27, 28, 0, 29, 30, 34, 0, 0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, - 191, 0, 0, 32, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 20, 0, 0, 21, 61, 23, + 67, 0, 0, 32, 33, 0, 5, 6, 7, 0, + 8, 0, 9, 0, 10, 11, 12, 0, 0, 0, + 0, 13, 14, 15, 0, 16, 17, 0, 18, 0, + 0, 0, 34, 20, 0, 0, 21, 22, 23, 24, + 0, 25, 26, 27, 28, 0, 29, 30, 0, 0, + 0, 5, 6, 7, 0, 8, 31, 9, 0, 10, + 11, 12, 210, 0, 32, 33, 13, 14, 15, 0, + 16, 17, 0, 18, 0, 0, 0, 0, 20, 0, + 0, 21, 22, 23, 24, 0, 25, 26, 27, 28, + 0, 29, 30, 34, 0, 0, 5, 6, 7, 0, + 8, 31, 9, 0, 10, 11, 12, 321, 0, 32, + 33, 13, 14, 15, 0, 16, 17, 0, 18, 0, + 0, 0, 0, 20, 0, 0, 21, 22, 23, 24, + 0, 25, 26, 27, 28, 0, 29, 30, 34, 0, + 0, 5, 6, 7, 0, 8, 31, 9, 0, 10, + 11, 12, 354, 0, 32, 33, 13, 14, 15, 0, + 16, 17, 0, 18, 0, 5, 6, 61, 20, 0, + 0, 21, 22, 23, 24, 0, 25, 26, 27, 28, + 0, 29, 30, 34, 0, 0, 0, 0, 0, 0, + 0, 31, 20, 0, 0, 21, 62, 23, 24, 32, + 33, 26, 27, 28, 0, 29, 30, 5, 6, 61, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 143, + 0, 0, 0, 32, 33, 0, 0, 0, 34, 0, + 0, 0, 0, 0, 20, 0, 0, 21, 62, 23, 24, 0, 0, 26, 27, 28, 0, 29, 30, 5, - 6, 60, 0, 0, 0, 0, 0, 31, 0, 0, - 0, 207, 0, 0, 0, 32, 33, 0, 0, 0, + 6, 61, 34, 0, 0, 0, 0, 31, 0, 0, + 0, 0, 197, 0, 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 21, - 61, 23, 24, 0, 0, 26, 27, 28, 0, 29, - 30, 5, 6, 60, 0, 0, 0, 0, 0, 31, - 0, 0, 0, 243, 0, 0, 0, 32, 33, 0, + 62, 23, 24, 0, 0, 26, 27, 28, 0, 29, + 30, 5, 6, 61, 34, 0, 0, 0, 0, 31, + 0, 0, 0, 213, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, - 0, 21, 61, 23, 24, 0, 0, 26, 27, 28, - 0, 29, 30, 5, 6, 60, 0, 0, 0, 0, - 0, 31, 275, 0, 0, 0, 0, 0, 0, 32, + 0, 21, 62, 23, 24, 0, 0, 26, 27, 28, + 0, 29, 30, 5, 6, 61, 34, 0, 0, 0, + 0, 31, 248, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 20, 0, 0, 21, 61, 23, 24, 0, 0, 26, - 27, 28, 0, 29, 30, 5, 6, 60, 0, 0, - 0, 0, 0, 31, 277, 0, 0, 0, 0, 0, + 20, 0, 0, 21, 62, 23, 24, 0, 0, 26, + 27, 28, 0, 29, 30, 5, 6, 61, 34, 0, + 0, 0, 0, 31, 0, 0, 0, 251, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 20, 0, 0, 21, 61, 23, 24, 0, - 0, 26, 27, 28, 0, 29, 30, 5, 6, 60, - 0, 0, 0, 0, 0, 31, 305, 0, 0, 0, + 0, 0, 20, 0, 0, 21, 62, 23, 24, 0, + 0, 26, 27, 28, 0, 29, 30, 5, 6, 61, + 34, 0, 0, 0, 0, 31, 282, 0, 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 20, 0, 0, 21, 61, 23, - 24, 0, 0, 26, 27, 28, 0, 29, 30, 0, - 0, 101, 102, 103, 104, 105, 106, 31, 107, 108, - 109, 110, 0, 217, 218, 32, 33, 0, 0, 111, - 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, + 0, 0, 0, 0, 20, 0, 0, 21, 62, 23, + 24, 0, 0, 26, 27, 28, 0, 29, 30, 5, + 6, 61, 34, 0, 0, 0, 0, 31, 284, 0, + 0, 0, 0, 0, 0, 32, 33, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 20, 0, 0, 21, + 62, 23, 24, 0, 0, 26, 27, 28, 0, 29, + 30, 5, 6, 61, 34, 0, 0, 0, 0, 31, + 312, 0, 0, 0, 0, 0, 0, 32, 33, 0, + 0, 0, 0, 0, 0, 5, 6, 61, 20, 0, + 0, 21, 62, 23, 24, 0, 0, 26, 27, 28, + 0, 29, 30, 0, 0, 0, 34, 0, 0, 0, + 0, 31, 20, 0, 0, 21, 62, 23, 24, 32, + 33, 26, 27, 28, 0, 29, 30, 0, 0, 0, + 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, + 0, 0, 0, 32, 33, 0, 0, 0, 34, 0, + 0, 0, 105, 106, 107, 108, 109, 110, 0, 111, + 112, 113, 114, 0, 0, 0, 0, 0, 0, 0, + 115, 0, 204, 116, 117, 118, 0, 0, 0, 119, + 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 121, 122, 123, 124, 125, 126, 127, 0, + 128, 0, 0, 0, 129, 130, 0, 234, 105, 106, + 107, 108, 109, 110, 0, 111, 112, 113, 114, 0, + 223, 224, 0, 0, 0, 0, 115, 0, 0, 116, + 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 121, 122, + 123, 124, 125, 126, 127, 0, 128, 0, 0, 0, + 129, 130, 105, 106, 107, 108, 109, 110, 0, 111, + 112, 113, 114, 0, 0, 225, 0, 226, 0, 0, + 115, 0, 0, 116, 117, 118, 0, 0, 0, 119, + 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 121, 122, 123, 124, 125, 126, 127, 0, + 128, 0, 0, 0, 129, 130, 105, 106, 107, 108, + 109, 110, 0, 111, 112, 113, 114, 0, 0, 0, + 0, 139, 0, 0, 115, 0, 0, 116, 117, 118, + 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 121, 122, 123, 124, + 125, 126, 127, 0, 128, 0, 0, 0, 129, 130, + 105, 106, 107, 108, 109, 110, 0, 111, 112, 113, + 114, 0, 168, 0, 0, 0, 0, 0, 115, 0, + 0, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, - 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, - 106, 0, 107, 108, 109, 110, 0, 0, 219, 0, - 220, 0, 0, 111, 0, 0, 112, 113, 114, 0, - 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, - 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, - 0, 0, 0, 0, 134, 0, 0, 111, 0, 0, - 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, - 107, 108, 109, 110, 0, 165, 0, 0, 0, 0, - 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, - 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, - 104, 105, 106, 0, 107, 108, 109, 110, 0, 197, - 0, 0, 0, 0, 0, 111, 0, 0, 112, 113, - 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, - 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, - 109, 110, 0, 202, 0, 0, 0, 0, 0, 111, - 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, + 121, 122, 123, 124, 125, 126, 127, 0, 128, 0, + 0, 0, 129, 130, 105, 106, 107, 108, 109, 110, + 0, 111, 112, 113, 114, 0, 203, 0, 0, 0, + 0, 0, 115, 0, 0, 116, 117, 118, 0, 0, + 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 121, 122, 123, 124, 125, 126, + 127, 0, 128, 0, 0, 0, 129, 130, 105, 106, + 107, 108, 109, 110, 0, 111, 112, 113, 114, 0, + 208, 0, 0, 0, 0, 0, 115, 0, 0, 116, + 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 121, 122, + 123, 124, 125, 126, 127, 0, 128, 0, 0, 0, + 129, 130, 105, 106, 107, 108, 109, 110, 0, 111, + 112, 113, 114, 0, 209, 0, 0, 0, 0, 0, + 115, 0, 0, 116, 117, 118, 0, 0, 0, 119, + 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 121, 122, 123, 124, 125, 126, 127, 0, + 128, 0, 0, 0, 129, 130, 105, 106, 107, 108, + 109, 110, 0, 111, 112, 113, 114, 0, 0, 0, + 0, 215, 0, 0, 115, 0, 0, 116, 117, 118, + 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 121, 122, 123, 124, + 125, 126, 127, 0, 128, 0, 0, 0, 129, 130, + 105, 106, 107, 108, 109, 110, 0, 111, 112, 113, + 114, 0, 219, 0, 0, 0, 0, 0, 115, 0, + 0, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, - 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, - 106, 0, 107, 108, 109, 110, 0, 203, 0, 0, - 0, 0, 0, 111, 0, 0, 112, 113, 114, 0, - 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, - 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, - 0, 0, 0, 0, 209, 0, 0, 111, 0, 0, - 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, - 107, 108, 109, 110, 0, 213, 0, 0, 0, 0, - 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, - 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, - 104, 105, 106, 0, 107, 108, 109, 110, 0, 214, - 0, 0, 0, 0, 0, 111, 0, 0, 112, 113, - 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, - 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, - 109, 110, 0, 0, 0, 228, 0, 0, 0, 111, - 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, + 121, 122, 123, 124, 125, 126, 127, 0, 128, 0, + 0, 0, 129, 130, 105, 106, 107, 108, 109, 110, + 0, 111, 112, 113, 114, 0, 220, 0, 0, 0, + 0, 0, 115, 0, 0, 116, 117, 118, 0, 0, + 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 121, 122, 123, 124, 125, 126, + 127, 0, 128, 0, 0, 0, 129, 130, 105, 106, + 107, 108, 109, 110, 0, 111, 112, 113, 114, 0, + 0, 0, 235, 0, 0, 0, 115, 0, 0, 116, + 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 121, 122, + 123, 124, 125, 126, 127, 0, 128, 0, 0, 0, + 129, 130, 105, 106, 107, 108, 109, 110, 0, 111, + 112, 113, 114, 0, 0, 0, 0, 250, 0, 0, + 115, 0, 0, 116, 117, 118, 0, 0, 0, 119, + 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 121, 122, 123, 124, 125, 126, 127, 0, + 128, 0, 0, 0, 129, 130, 105, 106, 107, 108, + 109, 110, 0, 111, 112, 113, 114, 0, 0, 0, + 242, 0, 0, 0, 115, 0, 0, 116, 117, 118, + 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 121, 122, 123, 124, + 125, 126, 127, 0, 128, 0, 0, 0, 129, 130, + 105, 106, 107, 108, 109, 110, 0, 111, 112, 113, + 114, 0, 0, -152, 0, 0, 0, 0, 115, 0, + 0, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, - 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, - 106, 0, 107, 108, 109, 110, 0, 0, 0, 0, - 242, 0, 0, 111, 0, 0, 112, 113, 114, 0, - 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, - 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, - 0, 0, 0, 234, 0, 0, 0, 111, 0, 0, - 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, - 107, 108, 109, 110, 0, 272, 0, 0, 0, 0, - 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, - 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, - 104, 105, 106, 0, 107, 108, 109, 110, 0, 274, - 0, 0, 0, 0, 0, 111, 0, 0, 112, 113, - 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, - 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, - 109, 110, 0, 0, 0, 0, 279, 0, 0, 111, - 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, + 121, 122, 123, 124, 125, 126, 127, 0, 128, 0, + 0, 0, 129, 130, 105, 106, 107, 108, 109, 110, + 0, 111, 112, 113, 114, 0, 279, 0, 0, 0, + 0, 0, 115, 0, 0, 116, 117, 118, 0, 0, + 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 121, 122, 123, 124, 125, 126, + 127, 0, 128, 0, 0, 0, 129, 130, 105, 106, + 107, 108, 109, 110, 0, 111, 112, 113, 114, 0, + 281, 0, 0, 0, 0, 0, 115, 0, 0, 116, + 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 121, 122, + 123, 124, 125, 126, 127, 0, 128, 0, 0, 0, + 129, 130, 105, 106, 107, 108, 109, 110, 0, 111, + 112, 113, 114, 0, 0, 0, 0, 286, 0, 0, + 115, 0, 0, 116, 117, 118, 0, 0, 0, 119, + 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 121, 122, 123, 124, 125, 126, 127, 0, + 128, 0, 0, 0, 129, 130, 105, 106, 107, 108, + 109, 110, 0, 111, 112, 113, 114, 0, 287, 0, + 0, 0, 0, 0, 115, 0, 0, 116, 117, 118, + 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 121, 122, 123, 124, + 125, 126, 127, 0, 128, 0, 0, 0, 129, 130, + 105, 106, 107, 108, 109, 110, 0, 111, 112, 113, + 114, 0, 288, 0, 0, 0, 0, 0, 115, 0, + 0, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, - 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, - 106, 0, 107, 108, 109, 110, 0, 280, 0, 0, - 0, 0, 0, 111, 0, 0, 112, 113, 114, 0, - 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, - 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, - 0, 281, 0, 0, 0, 0, 0, 111, 0, 0, - 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, - 107, 108, 109, 110, 0, 0, 0, 0, 288, 0, - 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, - 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, - 104, 105, 106, 0, 107, 108, 109, 110, 0, 302, - 0, 0, 0, 0, 0, 111, 0, 0, 112, 113, - 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, - 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, - 109, 110, 0, 304, 0, 0, 0, 0, 0, 111, - 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, + 121, 122, 123, 124, 125, 126, 127, 0, 128, 0, + 0, 0, 129, 130, 105, 106, 107, 108, 109, 110, + 0, 111, 112, 113, 114, 0, 0, 0, 0, 295, + 0, 0, 115, 0, 0, 116, 117, 118, 0, 0, + 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 121, 122, 123, 124, 125, 126, + 127, 0, 128, 0, 0, 0, 129, 130, 105, 106, + 107, 108, 109, 110, 0, 111, 112, 113, 114, 0, + 309, 0, 0, 0, 0, 0, 115, 0, 0, 116, + 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 121, 122, + 123, 124, 125, 126, 127, 0, 128, 0, 0, 0, + 129, 130, 105, 106, 107, 108, 109, 110, 0, 111, + 112, 113, 114, 0, 311, 0, 0, 0, 0, 0, + 115, 0, 0, 116, 117, 118, 0, 0, 0, 119, + 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 121, 122, 123, 124, 125, 126, 127, 0, + 128, 0, 0, 0, 129, 130, 105, 106, 107, 108, + 109, 110, 0, 111, 112, 113, 114, 0, 329, 0, + 0, 0, 0, 0, 115, 0, 0, 116, 117, 118, + 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 121, 122, 123, 124, + 125, 126, 127, 0, 128, 0, 0, 0, 129, 130, + 105, 106, 107, 108, 109, 110, 0, 111, 112, 113, + 114, 0, 0, 0, 0, 371, 0, 0, 115, 0, + 0, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, - 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, - 106, 0, 107, 108, 109, 110, 0, 322, 0, 0, - 0, 0, 0, 111, 0, 0, 112, 113, 114, 0, - 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, - 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, - 0, 0, 0, 0, 364, 0, 0, 111, 0, 0, - 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, - 107, 108, 109, 110, 0, 0, 0, 0, 365, 0, - 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, - 115, 116, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 117, 118, 119, 120, 121, 122, 123, - 0, 0, 0, 0, 0, 124, 125, 101, 102, 103, - 104, 105, 106, 0, 107, 108, 109, 110, 0, 0, - 0, 0, 372, 0, 0, 111, 0, 0, 112, 113, - 114, 0, 0, 0, 115, 116, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 117, 118, 119, - 120, 121, 122, 123, 0, 0, 0, 0, 0, 124, - 125, 101, 102, 103, 104, 105, 106, 0, 107, 108, - 109, 110, 0, 0, 0, 0, 377, 0, 0, 111, - 0, 0, 112, 113, 114, 0, 0, 0, 115, 116, + 121, 122, 123, 124, 125, 126, 127, 0, 128, 0, + 0, 0, 129, 130, 105, 106, 107, 108, 109, 110, + 0, 111, 112, 113, 114, 0, 0, 0, 0, 372, + 0, 0, 115, 0, 0, 116, 117, 118, 0, 0, + 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 121, 122, 123, 124, 125, 126, + 127, 0, 128, 0, 0, 0, 129, 130, 105, 106, + 107, 108, 109, 110, 0, 111, 112, 113, 114, 0, + 0, 0, 0, 379, 0, 0, 115, 0, 0, 116, + 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 121, 122, + 123, 124, 125, 126, 127, 0, 128, 0, 0, 0, + 129, 130, 105, 106, 107, 108, 109, 110, 0, 111, + 112, 113, 114, 0, 0, 0, 0, 384, 0, 0, + 115, 0, 0, 116, 117, 118, 0, 0, 0, 119, + 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 121, 122, 123, 124, 125, 126, 127, 0, + 128, 0, 0, 0, 129, 130, 105, 106, 107, 108, + 109, 110, 0, 111, 112, 113, 114, 0, 0, 0, + 0, 386, 0, 0, 115, 0, 0, 116, 117, 118, + 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 121, 122, 123, 124, + 125, 126, 127, 0, 128, 0, 0, 0, 129, 130, + 105, 106, 107, 108, 109, 110, 0, 111, 112, 113, + 114, 0, 0, 0, 0, 0, 0, 0, 115, 0, + 0, 116, 117, 118, 0, 0, 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 117, 118, 119, 120, 121, 122, 123, 0, 0, - 0, 0, 0, 124, 125, 101, 102, 103, 104, 105, - 106, 0, 107, 108, 109, 110, 0, 0, 0, 0, - 379, 0, 0, 111, 0, 0, 112, 113, 114, 0, - 0, 0, 115, 116, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 117, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 124, 125, 101, - 102, 103, 104, 105, 106, 0, 107, 108, 109, 110, - 0, 0, 0, 0, 0, 0, 0, 111, 0, 0, - 112, 113, 114, 0, 0, 0, 115, 116, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 117, - 118, 119, 120, 121, 122, 123, 0, 0, 0, 0, - 0, 124, 125, 101, 102, 103, 104, 105, 106, 0, - 107, 108, 109, 110, 0, 0, 0, 0, 0, 0, - 0, 111, 0, 0, 112, 113, 114, 0, 0, 0, - 115, 116, 101, 102, 103, 104, 105, 106, 0, 107, - 108, 109, 110, 117, 118, 119, 120, 121, 122, 123, - 111, 0, 0, 112, 113, 114, 125, 0, 0, 115, - 116, 101, 102, 103, 104, 105, 106, 0, 107, 108, - 109, 110, 117, 118, 119, 120, 121, 0, 123, 111, - 0, 0, 112, 113, 114, 125, 0, 0, 115, 116, - 101, 102, 103, 104, 105, 106, 0, 107, 0, 109, - 110, 117, 118, 119, 120, 0, 0, 123, 111, 0, - 0, 112, 113, 114, 125, 0, 0, 115, 116, 101, - 102, 103, 104, 105, 106, 0, 107, 0, 109, 110, - 117, 118, 119, 120, 0, 0, 123, 0, 0, 0, - 112, 113, 114, 125, 0, 0, 115, 116, 101, 102, - 103, 104, 105, 106, 0, 107, 0, 0, 110, 117, - 118, 119, 120, 0, 0, 123, 0, 0, 0, 112, - 113, 114, 125, 0, 0, 115, 116, 101, 102, 103, - 104, 105, 106, 0, 107, 0, 0, 110, 117, 118, - 119, 120, 0, 0, 123, 0, 0, 0, 112, 113, - 114, 125, 0, 0, 115, 116, 101, 102, 103, 104, - 0, 0, 0, 107, 0, 0, 110, 126, 0, 119, - 120, 0, 0, 123, 0, 0, 0, 112, 113, 114, - 125, 0, 0, 115, 116, 79, 80, 255, 0, 0, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 0, 0, 123, 0, 0, 79, 80, 0, 0, 125, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 101, 102, 103, 104, 0, 0, 0, 107, 0, 0, - 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 113, 114, 0, 0, 0, 115, 116 + 121, 122, 123, 124, 125, 126, 127, 0, 128, 0, + 0, 0, 129, 130, 105, 106, 107, 108, 109, 110, + 0, 111, 112, 113, 114, 0, 0, 0, 0, 0, + 0, 0, 115, 0, 0, 116, 117, 118, 0, 0, + 0, 119, 120, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 121, 122, 123, 124, 125, 126, + 127, 0, 0, 0, 0, 0, 129, 130, 105, 106, + 107, 108, 109, 110, 0, 111, 112, 113, 114, 0, + 0, 0, 0, 0, 0, 0, 115, 0, 0, 116, + 117, 118, 0, 0, 0, 119, 120, 105, 106, 107, + 108, 109, 110, 0, 111, 112, 113, 114, 121, 122, + 123, 124, 125, 0, 127, 115, 0, 0, 116, 117, + 118, 130, 0, 0, 119, 120, 105, 106, 107, 108, + 109, 110, 0, 111, 0, 113, 114, 121, 122, 123, + 124, 0, 0, 127, 115, 0, 0, 116, 117, 118, + 130, 0, 0, 119, 120, 105, 106, 107, 108, 109, + 110, 0, 111, 0, 0, 114, 121, 122, 123, 124, + 0, 0, 127, 0, 0, 0, 116, 117, 118, 130, + 0, 0, 119, 120, 105, 106, 107, 108, 109, 110, + 0, 111, 0, 0, 114, 121, 122, 123, 124, 0, + 0, 127, 0, 0, 0, 116, 117, 118, 130, 0, + 0, 119, 120, 105, 106, 107, 108, 0, 0, 0, + 111, 0, 0, 114, 263, 0, 123, 124, 0, 0, + 127, 0, 0, 0, 116, 117, 118, 130, 0, 0, + 119, 120, 80, 81, 0, 0, 0, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 0, 0, 127, + 105, 106, 107, 108, 0, 0, 130, 111, 0, 0, + 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 117, 118, 0, 0, 0, 119, 120 }; static const yytype_int16 yycheck[] = { - 2, 2, 47, 249, 191, 145, 236, 263, 3, 318, - 12, 132, 55, 201, 5, 6, 7, 51, 57, 57, - 50, 50, 55, 28, 212, 6, 57, 327, 5, 6, - 61, 0, 66, 67, 57, 16, 336, 227, 57, 348, - 38, 32, 38, 55, 35, 36, 37, 38, 10, 92, - 41, 42, 43, 58, 45, 46, 59, 55, 91, 315, - 99, 99, 92, 92, 55, 295, 61, 29, 30, 31, - 32, 33, 63, 64, 330, 215, 99, 198, 266, 91, - 99, 268, 55, 44, 45, 46, 47, 225, 226, 55, - 51, 59, 54, 54, 24, 55, 55, 59, 55, 55, - 346, 92, 55, 65, 38, 66, 67, 69, 38, 39, - 55, 73, 74, 369, 76, 77, 78, 50, 59, 81, + 2, 2, 48, 233, 257, 150, 137, 197, 270, 38, + 12, 55, 50, 207, 57, 57, 3, 50, 55, 244, + 50, 57, 6, 57, 218, 57, 55, 0, 55, 61, + 68, 69, 16, 38, 94, 73, 74, 75, 76, 77, + 78, 79, 80, 81, 82, 5, 6, 91, 10, 334, + 28, 5, 6, 7, 92, 92, 99, 99, 343, 92, + 322, 59, 92, 99, 91, 99, 325, 29, 30, 31, + 32, 33, 34, 204, 61, 337, 221, 302, 32, 273, + 58, 35, 36, 37, 38, 275, 50, 41, 42, 43, + 59, 45, 46, 55, 55, 38, 355, 55, 60, 55, + 353, 55, 55, 55, 66, 59, 55, 55, 70, 63, + 64, 55, 74, 75, 376, 77, 78, 79, 348, 59, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, - 59, 93, 113, 114, 136, 136, 55, 55, 14, 101, - 102, 103, 104, 105, 106, 37, 108, 109, 110, 111, - 112, 341, 55, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 125, 126, 50, 37, 60, 358, 131, - 132, 38, 5, 6, 7, 38, 138, 222, 37, 23, - 142, 38, 55, 68, 69, 23, 3, 56, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 56, 32, - 202, 203, 35, 36, 37, 38, 57, 92, 41, 42, - 43, 57, 45, 46, 55, 55, 58, 60, 5, 6, - 41, 60, 55, 317, 318, 60, 59, 37, 57, 191, - 63, 64, 202, 203, 99, 38, 198, 24, 240, 8, - 56, 335, 336, 26, 206, 207, 59, 209, 210, 211, - 56, 38, 39, 60, 348, 56, 56, 219, 352, 221, - 56, 56, 224, 225, 226, 227, 228, 56, 61, 271, - 240, 61, 274, 275, 60, 277, 60, 56, 280, 281, - 242, 243, 60, 50, 38, 61, 60, 59, 61, 59, - 61, 293, 293, 255, 59, 58, 232, 61, 50, 50, - 302, 271, 304, 305, 274, 275, 268, 277, 336, 309, - 280, 281, -1, -1, -1, -1, -1, 279, -1, -1, - 322, 283, -1, -1, 5, 6, 7, -1, -1, 331, - 331, -1, 302, -1, 304, 305, -1, -1, 46, 47, - -1, -1, -1, 51, 346, 346, 54, -1, -1, -1, - -1, 32, 322, -1, 35, 36, 37, 38, 66, 67, - 41, 42, 43, -1, 45, 46, -1, 329, -1, -1, - -1, -1, 374, 374, 55, 56, -1, 339, 340, 341, - -1, -1, 63, 64, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 357, 358, -1, -1, -1, - 3, -1, 5, 6, 7, -1, 9, -1, 11, 371, - 13, 14, 15, -1, 376, -1, -1, 20, 21, 22, - -1, 24, 25, -1, 27, -1, 29, -1, -1, 32, - -1, -1, 35, 36, 37, 38, -1, 40, 41, 42, - 43, -1, 45, 46, -1, -1, -1, -1, -1, 5, - 6, 7, 55, 9, -1, 11, -1, 13, 14, 15, - 63, 64, -1, 19, 20, 21, 22, -1, 24, 25, - 26, 27, -1, -1, -1, -1, 32, -1, -1, 35, - 36, 37, 38, -1, 40, 41, 42, 43, -1, 45, - 46, -1, -1, -1, 5, 6, 7, -1, 9, 55, - 11, -1, 13, 14, 15, -1, -1, 63, 64, 20, - 21, 22, -1, 24, 25, -1, 27, -1, -1, -1, - -1, 32, -1, -1, 35, 36, 37, 38, -1, 40, - 41, 42, 43, -1, 45, 46, -1, -1, -1, -1, - -1, -1, -1, -1, 55, -1, -1, -1, -1, 60, - -1, -1, 63, 64, 5, 6, 7, -1, 9, -1, - 11, -1, 13, 14, 15, -1, -1, -1, -1, 20, - 21, 22, -1, 24, 25, -1, 27, -1, -1, -1, - -1, 32, -1, -1, 35, 36, 37, 38, -1, 40, - 41, 42, 43, -1, 45, 46, -1, -1, -1, 5, - 6, 7, -1, 9, 55, 11, -1, 13, 14, 15, - 61, -1, 63, 64, 20, 21, 22, -1, 24, 25, - -1, 27, -1, -1, -1, -1, 32, -1, -1, 35, - 36, 37, 38, -1, 40, 41, 42, 43, -1, 45, - 46, -1, -1, -1, 5, 6, 7, -1, 9, 55, - 11, -1, 13, 14, 15, 61, -1, 63, 64, 20, - 21, 22, -1, 24, 25, -1, 27, -1, -1, -1, - -1, 32, -1, -1, 35, 36, 37, 38, -1, 40, - 41, 42, 43, -1, 45, 46, -1, -1, -1, 5, - 6, 7, -1, 9, 55, 11, -1, 13, 14, 15, - 61, -1, 63, 64, 20, 21, 22, -1, 24, 25, - -1, 27, -1, 5, 6, 7, 32, -1, -1, 35, + 92, 59, 94, 117, 118, 365, 55, 55, 92, 141, + 141, 24, 14, 105, 106, 107, 108, 109, 110, 37, + 112, 113, 114, 115, 116, 38, 39, 119, 120, 121, + 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, + 230, 37, 232, 55, 136, 137, 60, 44, 45, 46, + 47, 143, 228, 38, 51, 147, 99, 54, 44, 45, + 46, 47, 48, 49, 57, 51, 38, 53, 54, 66, + 67, 324, 325, 37, 5, 6, 208, 209, 170, 65, + 66, 67, 38, 23, 55, 71, 72, 208, 209, 342, + 343, 23, 3, 24, 56, 55, 57, 56, 84, 85, + 86, 87, 355, 51, 90, 197, 359, 38, 39, 46, + 47, 97, 204, 55, 51, 58, 248, 54, 66, 67, + 212, 213, 60, 215, 216, 217, 60, 248, 41, 66, + 67, 60, 37, 225, 99, 227, 38, 57, 230, 8, + 232, 233, 56, 235, 26, 60, 278, 59, 56, 281, + 282, 61, 284, 56, 61, 287, 288, 278, 250, 251, + 281, 282, 56, 284, 56, 56, 287, 288, 300, 300, + 56, 263, 60, 60, 50, 60, 56, 309, 38, 311, + 312, 59, 61, 275, 61, 60, 50, 61, 309, 59, + 311, 312, 59, 58, 286, 61, 50, 329, 290, 50, + 239, 343, -1, 316, 68, 69, 338, 338, 329, 73, + 74, 75, 76, 77, 78, 79, 80, 81, 82, -1, + -1, 353, 353, -1, -1, 44, 45, 46, 47, 48, + 49, -1, 51, 52, 53, 54, -1, -1, -1, -1, + -1, -1, -1, 62, 336, -1, 65, 66, 67, 381, + 381, -1, 71, 72, 346, 347, 348, -1, -1, -1, + -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, + 89, 90, 364, 365, -1, -1, -1, 3, 97, 5, + 6, 7, -1, 9, -1, 11, 378, 13, 14, 15, + -1, 383, -1, -1, 20, 21, 22, -1, 24, 25, + -1, 27, -1, 29, -1, -1, 32, -1, -1, 35, 36, 37, 38, -1, 40, 41, 42, 43, -1, 45, 46, -1, -1, -1, -1, -1, -1, -1, -1, 55, - 32, -1, -1, 35, 36, 37, 38, 63, 64, 41, - 42, 43, -1, 45, 46, 5, 6, 7, -1, -1, - -1, -1, -1, 55, -1, -1, -1, 59, -1, -1, - -1, 63, 64, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 63, 64, -1, + 5, 6, 7, -1, 9, -1, 11, -1, 13, 14, + 15, -1, -1, -1, 19, 20, 21, 22, -1, 24, + 25, 26, 27, -1, -1, -1, 92, 32, -1, -1, + 35, 36, 37, 38, -1, 40, 41, 42, 43, -1, + 45, 46, -1, -1, -1, 5, 6, 7, -1, 9, + 55, 11, -1, 13, 14, 15, -1, -1, 63, 64, + 20, 21, 22, -1, 24, 25, -1, 27, -1, -1, -1, -1, 32, -1, -1, 35, 36, 37, 38, -1, - -1, 41, 42, 43, -1, 45, 46, 5, 6, 7, + 40, 41, 42, 43, -1, 45, 46, 92, -1, -1, -1, -1, -1, -1, -1, 55, -1, -1, -1, -1, - 60, -1, -1, 63, 64, -1, -1, -1, -1, -1, + 60, -1, -1, 63, 64, -1, 5, 6, 7, -1, + 9, -1, 11, -1, 13, 14, 15, -1, -1, -1, + -1, 20, 21, 22, -1, 24, 25, -1, 27, -1, + -1, -1, 92, 32, -1, -1, 35, 36, 37, 38, + -1, 40, 41, 42, 43, -1, 45, 46, -1, -1, + -1, 5, 6, 7, -1, 9, 55, 11, -1, 13, + 14, 15, 61, -1, 63, 64, 20, 21, 22, -1, + 24, 25, -1, 27, -1, -1, -1, -1, 32, -1, + -1, 35, 36, 37, 38, -1, 40, 41, 42, 43, + -1, 45, 46, 92, -1, -1, 5, 6, 7, -1, + 9, 55, 11, -1, 13, 14, 15, 61, -1, 63, + 64, 20, 21, 22, -1, 24, 25, -1, 27, -1, + -1, -1, -1, 32, -1, -1, 35, 36, 37, 38, + -1, 40, 41, 42, 43, -1, 45, 46, 92, -1, + -1, 5, 6, 7, -1, 9, 55, 11, -1, 13, + 14, 15, 61, -1, 63, 64, 20, 21, 22, -1, + 24, 25, -1, 27, -1, 5, 6, 7, 32, -1, + -1, 35, 36, 37, 38, -1, 40, 41, 42, 43, + -1, 45, 46, 92, -1, -1, -1, -1, -1, -1, + -1, 55, 32, -1, -1, 35, 36, 37, 38, 63, + 64, 41, 42, 43, -1, 45, 46, 5, 6, 7, + -1, -1, -1, -1, -1, 55, -1, -1, -1, 59, + -1, -1, -1, 63, 64, -1, -1, -1, 92, -1, -1, -1, -1, -1, 32, -1, -1, 35, 36, 37, 38, -1, -1, 41, 42, 43, -1, 45, 46, 5, - 6, 7, -1, -1, -1, -1, -1, 55, -1, -1, - -1, 59, -1, -1, -1, 63, 64, -1, -1, -1, + 6, 7, 92, -1, -1, -1, -1, 55, -1, -1, + -1, -1, 60, -1, -1, 63, 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32, -1, -1, 35, 36, 37, 38, -1, -1, 41, 42, 43, -1, 45, - 46, 5, 6, 7, -1, -1, -1, -1, -1, 55, + 46, 5, 6, 7, 92, -1, -1, -1, -1, 55, -1, -1, -1, 59, -1, -1, -1, 63, 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32, -1, -1, 35, 36, 37, 38, -1, -1, 41, 42, 43, - -1, 45, 46, 5, 6, 7, -1, -1, -1, -1, + -1, 45, 46, 5, 6, 7, 92, -1, -1, -1, -1, 55, 56, -1, -1, -1, -1, -1, -1, 63, 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32, -1, -1, 35, 36, 37, 38, -1, -1, 41, - 42, 43, -1, 45, 46, 5, 6, 7, -1, -1, - -1, -1, -1, 55, 56, -1, -1, -1, -1, -1, + 42, 43, -1, 45, 46, 5, 6, 7, 92, -1, + -1, -1, -1, 55, -1, -1, -1, 59, -1, -1, -1, 63, 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32, -1, -1, 35, 36, 37, 38, -1, -1, 41, 42, 43, -1, 45, 46, 5, 6, 7, - -1, -1, -1, -1, -1, 55, 56, -1, -1, -1, + 92, -1, -1, -1, -1, 55, 56, -1, -1, -1, -1, -1, -1, 63, 64, -1, -1, -1, -1, -1, -1, -1, -1, -1, 32, -1, -1, 35, 36, 37, - 38, -1, -1, 41, 42, 43, -1, 45, 46, -1, - -1, 44, 45, 46, 47, 48, 49, 55, 51, 52, - 53, 54, -1, 56, 57, 63, 64, -1, -1, 62, - -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, + 38, -1, -1, 41, 42, 43, -1, 45, 46, 5, + 6, 7, 92, -1, -1, -1, -1, 55, 56, -1, + -1, -1, -1, -1, -1, 63, 64, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 32, -1, -1, 35, + 36, 37, 38, -1, -1, 41, 42, 43, -1, 45, + 46, 5, 6, 7, 92, -1, -1, -1, -1, 55, + 56, -1, -1, -1, -1, -1, -1, 63, 64, -1, + -1, -1, -1, -1, -1, 5, 6, 7, 32, -1, + -1, 35, 36, 37, 38, -1, -1, 41, 42, 43, + -1, 45, 46, -1, -1, -1, 92, -1, -1, -1, + -1, 55, 32, -1, -1, 35, 36, 37, 38, 63, + 64, 41, 42, 43, -1, 45, 46, -1, -1, -1, + -1, -1, -1, -1, -1, 55, -1, -1, -1, -1, + -1, -1, -1, 63, 64, -1, -1, -1, 92, -1, + -1, -1, 44, 45, 46, 47, 48, 49, -1, 51, + 52, 53, 54, -1, -1, -1, -1, -1, -1, -1, + 62, -1, 92, 65, 66, 67, -1, -1, -1, 71, + 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, + 92, -1, -1, -1, 96, 97, -1, 99, 44, 45, + 46, 47, 48, 49, -1, 51, 52, 53, 54, -1, + 56, 57, -1, -1, -1, -1, 62, -1, -1, 65, + 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, + 86, 87, 88, 89, 90, -1, 92, -1, -1, -1, + 96, 97, 44, 45, 46, 47, 48, 49, -1, 51, + 52, 53, 54, -1, -1, 57, -1, 59, -1, -1, + 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, + 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, + 92, -1, -1, -1, 96, 97, 44, 45, 46, 47, + 48, 49, -1, 51, 52, 53, 54, -1, -1, -1, + -1, 59, -1, -1, 62, -1, -1, 65, 66, 67, + -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, + 88, 89, 90, -1, 92, -1, -1, -1, 96, 97, + 44, 45, 46, 47, 48, 49, -1, 51, 52, 53, + 54, -1, 56, -1, -1, -1, -1, -1, 62, -1, + -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, - -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, -1, 57, -1, - 59, -1, -1, 62, -1, -1, 65, 66, 67, -1, - -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, - 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, -1, -1, -1, 59, -1, -1, 62, -1, -1, - 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, 56, -1, -1, -1, -1, - -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, - 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, - -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, - 47, 48, 49, -1, 51, 52, 53, 54, -1, 56, - -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, - 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, - 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, - 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, -1, 56, -1, -1, -1, -1, -1, 62, - -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, + 84, 85, 86, 87, 88, 89, 90, -1, 92, -1, + -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, + -1, 51, 52, 53, 54, -1, 56, -1, -1, -1, + -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, + -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, + 90, -1, 92, -1, -1, -1, 96, 97, 44, 45, + 46, 47, 48, 49, -1, 51, 52, 53, 54, -1, + 56, -1, -1, -1, -1, -1, 62, -1, -1, 65, + 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, + 86, 87, 88, 89, 90, -1, 92, -1, -1, -1, + 96, 97, 44, 45, 46, 47, 48, 49, -1, 51, + 52, 53, 54, -1, 56, -1, -1, -1, -1, -1, + 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, + 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, + 92, -1, -1, -1, 96, 97, 44, 45, 46, 47, + 48, 49, -1, 51, 52, 53, 54, -1, -1, -1, + -1, 59, -1, -1, 62, -1, -1, 65, 66, 67, + -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, + 88, 89, 90, -1, 92, -1, -1, -1, 96, 97, + 44, 45, 46, 47, 48, 49, -1, 51, 52, 53, + 54, -1, 56, -1, -1, -1, -1, -1, 62, -1, + -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, - -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, 56, -1, -1, - -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, - -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, - 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, -1, -1, -1, 59, -1, -1, 62, -1, -1, - 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, 56, -1, -1, -1, -1, - -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, - 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, - -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, - 47, 48, 49, -1, 51, 52, 53, 54, -1, 56, - -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, - 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, - 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, - 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, -1, -1, -1, 58, -1, -1, -1, 62, - -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, + 84, 85, 86, 87, 88, 89, 90, -1, 92, -1, + -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, + -1, 51, 52, 53, 54, -1, 56, -1, -1, -1, + -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, + -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, + 90, -1, 92, -1, -1, -1, 96, 97, 44, 45, + 46, 47, 48, 49, -1, 51, 52, 53, 54, -1, + -1, -1, 58, -1, -1, -1, 62, -1, -1, 65, + 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, + 86, 87, 88, 89, 90, -1, 92, -1, -1, -1, + 96, 97, 44, 45, 46, 47, 48, 49, -1, 51, + 52, 53, 54, -1, -1, -1, -1, 59, -1, -1, + 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, + 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, + 92, -1, -1, -1, 96, 97, 44, 45, 46, 47, + 48, 49, -1, 51, 52, 53, 54, -1, -1, -1, + 58, -1, -1, -1, 62, -1, -1, 65, 66, 67, + -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, + 88, 89, 90, -1, 92, -1, -1, -1, 96, 97, + 44, 45, 46, 47, 48, 49, -1, 51, 52, 53, + 54, -1, -1, 57, -1, -1, -1, -1, 62, -1, + -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, - -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, -1, -1, -1, - 59, -1, -1, 62, -1, -1, 65, 66, 67, -1, - -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, - 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, -1, -1, 58, -1, -1, -1, 62, -1, -1, - 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, 56, -1, -1, -1, -1, - -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, - 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, - -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, - 47, 48, 49, -1, 51, 52, 53, 54, -1, 56, - -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, - 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, - 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, - 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, -1, -1, -1, -1, 59, -1, -1, 62, - -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, + 84, 85, 86, 87, 88, 89, 90, -1, 92, -1, + -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, + -1, 51, 52, 53, 54, -1, 56, -1, -1, -1, + -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, + -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, + 90, -1, 92, -1, -1, -1, 96, 97, 44, 45, + 46, 47, 48, 49, -1, 51, 52, 53, 54, -1, + 56, -1, -1, -1, -1, -1, 62, -1, -1, 65, + 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, + 86, 87, 88, 89, 90, -1, 92, -1, -1, -1, + 96, 97, 44, 45, 46, 47, 48, 49, -1, 51, + 52, 53, 54, -1, -1, -1, -1, 59, -1, -1, + 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, + 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, + 92, -1, -1, -1, 96, 97, 44, 45, 46, 47, + 48, 49, -1, 51, 52, 53, 54, -1, 56, -1, + -1, -1, -1, -1, 62, -1, -1, 65, 66, 67, + -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, + 88, 89, 90, -1, 92, -1, -1, -1, 96, 97, + 44, 45, 46, 47, 48, 49, -1, 51, 52, 53, + 54, -1, 56, -1, -1, -1, -1, -1, 62, -1, + -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, - -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, 56, -1, -1, - -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, - -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, - 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, 56, -1, -1, -1, -1, -1, 62, -1, -1, - 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, -1, -1, -1, 59, -1, - -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, - 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, - -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, - 47, 48, 49, -1, 51, 52, 53, 54, -1, 56, - -1, -1, -1, -1, -1, 62, -1, -1, 65, 66, - 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, - 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, - 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, -1, 56, -1, -1, -1, -1, -1, 62, - -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, + 84, 85, 86, 87, 88, 89, 90, -1, 92, -1, + -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, + -1, 51, 52, 53, 54, -1, -1, -1, -1, 59, + -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, + -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, + 90, -1, 92, -1, -1, -1, 96, 97, 44, 45, + 46, 47, 48, 49, -1, 51, 52, 53, 54, -1, + 56, -1, -1, -1, -1, -1, 62, -1, -1, 65, + 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, + 86, 87, 88, 89, 90, -1, 92, -1, -1, -1, + 96, 97, 44, 45, 46, 47, 48, 49, -1, 51, + 52, 53, 54, -1, 56, -1, -1, -1, -1, -1, + 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, + 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, + 92, -1, -1, -1, 96, 97, 44, 45, 46, 47, + 48, 49, -1, 51, 52, 53, 54, -1, 56, -1, + -1, -1, -1, -1, 62, -1, -1, 65, 66, 67, + -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, + 88, 89, 90, -1, 92, -1, -1, -1, 96, 97, + 44, 45, 46, 47, 48, 49, -1, 51, 52, 53, + 54, -1, -1, -1, -1, 59, -1, -1, 62, -1, + -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, - -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, 56, -1, -1, - -1, -1, -1, 62, -1, -1, 65, 66, 67, -1, - -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, - 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, -1, -1, -1, 59, -1, -1, 62, -1, -1, - 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, -1, -1, -1, 59, -1, - -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, - 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 84, 85, 86, 87, 88, 89, 90, - -1, -1, -1, -1, -1, 96, 97, 44, 45, 46, - 47, 48, 49, -1, 51, 52, 53, 54, -1, -1, - -1, -1, 59, -1, -1, 62, -1, -1, 65, 66, - 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 84, 85, 86, - 87, 88, 89, 90, -1, -1, -1, -1, -1, 96, - 97, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, -1, -1, -1, -1, 59, -1, -1, 62, - -1, -1, 65, 66, 67, -1, -1, -1, 71, 72, + 84, 85, 86, 87, 88, 89, 90, -1, 92, -1, + -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, + -1, 51, 52, 53, 54, -1, -1, -1, -1, 59, + -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, + -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, + 90, -1, 92, -1, -1, -1, 96, 97, 44, 45, + 46, 47, 48, 49, -1, 51, 52, 53, 54, -1, + -1, -1, -1, 59, -1, -1, 62, -1, -1, 65, + 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 84, 85, + 86, 87, 88, 89, 90, -1, 92, -1, -1, -1, + 96, 97, 44, 45, 46, 47, 48, 49, -1, 51, + 52, 53, 54, -1, -1, -1, -1, 59, -1, -1, + 62, -1, -1, 65, 66, 67, -1, -1, -1, 71, + 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 84, 85, 86, 87, 88, 89, 90, -1, + 92, -1, -1, -1, 96, 97, 44, 45, 46, 47, + 48, 49, -1, 51, 52, 53, 54, -1, -1, -1, + -1, 59, -1, -1, 62, -1, -1, 65, 66, 67, + -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 84, 85, 86, 87, + 88, 89, 90, -1, 92, -1, -1, -1, 96, 97, + 44, 45, 46, 47, 48, 49, -1, 51, 52, 53, + 54, -1, -1, -1, -1, -1, -1, -1, 62, -1, + -1, 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 84, 85, 86, 87, 88, 89, 90, -1, -1, - -1, -1, -1, 96, 97, 44, 45, 46, 47, 48, - 49, -1, 51, 52, 53, 54, -1, -1, -1, -1, - 59, -1, -1, 62, -1, -1, 65, 66, 67, -1, - -1, -1, 71, 72, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 84, 85, 86, 87, 88, - 89, 90, -1, -1, -1, -1, -1, 96, 97, 44, - 45, 46, 47, 48, 49, -1, 51, 52, 53, 54, - -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, - 65, 66, 67, -1, -1, -1, 71, 72, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 84, - 85, 86, 87, 88, 89, 90, -1, -1, -1, -1, - -1, 96, 97, 44, 45, 46, 47, 48, 49, -1, - 51, 52, 53, 54, -1, -1, -1, -1, -1, -1, - -1, 62, -1, -1, 65, 66, 67, -1, -1, -1, - 71, 72, 44, 45, 46, 47, 48, 49, -1, 51, - 52, 53, 54, 84, 85, 86, 87, 88, 89, 90, - 62, -1, -1, 65, 66, 67, 97, -1, -1, 71, - 72, 44, 45, 46, 47, 48, 49, -1, 51, 52, - 53, 54, 84, 85, 86, 87, 88, -1, 90, 62, - -1, -1, 65, 66, 67, 97, -1, -1, 71, 72, - 44, 45, 46, 47, 48, 49, -1, 51, -1, 53, - 54, 84, 85, 86, 87, -1, -1, 90, 62, -1, - -1, 65, 66, 67, 97, -1, -1, 71, 72, 44, - 45, 46, 47, 48, 49, -1, 51, -1, 53, 54, - 84, 85, 86, 87, -1, -1, 90, -1, -1, -1, - 65, 66, 67, 97, -1, -1, 71, 72, 44, 45, - 46, 47, 48, 49, -1, 51, -1, -1, 54, 84, - 85, 86, 87, -1, -1, 90, -1, -1, -1, 65, - 66, 67, 97, -1, -1, 71, 72, 44, 45, 46, - 47, 48, 49, -1, 51, -1, -1, 54, 84, 85, - 86, 87, -1, -1, 90, -1, -1, -1, 65, 66, + 84, 85, 86, 87, 88, 89, 90, -1, 92, -1, + -1, -1, 96, 97, 44, 45, 46, 47, 48, 49, + -1, 51, 52, 53, 54, -1, -1, -1, -1, -1, + -1, -1, 62, -1, -1, 65, 66, 67, -1, -1, + -1, 71, 72, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 84, 85, 86, 87, 88, 89, + 90, -1, -1, -1, -1, -1, 96, 97, 44, 45, + 46, 47, 48, 49, -1, 51, 52, 53, 54, -1, + -1, -1, -1, -1, -1, -1, 62, -1, -1, 65, + 66, 67, -1, -1, -1, 71, 72, 44, 45, 46, + 47, 48, 49, -1, 51, 52, 53, 54, 84, 85, + 86, 87, 88, -1, 90, 62, -1, -1, 65, 66, 67, 97, -1, -1, 71, 72, 44, 45, 46, 47, - -1, -1, -1, 51, -1, -1, 54, 50, -1, 86, - 87, -1, -1, 90, -1, -1, -1, 65, 66, 67, - 97, -1, -1, 71, 72, 68, 69, 50, -1, -1, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - -1, -1, 90, -1, -1, 68, 69, -1, -1, 97, - 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 44, 45, 46, 47, -1, -1, -1, 51, -1, -1, + 48, 49, -1, 51, -1, 53, 54, 84, 85, 86, + 87, -1, -1, 90, 62, -1, -1, 65, 66, 67, + 97, -1, -1, 71, 72, 44, 45, 46, 47, 48, + 49, -1, 51, -1, -1, 54, 84, 85, 86, 87, + -1, -1, 90, -1, -1, -1, 65, 66, 67, 97, + -1, -1, 71, 72, 44, 45, 46, 47, 48, 49, + -1, 51, -1, -1, 54, 84, 85, 86, 87, -1, + -1, 90, -1, -1, -1, 65, 66, 67, 97, -1, + -1, 71, 72, 44, 45, 46, 47, -1, -1, -1, + 51, -1, -1, 54, 50, -1, 86, 87, -1, -1, + 90, -1, -1, -1, 65, 66, 67, 97, -1, -1, + 71, 72, 68, 69, -1, -1, -1, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, -1, -1, 90, + 44, 45, 46, 47, -1, -1, 97, 51, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 66, 67, -1, -1, -1, 71, 72 }; @@ -1466,41 +1508,42 @@ static const yytype_uint8 yystos[] = 0, 101, 102, 0, 3, 5, 6, 7, 9, 11, 13, 14, 15, 20, 21, 22, 24, 25, 27, 29, 32, 35, 36, 37, 38, 40, 41, 42, 43, 45, - 46, 55, 63, 64, 103, 104, 107, 108, 111, 112, - 119, 122, 123, 124, 125, 126, 127, 128, 129, 132, - 133, 134, 38, 38, 55, 130, 130, 59, 59, 55, - 7, 36, 59, 127, 132, 55, 60, 107, 118, 55, - 55, 55, 130, 55, 55, 38, 55, 50, 50, 68, - 69, 73, 74, 75, 76, 77, 78, 79, 80, 81, - 82, 92, 131, 55, 91, 127, 127, 127, 127, 127, - 59, 44, 45, 46, 47, 48, 49, 51, 52, 53, - 54, 62, 65, 66, 67, 71, 72, 84, 85, 86, - 87, 88, 89, 90, 96, 97, 50, 131, 55, 91, - 127, 55, 55, 127, 59, 127, 106, 14, 59, 127, - 37, 37, 55, 127, 127, 60, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 140, 127, 135, 136, 38, 56, 127, 127, 127, 127, - 127, 127, 38, 127, 127, 127, 127, 127, 130, 130, - 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 60, 127, 37, 109, 110, 38, 56, 92, 114, - 127, 114, 56, 56, 61, 107, 55, 59, 127, 59, - 23, 23, 127, 56, 56, 105, 108, 56, 57, 57, - 59, 57, 99, 56, 57, 55, 55, 92, 58, 136, - 56, 57, 55, 114, 58, 113, 113, 118, 118, 127, - 56, 127, 59, 59, 127, 127, 127, 113, 60, 60, - 61, 108, 41, 127, 127, 50, 131, 127, 135, 135, - 140, 127, 61, 60, 37, 109, 99, 38, 57, 115, - 115, 8, 56, 118, 56, 56, 127, 56, 127, 59, - 56, 56, 56, 26, 120, 120, 59, 56, 59, 127, - 56, 56, 99, 106, 56, 113, 136, 56, 56, 118, - 118, 118, 56, 118, 56, 56, 127, 118, 118, 60, - 121, 127, 61, 61, 61, 60, 115, 60, 60, 118, - 118, 118, 56, 24, 38, 39, 137, 138, 139, 28, - 58, 106, 56, 112, 116, 117, 138, 116, 118, 50, - 50, 92, 38, 61, 139, 127, 106, 61, 60, 59, - 61, 112, 117, 61, 127, 127, 140, 50, 92, 59, - 19, 120, 116, 59, 59, 59, 99, 127, 140, 58, - 61, 50, 59, 99, 106, 127, 50, 59, 127, 59 + 46, 55, 63, 64, 92, 103, 104, 107, 108, 111, + 112, 119, 122, 123, 124, 125, 126, 127, 128, 129, + 132, 133, 134, 38, 38, 55, 130, 130, 59, 59, + 55, 7, 36, 59, 127, 132, 55, 60, 107, 118, + 55, 55, 55, 130, 55, 55, 38, 55, 50, 50, + 68, 69, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 92, 131, 55, 91, 127, 127, 127, 127, + 127, 127, 135, 136, 59, 44, 45, 46, 47, 48, + 49, 51, 52, 53, 54, 62, 65, 66, 67, 71, + 72, 84, 85, 86, 87, 88, 89, 90, 92, 96, + 97, 50, 131, 55, 91, 127, 55, 55, 127, 59, + 127, 106, 14, 59, 127, 37, 37, 55, 127, 127, + 60, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 140, 135, 38, 56, 99, + 57, 127, 127, 127, 127, 127, 127, 38, 127, 127, + 127, 127, 127, 130, 130, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 60, 127, 37, + 109, 110, 38, 56, 92, 114, 127, 114, 56, 56, + 61, 107, 55, 59, 127, 59, 23, 23, 127, 56, + 56, 105, 108, 56, 57, 57, 59, 57, 99, 56, + 55, 127, 55, 92, 99, 58, 136, 56, 57, 55, + 114, 127, 58, 113, 113, 118, 118, 127, 56, 127, + 59, 59, 127, 127, 127, 113, 60, 60, 61, 108, + 41, 127, 127, 50, 131, 135, 135, 140, 127, 61, + 60, 37, 109, 99, 38, 57, 115, 115, 8, 56, + 118, 56, 56, 127, 56, 127, 59, 56, 56, 56, + 26, 120, 120, 59, 56, 59, 127, 56, 56, 99, + 106, 56, 113, 136, 56, 56, 118, 118, 118, 56, + 118, 56, 56, 127, 118, 118, 60, 121, 127, 61, + 61, 61, 60, 115, 60, 60, 118, 118, 118, 56, + 24, 38, 39, 137, 138, 139, 28, 58, 106, 56, + 112, 116, 117, 138, 116, 118, 50, 50, 92, 38, + 61, 139, 127, 106, 61, 60, 59, 61, 112, 117, + 61, 127, 127, 140, 50, 92, 59, 19, 120, 116, + 59, 59, 59, 99, 127, 140, 58, 61, 50, 59, + 99, 106, 127, 50, 59, 127, 59 }; /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ @@ -1517,12 +1560,12 @@ static const yytype_uint8 yyr1[] = 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 128, 128, 129, 129, 130, - 130, 131, 131, 131, 131, 131, 131, 131, 131, 131, - 131, 131, 131, 132, 132, 132, 132, 132, 132, 132, - 132, 132, 132, 133, 133, 133, 134, 134, 135, 135, - 136, 136, 137, 137, 138, 138, 139, 139, 139, 139, - 139, 140, 140 + 127, 127, 127, 127, 127, 127, 127, 128, 128, 129, + 129, 130, 130, 131, 131, 131, 131, 131, 131, 131, + 131, 131, 131, 131, 131, 132, 132, 132, 132, 132, + 132, 132, 132, 132, 132, 133, 133, 133, 134, 134, + 135, 135, 136, 136, 137, 137, 138, 138, 139, 139, + 139, 139, 139, 140, 140 }; /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ @@ -1539,12 +1582,12 @@ static const yytype_int8 yyr2[] = 3, 3, 3, 3, 3, 3, 2, 2, 1, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 4, 3, 6, 3, 3, 1, - 3, 1, 1, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 1, 1, 1, 3, 6, 2, 5, - 2, 3, 5, 4, 6, 6, 4, 6, 0, 1, - 1, 3, 0, 1, 1, 2, 4, 5, 4, 7, - 8, 1, 3 + 1, 1, 1, 1, 4, 4, 3, 3, 6, 3, + 3, 1, 3, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 1, 1, 3, 6, + 2, 5, 2, 3, 5, 4, 6, 6, 4, 6, + 0, 1, 1, 3, 0, 1, 1, 2, 4, 5, + 4, 7, 8, 1, 3 }; @@ -2194,935 +2237,956 @@ yyparse (void) case 2: /* start: decl_list */ #line 167 "CMDgram.y" { } -#line 2198 "CMDgram.c" +#line 2241 "CMDgram.c" break; case 3: /* decl_list: %empty */ #line 172 "CMDgram.y" { (yyval.stmt) = nil; } -#line 2204 "CMDgram.c" +#line 2247 "CMDgram.c" break; case 4: /* decl_list: decl_list decl */ #line 174 "CMDgram.y" { if(!Script::gStatementList) { Script::gStatementList = (yyvsp[0].stmt); } else { Script::gStatementList->append((yyvsp[0].stmt)); } } -#line 2210 "CMDgram.c" +#line 2253 "CMDgram.c" break; case 5: /* decl: stmt */ #line 179 "CMDgram.y" { (yyval.stmt) = (yyvsp[0].stmt); } -#line 2216 "CMDgram.c" +#line 2259 "CMDgram.c" break; case 6: /* decl: fn_decl_stmt */ #line 181 "CMDgram.y" { (yyval.stmt) = (yyvsp[0].stmt); } -#line 2222 "CMDgram.c" +#line 2265 "CMDgram.c" break; case 7: /* decl: package_decl */ #line 183 "CMDgram.y" { (yyval.stmt) = (yyvsp[0].stmt); } -#line 2228 "CMDgram.c" +#line 2271 "CMDgram.c" break; case 8: /* package_decl: rwPACKAGE IDENT '{' fn_decl_list '}' ';' */ #line 188 "CMDgram.y" { (yyval.stmt) = (yyvsp[-2].stmt); for(StmtNode *walk = ((yyvsp[-2].stmt));walk;walk = walk->getNext() ) walk->setPackage((yyvsp[-4].s).value); } -#line 2234 "CMDgram.c" +#line 2277 "CMDgram.c" break; case 9: /* fn_decl_list: fn_decl_stmt */ #line 193 "CMDgram.y" { (yyval.stmt) = (yyvsp[0].stmt); } -#line 2240 "CMDgram.c" +#line 2283 "CMDgram.c" break; case 10: /* fn_decl_list: fn_decl_list fn_decl_stmt */ #line 195 "CMDgram.y" { (yyval.stmt) = (yyvsp[-1].stmt); ((yyvsp[-1].stmt))->append((yyvsp[0].stmt)); } -#line 2246 "CMDgram.c" +#line 2289 "CMDgram.c" break; case 11: /* statement_list: %empty */ #line 200 "CMDgram.y" { (yyval.stmt) = nil; } -#line 2252 "CMDgram.c" +#line 2295 "CMDgram.c" break; case 12: /* statement_list: statement_list stmt */ #line 202 "CMDgram.y" { if(!(yyvsp[-1].stmt)) { (yyval.stmt) = (yyvsp[0].stmt); } else { ((yyvsp[-1].stmt))->append((yyvsp[0].stmt)); (yyval.stmt) = (yyvsp[-1].stmt); } } -#line 2258 "CMDgram.c" +#line 2301 "CMDgram.c" break; case 19: /* stmt: rwBREAK ';' */ #line 213 "CMDgram.y" { (yyval.stmt) = BreakStmtNode::alloc( (yyvsp[-1].i).lineNumber ); } -#line 2264 "CMDgram.c" +#line 2307 "CMDgram.c" break; case 20: /* stmt: rwCONTINUE ';' */ #line 215 "CMDgram.y" { (yyval.stmt) = ContinueStmtNode::alloc( (yyvsp[-1].i).lineNumber ); } -#line 2270 "CMDgram.c" +#line 2313 "CMDgram.c" break; case 21: /* stmt: rwRETURN ';' */ #line 217 "CMDgram.y" { (yyval.stmt) = ReturnStmtNode::alloc( (yyvsp[-1].i).lineNumber, NULL ); } -#line 2276 "CMDgram.c" +#line 2319 "CMDgram.c" break; case 22: /* stmt: rwRETURN expr ';' */ #line 219 "CMDgram.y" { (yyval.stmt) = ReturnStmtNode::alloc( (yyvsp[-2].i).lineNumber, (yyvsp[-1].expr) ); } -#line 2282 "CMDgram.c" +#line 2325 "CMDgram.c" break; case 23: /* stmt: expression_stmt ';' */ #line 221 "CMDgram.y" { (yyval.stmt) = (yyvsp[-1].stmt); } -#line 2288 "CMDgram.c" +#line 2331 "CMDgram.c" break; case 24: /* stmt: TTAG '=' expr ';' */ #line 223 "CMDgram.y" { (yyval.stmt) = TTagSetStmtNode::alloc( (yyvsp[-3].s).lineNumber, (yyvsp[-3].s).value, (yyvsp[-1].expr), NULL ); } -#line 2294 "CMDgram.c" +#line 2337 "CMDgram.c" break; case 25: /* stmt: TTAG '=' expr ',' expr ';' */ #line 225 "CMDgram.y" { (yyval.stmt) = TTagSetStmtNode::alloc( (yyvsp[-5].s).lineNumber, (yyvsp[-5].s).value, (yyvsp[-3].expr), (yyvsp[-1].expr) ); } -#line 2300 "CMDgram.c" +#line 2343 "CMDgram.c" break; case 26: /* stmt: DOCBLOCK */ #line 227 "CMDgram.y" { (yyval.stmt) = StrConstNode::alloc( (yyvsp[0].str).lineNumber, (yyvsp[0].str).value, false, true ); } -#line 2306 "CMDgram.c" +#line 2349 "CMDgram.c" break; case 27: /* fn_decl_stmt: rwDEFINE IDENT '(' var_list_decl ')' '{' statement_list '}' */ #line 232 "CMDgram.y" { (yyval.stmt) = FunctionDeclStmtNode::alloc( (yyvsp[-7].i).lineNumber, (yyvsp[-6].s).value, NULL, (yyvsp[-4].var), (yyvsp[-1].stmt) ); } -#line 2312 "CMDgram.c" +#line 2355 "CMDgram.c" break; case 28: /* fn_decl_stmt: rwDEFINE IDENT opCOLONCOLON IDENT '(' var_list_decl ')' '{' statement_list '}' */ #line 234 "CMDgram.y" { (yyval.stmt) = FunctionDeclStmtNode::alloc( (yyvsp[-9].i).lineNumber, (yyvsp[-6].s).value, (yyvsp[-8].s).value, (yyvsp[-4].var), (yyvsp[-1].stmt) ); } -#line 2318 "CMDgram.c" +#line 2361 "CMDgram.c" break; case 29: /* var_list_decl: %empty */ #line 239 "CMDgram.y" { (yyval.var) = NULL; } -#line 2324 "CMDgram.c" +#line 2367 "CMDgram.c" break; case 30: /* var_list_decl: var_list */ #line 241 "CMDgram.y" { (yyval.var) = (yyvsp[0].var); } -#line 2330 "CMDgram.c" +#line 2373 "CMDgram.c" break; case 31: /* var_list: VAR */ #line 246 "CMDgram.y" { (yyval.var) = VarNode::alloc( (yyvsp[0].s).lineNumber, (yyvsp[0].s).value, NULL ); } -#line 2336 "CMDgram.c" +#line 2379 "CMDgram.c" break; case 32: /* var_list: var_list ',' VAR */ #line 248 "CMDgram.y" { (yyval.var) = (yyvsp[-2].var); ((StmtNode*)((yyvsp[-2].var)))->append((StmtNode*)VarNode::alloc( (yyvsp[0].s).lineNumber, (yyvsp[0].s).value, NULL ) ); } -#line 2342 "CMDgram.c" +#line 2385 "CMDgram.c" break; case 33: /* datablock_decl: rwDATABLOCK class_name_expr '(' expr parent_block ')' '{' slot_assign_list_opt '}' ';' */ #line 253 "CMDgram.y" { (yyval.stmt) = ObjectDeclNode::alloc( (yyvsp[-9].i).lineNumber, (yyvsp[-8].expr), (yyvsp[-6].expr), NULL, (yyvsp[-5].s).value, (yyvsp[-2].slist), NULL, true, false, false); } -#line 2348 "CMDgram.c" +#line 2391 "CMDgram.c" break; case 34: /* object_decl: rwDECLARE class_name_expr '(' object_name parent_block object_args ')' '{' object_declare_block '}' */ #line 258 "CMDgram.y" { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[-9].i).lineNumber, (yyvsp[-8].expr), (yyvsp[-6].expr), (yyvsp[-4].expr), (yyvsp[-5].s).value, (yyvsp[-1].odcl).slots, (yyvsp[-1].odcl).decls, false, false, false); } -#line 2354 "CMDgram.c" +#line 2397 "CMDgram.c" break; case 35: /* object_decl: rwDECLARE class_name_expr '(' object_name parent_block object_args ')' */ #line 260 "CMDgram.y" { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[-6].i).lineNumber, (yyvsp[-5].expr), (yyvsp[-3].expr), (yyvsp[-1].expr), (yyvsp[-2].s).value, NULL, NULL, false, false, false); } -#line 2360 "CMDgram.c" +#line 2403 "CMDgram.c" break; case 36: /* object_decl: rwDECLARE class_name_expr '(' '[' object_name ']' parent_block object_args ')' '{' object_declare_block '}' */ #line 262 "CMDgram.y" { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[-11].i).lineNumber, (yyvsp[-10].expr), (yyvsp[-7].expr), (yyvsp[-4].expr), (yyvsp[-5].s).value, (yyvsp[-1].odcl).slots, (yyvsp[-1].odcl).decls, false, true, false); } -#line 2366 "CMDgram.c" +#line 2409 "CMDgram.c" break; case 37: /* object_decl: rwDECLARE class_name_expr '(' '[' object_name ']' parent_block object_args ')' */ #line 264 "CMDgram.y" { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[-8].i).lineNumber, (yyvsp[-7].expr), (yyvsp[-4].expr), (yyvsp[-1].expr), (yyvsp[-2].s).value, NULL, NULL, false, true, false); } -#line 2372 "CMDgram.c" +#line 2415 "CMDgram.c" break; case 38: /* object_decl: rwDECLARESINGLETON class_name_expr '(' object_name parent_block object_args ')' '{' object_declare_block '}' */ #line 266 "CMDgram.y" { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[-9].i).lineNumber, (yyvsp[-8].expr), (yyvsp[-6].expr), (yyvsp[-4].expr), (yyvsp[-5].s).value, (yyvsp[-1].odcl).slots, (yyvsp[-1].odcl).decls, false, false, true); } -#line 2378 "CMDgram.c" +#line 2421 "CMDgram.c" break; case 39: /* object_decl: rwDECLARESINGLETON class_name_expr '(' object_name parent_block object_args ')' */ #line 268 "CMDgram.y" { (yyval.od) = ObjectDeclNode::alloc( (yyvsp[-6].i).lineNumber, (yyvsp[-5].expr), (yyvsp[-3].expr), (yyvsp[-1].expr), (yyvsp[-2].s).value, NULL, NULL, false, false, true); } -#line 2384 "CMDgram.c" +#line 2427 "CMDgram.c" break; case 40: /* parent_block: %empty */ #line 273 "CMDgram.y" { (yyval.s).value = NULL; } -#line 2390 "CMDgram.c" +#line 2433 "CMDgram.c" break; case 41: /* parent_block: ':' IDENT */ #line 275 "CMDgram.y" { (yyval.s) = (yyvsp[0].s); } -#line 2396 "CMDgram.c" +#line 2439 "CMDgram.c" break; case 42: /* object_name: %empty */ #line 280 "CMDgram.y" { (yyval.expr) = StrConstNode::alloc( CodeBlock::smCurrentParser->getCurrentLine(), "", false); } -#line 2402 "CMDgram.c" +#line 2445 "CMDgram.c" break; case 43: /* object_name: expr */ #line 282 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 2408 "CMDgram.c" +#line 2451 "CMDgram.c" break; case 44: /* object_args: %empty */ #line 287 "CMDgram.y" { (yyval.expr) = NULL; } -#line 2414 "CMDgram.c" +#line 2457 "CMDgram.c" break; case 45: /* object_args: ',' expr_list */ #line 289 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 2420 "CMDgram.c" +#line 2463 "CMDgram.c" break; case 46: /* object_declare_block: %empty */ #line 294 "CMDgram.y" { (yyval.odcl).slots = NULL; (yyval.odcl).decls = NULL; } -#line 2426 "CMDgram.c" +#line 2469 "CMDgram.c" break; case 47: /* object_declare_block: slot_assign_list */ #line 296 "CMDgram.y" { (yyval.odcl).slots = (yyvsp[0].slist); (yyval.odcl).decls = NULL; } -#line 2432 "CMDgram.c" +#line 2475 "CMDgram.c" break; case 48: /* object_declare_block: object_decl_list */ #line 298 "CMDgram.y" { (yyval.odcl).slots = NULL; (yyval.odcl).decls = (yyvsp[0].od); } -#line 2438 "CMDgram.c" +#line 2481 "CMDgram.c" break; case 49: /* object_declare_block: slot_assign_list object_decl_list */ #line 300 "CMDgram.y" { (yyval.odcl).slots = (yyvsp[-1].slist); (yyval.odcl).decls = (yyvsp[0].od); } -#line 2444 "CMDgram.c" +#line 2487 "CMDgram.c" break; case 50: /* object_decl_list: object_decl ';' */ #line 305 "CMDgram.y" { (yyval.od) = (yyvsp[-1].od); } -#line 2450 "CMDgram.c" +#line 2493 "CMDgram.c" break; case 51: /* object_decl_list: object_decl_list object_decl ';' */ #line 307 "CMDgram.y" { (yyvsp[-2].od)->append((yyvsp[-1].od)); (yyval.od) = (yyvsp[-2].od); } -#line 2456 "CMDgram.c" +#line 2499 "CMDgram.c" break; case 52: /* stmt_block: '{' statement_list '}' */ #line 312 "CMDgram.y" { (yyval.stmt) = (yyvsp[-1].stmt); } -#line 2462 "CMDgram.c" +#line 2505 "CMDgram.c" break; case 53: /* stmt_block: stmt */ #line 314 "CMDgram.y" { (yyval.stmt) = (yyvsp[0].stmt); } -#line 2468 "CMDgram.c" +#line 2511 "CMDgram.c" break; case 54: /* switch_stmt: rwSWITCH '(' expr ')' '{' case_block '}' */ #line 319 "CMDgram.y" { (yyval.stmt) = (yyvsp[-1].ifnode); (yyvsp[-1].ifnode)->propagateSwitchExpr((yyvsp[-4].expr), false); } -#line 2474 "CMDgram.c" +#line 2517 "CMDgram.c" break; case 55: /* switch_stmt: rwSWITCHSTR '(' expr ')' '{' case_block '}' */ #line 321 "CMDgram.y" { (yyval.stmt) = (yyvsp[-1].ifnode); (yyvsp[-1].ifnode)->propagateSwitchExpr((yyvsp[-4].expr), true); } -#line 2480 "CMDgram.c" +#line 2523 "CMDgram.c" break; case 56: /* case_block: rwCASE case_expr ':' statement_list */ #line 326 "CMDgram.y" { (yyval.ifnode) = IfStmtNode::alloc( (yyvsp[-3].i).lineNumber, (yyvsp[-2].expr), (yyvsp[0].stmt), NULL, false); } -#line 2486 "CMDgram.c" +#line 2529 "CMDgram.c" break; case 57: /* case_block: rwCASE case_expr ':' statement_list rwDEFAULT ':' statement_list */ #line 328 "CMDgram.y" { (yyval.ifnode) = IfStmtNode::alloc( (yyvsp[-6].i).lineNumber, (yyvsp[-5].expr), (yyvsp[-3].stmt), (yyvsp[0].stmt), false); } -#line 2492 "CMDgram.c" +#line 2535 "CMDgram.c" break; case 58: /* case_block: rwCASE case_expr ':' statement_list case_block */ #line 330 "CMDgram.y" { (yyval.ifnode) = IfStmtNode::alloc( (yyvsp[-4].i).lineNumber, (yyvsp[-3].expr), (yyvsp[-1].stmt), (yyvsp[0].ifnode), true); } -#line 2498 "CMDgram.c" +#line 2541 "CMDgram.c" break; case 59: /* case_expr: expr */ #line 335 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr);} -#line 2504 "CMDgram.c" +#line 2547 "CMDgram.c" break; case 60: /* case_expr: case_expr rwCASEOR expr */ #line 337 "CMDgram.y" { ((yyvsp[-2].expr))->append((yyvsp[0].expr)); (yyval.expr)=(yyvsp[-2].expr); } -#line 2510 "CMDgram.c" +#line 2553 "CMDgram.c" break; case 61: /* if_stmt: rwIF '(' expr ')' stmt_block */ #line 342 "CMDgram.y" { (yyval.stmt) = IfStmtNode::alloc((yyvsp[-4].i).lineNumber, (yyvsp[-2].expr), (yyvsp[0].stmt), NULL, false); } -#line 2516 "CMDgram.c" +#line 2559 "CMDgram.c" break; case 62: /* if_stmt: rwIF '(' expr ')' stmt_block rwELSE stmt_block */ #line 344 "CMDgram.y" { (yyval.stmt) = IfStmtNode::alloc((yyvsp[-6].i).lineNumber, (yyvsp[-4].expr), (yyvsp[-2].stmt), (yyvsp[0].stmt), false); } -#line 2522 "CMDgram.c" +#line 2565 "CMDgram.c" break; case 63: /* while_stmt: rwWHILE '(' expr ')' stmt_block */ #line 349 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-4].i).lineNumber, nil, (yyvsp[-2].expr), nil, (yyvsp[0].stmt), false); } -#line 2528 "CMDgram.c" +#line 2571 "CMDgram.c" break; case 64: /* while_stmt: rwDO stmt_block rwWHILE '(' expr ')' */ #line 351 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-3].i).lineNumber, nil, (yyvsp[-1].expr), nil, (yyvsp[-4].stmt), true); } -#line 2534 "CMDgram.c" +#line 2577 "CMDgram.c" break; case 65: /* for_stmt: rwFOR '(' expr ';' expr ';' expr ')' stmt_block */ #line 356 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-8].i).lineNumber, (yyvsp[-6].expr), (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].stmt), false); } -#line 2540 "CMDgram.c" +#line 2583 "CMDgram.c" break; case 66: /* for_stmt: rwFOR '(' expr ';' expr ';' ')' stmt_block */ #line 358 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-7].i).lineNumber, (yyvsp[-5].expr), (yyvsp[-3].expr), NULL, (yyvsp[0].stmt), false); } -#line 2546 "CMDgram.c" +#line 2589 "CMDgram.c" break; case 67: /* for_stmt: rwFOR '(' expr ';' ';' expr ')' stmt_block */ #line 360 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-7].i).lineNumber, (yyvsp[-5].expr), NULL, (yyvsp[-2].expr), (yyvsp[0].stmt), false); } -#line 2552 "CMDgram.c" +#line 2595 "CMDgram.c" break; case 68: /* for_stmt: rwFOR '(' expr ';' ';' ')' stmt_block */ #line 362 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-6].i).lineNumber, (yyvsp[-4].expr), NULL, NULL, (yyvsp[0].stmt), false); } -#line 2558 "CMDgram.c" +#line 2601 "CMDgram.c" break; case 69: /* for_stmt: rwFOR '(' ';' expr ';' expr ')' stmt_block */ #line 364 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-7].i).lineNumber, NULL, (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].stmt), false); } -#line 2564 "CMDgram.c" +#line 2607 "CMDgram.c" break; case 70: /* for_stmt: rwFOR '(' ';' expr ';' ')' stmt_block */ #line 366 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-6].i).lineNumber, NULL, (yyvsp[-3].expr), NULL, (yyvsp[0].stmt), false); } -#line 2570 "CMDgram.c" +#line 2613 "CMDgram.c" break; case 71: /* for_stmt: rwFOR '(' ';' ';' expr ')' stmt_block */ #line 368 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-6].i).lineNumber, NULL, NULL, (yyvsp[-2].expr), (yyvsp[0].stmt), false); } -#line 2576 "CMDgram.c" +#line 2619 "CMDgram.c" break; case 72: /* for_stmt: rwFOR '(' ';' ';' ')' stmt_block */ #line 370 "CMDgram.y" { (yyval.stmt) = LoopStmtNode::alloc((yyvsp[-5].i).lineNumber, NULL, NULL, NULL, (yyvsp[0].stmt), false); } -#line 2582 "CMDgram.c" +#line 2625 "CMDgram.c" break; case 73: /* foreach_stmt: rwFOREACH '(' VAR rwIN expr ')' stmt_block */ #line 375 "CMDgram.y" { (yyval.stmt) = IterStmtNode::alloc( (yyvsp[-6].i).lineNumber, (yyvsp[-4].s).value, (yyvsp[-2].expr), (yyvsp[0].stmt), false ); } -#line 2588 "CMDgram.c" +#line 2631 "CMDgram.c" break; case 74: /* foreach_stmt: rwFOREACHSTR '(' VAR rwIN expr ')' stmt_block */ #line 377 "CMDgram.y" { (yyval.stmt) = IterStmtNode::alloc( (yyvsp[-6].i).lineNumber, (yyvsp[-4].s).value, (yyvsp[-2].expr), (yyvsp[0].stmt), true ); } -#line 2594 "CMDgram.c" +#line 2637 "CMDgram.c" break; case 75: /* expression_stmt: stmt_expr */ #line 382 "CMDgram.y" { (yyval.stmt) = (yyvsp[0].expr); } -#line 2600 "CMDgram.c" +#line 2643 "CMDgram.c" break; case 76: /* expr: stmt_expr */ #line 387 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 2606 "CMDgram.c" +#line 2649 "CMDgram.c" break; case 77: /* expr: '(' expr ')' */ #line 389 "CMDgram.y" { (yyval.expr) = (yyvsp[-1].expr); } -#line 2612 "CMDgram.c" +#line 2655 "CMDgram.c" break; case 78: /* expr: expr '^' expr */ #line 391 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2618 "CMDgram.c" +#line 2661 "CMDgram.c" break; case 79: /* expr: expr '%' expr */ #line 393 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2624 "CMDgram.c" +#line 2667 "CMDgram.c" break; case 80: /* expr: expr '&' expr */ #line 395 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2630 "CMDgram.c" +#line 2673 "CMDgram.c" break; case 81: /* expr: expr '|' expr */ #line 397 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2636 "CMDgram.c" +#line 2679 "CMDgram.c" break; case 82: /* expr: expr '+' expr */ #line 399 "CMDgram.y" { (yyval.expr) = FloatBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2642 "CMDgram.c" +#line 2685 "CMDgram.c" break; case 83: /* expr: expr '-' expr */ #line 401 "CMDgram.y" { (yyval.expr) = FloatBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2648 "CMDgram.c" +#line 2691 "CMDgram.c" break; case 84: /* expr: expr '*' expr */ #line 403 "CMDgram.y" { (yyval.expr) = FloatBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2654 "CMDgram.c" +#line 2697 "CMDgram.c" break; case 85: /* expr: expr '/' expr */ #line 405 "CMDgram.y" { (yyval.expr) = FloatBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2660 "CMDgram.c" +#line 2703 "CMDgram.c" break; case 86: /* expr: '-' expr */ #line 407 "CMDgram.y" { (yyval.expr) = FloatUnaryExprNode::alloc( (yyvsp[-1].i).lineNumber, (yyvsp[-1].i).value, (yyvsp[0].expr)); } -#line 2666 "CMDgram.c" +#line 2709 "CMDgram.c" break; case 87: /* expr: '*' expr */ #line 409 "CMDgram.y" { (yyval.expr) = TTagDerefNode::alloc( (yyvsp[-1].i).lineNumber, (yyvsp[0].expr) ); } -#line 2672 "CMDgram.c" +#line 2715 "CMDgram.c" break; case 88: /* expr: TTAG */ #line 411 "CMDgram.y" { (yyval.expr) = TTagExprNode::alloc( (yyvsp[0].s).lineNumber, (yyvsp[0].s).value ); } -#line 2678 "CMDgram.c" +#line 2721 "CMDgram.c" break; case 89: /* expr: expr '?' expr ':' expr */ #line 413 "CMDgram.y" { (yyval.expr) = ConditionalExprNode::alloc( (yyvsp[-4].expr)->dbgLineNumber, (yyvsp[-4].expr), (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2684 "CMDgram.c" +#line 2727 "CMDgram.c" break; case 90: /* expr: expr '<' expr */ #line 415 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2690 "CMDgram.c" +#line 2733 "CMDgram.c" break; case 91: /* expr: expr '>' expr */ #line 417 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2696 "CMDgram.c" +#line 2739 "CMDgram.c" break; case 92: /* expr: expr opGE expr */ #line 419 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2702 "CMDgram.c" +#line 2745 "CMDgram.c" break; case 93: /* expr: expr opLE expr */ #line 421 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2708 "CMDgram.c" +#line 2751 "CMDgram.c" break; case 94: /* expr: expr opEQ expr */ #line 423 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2714 "CMDgram.c" +#line 2757 "CMDgram.c" break; case 95: /* expr: expr opNE expr */ #line 425 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2720 "CMDgram.c" +#line 2763 "CMDgram.c" break; case 96: /* expr: expr opOR expr */ #line 427 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2726 "CMDgram.c" +#line 2769 "CMDgram.c" break; case 97: /* expr: expr opSHL expr */ #line 429 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2732 "CMDgram.c" +#line 2775 "CMDgram.c" break; case 98: /* expr: expr opSHR expr */ #line 431 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2738 "CMDgram.c" +#line 2781 "CMDgram.c" break; case 99: /* expr: expr opAND expr */ #line 433 "CMDgram.y" { (yyval.expr) = IntBinaryExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-1].i).value, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 2744 "CMDgram.c" +#line 2787 "CMDgram.c" break; case 100: /* expr: expr opSTREQ expr */ #line 435 "CMDgram.y" { (yyval.expr) = StreqExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-2].expr), (yyvsp[0].expr), true); } -#line 2750 "CMDgram.c" +#line 2793 "CMDgram.c" break; case 101: /* expr: expr opSTRNE expr */ #line 437 "CMDgram.y" { (yyval.expr) = StreqExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-2].expr), (yyvsp[0].expr), false); } -#line 2756 "CMDgram.c" +#line 2799 "CMDgram.c" break; case 102: /* expr: expr '@' expr */ #line 439 "CMDgram.y" { (yyval.expr) = StrcatExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-2].expr), (yyvsp[0].expr), (yyvsp[-1].i).value); } -#line 2762 "CMDgram.c" +#line 2805 "CMDgram.c" break; case 103: /* expr: '!' expr */ #line 441 "CMDgram.y" { (yyval.expr) = IntUnaryExprNode::alloc((yyvsp[-1].i).lineNumber, (yyvsp[-1].i).value, (yyvsp[0].expr)); } -#line 2768 "CMDgram.c" +#line 2811 "CMDgram.c" break; case 104: /* expr: '~' expr */ #line 443 "CMDgram.y" { (yyval.expr) = IntUnaryExprNode::alloc((yyvsp[-1].i).lineNumber, (yyvsp[-1].i).value, (yyvsp[0].expr)); } -#line 2774 "CMDgram.c" +#line 2817 "CMDgram.c" break; case 105: /* expr: TAGATOM */ #line 445 "CMDgram.y" { (yyval.expr) = StrConstNode::alloc( (yyvsp[0].str).lineNumber, (yyvsp[0].str).value, true); } -#line 2780 "CMDgram.c" +#line 2823 "CMDgram.c" break; case 106: /* expr: FLTCONST */ #line 447 "CMDgram.y" { (yyval.expr) = FloatNode::alloc( (yyvsp[0].f).lineNumber, (yyvsp[0].f).value ); } -#line 2786 "CMDgram.c" +#line 2829 "CMDgram.c" break; case 107: /* expr: INTCONST */ #line 449 "CMDgram.y" { (yyval.expr) = IntNode::alloc( (yyvsp[0].i).lineNumber, (yyvsp[0].i).value ); } -#line 2792 "CMDgram.c" +#line 2835 "CMDgram.c" break; case 108: /* expr: rwBREAK */ #line 451 "CMDgram.y" { (yyval.expr) = ConstantNode::alloc( (yyvsp[0].i).lineNumber, StringTable->insert("break")); } -#line 2798 "CMDgram.c" +#line 2841 "CMDgram.c" break; case 109: /* expr: slot_acc */ #line 453 "CMDgram.y" { (yyval.expr) = SlotAccessNode::alloc( (yyvsp[0].slot).lineNumber, (yyvsp[0].slot).object, (yyvsp[0].slot).array, (yyvsp[0].slot).slotName ); } -#line 2804 "CMDgram.c" +#line 2847 "CMDgram.c" break; case 110: /* expr: intslot_acc */ #line 455 "CMDgram.y" { (yyval.expr) = InternalSlotAccessNode::alloc( (yyvsp[0].intslot).lineNumber, (yyvsp[0].intslot).object, (yyvsp[0].intslot).slotExpr, (yyvsp[0].intslot).recurse); } -#line 2810 "CMDgram.c" +#line 2853 "CMDgram.c" break; case 111: /* expr: IDENT */ #line 457 "CMDgram.y" { (yyval.expr) = ConstantNode::alloc( (yyvsp[0].s).lineNumber, (yyvsp[0].s).value ); } -#line 2816 "CMDgram.c" +#line 2859 "CMDgram.c" break; case 112: /* expr: STRATOM */ #line 459 "CMDgram.y" { (yyval.expr) = StrConstNode::alloc( (yyvsp[0].str).lineNumber, (yyvsp[0].str).value, false); } -#line 2822 "CMDgram.c" +#line 2865 "CMDgram.c" break; case 113: /* expr: VAR */ #line 461 "CMDgram.y" { (yyval.expr) = (ExprNode*)VarNode::alloc( (yyvsp[0].s).lineNumber, (yyvsp[0].s).value, NULL); } -#line 2828 "CMDgram.c" +#line 2871 "CMDgram.c" break; case 114: /* expr: VAR '[' aidx_expr ']' */ #line 463 "CMDgram.y" { (yyval.expr) = (ExprNode*)VarNode::alloc( (yyvsp[-3].s).lineNumber, (yyvsp[-3].s).value, (yyvsp[-1].expr) ); } -#line 2834 "CMDgram.c" +#line 2877 "CMDgram.c" break; - case 115: /* slot_acc: expr '.' IDENT */ -#line 485 "CMDgram.y" + case 115: /* expr: expr '[' expr ']' */ +#line 465 "CMDgram.y" + { (yyval.expr) = VectorIndexNode::alloc((yyvsp[-3].expr)->dbgLineNumber, (yyvsp[-3].expr), (yyvsp[-1].expr)); } +#line 2883 "CMDgram.c" + break; + + case 116: /* expr: '[' expr_list_decl ']' */ +#line 467 "CMDgram.y" + { + Vector elems; + if ((yyvsp[-1].expr)) { + // expr_list already chains ExprNodes using append(), + // so walk and collect them + for (ExprNode* e = (yyvsp[-1].expr); e; e = (ExprNode*)e->getNext()) + elems.push_back(e); + } + (yyval.expr) = VectorExprNode::alloc((yylsp[-2]).first_line, elems); + } +#line 2898 "CMDgram.c" + break; + + case 117: /* slot_acc: expr '.' IDENT */ +#line 498 "CMDgram.y" { (yyval.slot).lineNumber = (yyvsp[-2].expr)->dbgLineNumber; (yyval.slot).object = (yyvsp[-2].expr); (yyval.slot).slotName = (yyvsp[0].s).value; (yyval.slot).array = NULL; } -#line 2840 "CMDgram.c" +#line 2904 "CMDgram.c" break; - case 116: /* slot_acc: expr '.' IDENT '[' aidx_expr ']' */ -#line 487 "CMDgram.y" + case 118: /* slot_acc: expr '.' IDENT '[' aidx_expr ']' */ +#line 500 "CMDgram.y" { (yyval.slot).lineNumber = (yyvsp[-5].expr)->dbgLineNumber; (yyval.slot).object = (yyvsp[-5].expr); (yyval.slot).slotName = (yyvsp[-3].s).value; (yyval.slot).array = (yyvsp[-1].expr); } -#line 2846 "CMDgram.c" +#line 2910 "CMDgram.c" break; - case 117: /* intslot_acc: expr opINTNAME class_name_expr */ -#line 492 "CMDgram.y" + case 119: /* intslot_acc: expr opINTNAME class_name_expr */ +#line 505 "CMDgram.y" { (yyval.intslot).lineNumber = (yyvsp[-2].expr)->dbgLineNumber; (yyval.intslot).object = (yyvsp[-2].expr); (yyval.intslot).slotExpr = (yyvsp[0].expr); (yyval.intslot).recurse = false; } -#line 2852 "CMDgram.c" +#line 2916 "CMDgram.c" break; - case 118: /* intslot_acc: expr opINTNAMER class_name_expr */ -#line 494 "CMDgram.y" + case 120: /* intslot_acc: expr opINTNAMER class_name_expr */ +#line 507 "CMDgram.y" { (yyval.intslot).lineNumber = (yyvsp[-2].expr)->dbgLineNumber; (yyval.intslot).object = (yyvsp[-2].expr); (yyval.intslot).slotExpr = (yyvsp[0].expr); (yyval.intslot).recurse = true; } -#line 2858 "CMDgram.c" +#line 2922 "CMDgram.c" break; - case 119: /* class_name_expr: IDENT */ -#line 499 "CMDgram.y" + case 121: /* class_name_expr: IDENT */ +#line 512 "CMDgram.y" { (yyval.expr) = ConstantNode::alloc( (yyvsp[0].s).lineNumber, (yyvsp[0].s).value ); } -#line 2864 "CMDgram.c" +#line 2928 "CMDgram.c" break; - case 120: /* class_name_expr: '(' expr ')' */ -#line 501 "CMDgram.y" + case 122: /* class_name_expr: '(' expr ')' */ +#line 514 "CMDgram.y" { (yyval.expr) = (yyvsp[-1].expr); } -#line 2870 "CMDgram.c" +#line 2934 "CMDgram.c" break; - case 121: /* assign_op_struct: opPLUSPLUS */ -#line 506 "CMDgram.y" + case 123: /* assign_op_struct: opPLUSPLUS */ +#line 519 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[0].i).lineNumber; (yyval.asn).token = opPLUSPLUS; (yyval.asn).expr = FloatNode::alloc( (yyvsp[0].i).lineNumber, 1 ); } -#line 2876 "CMDgram.c" +#line 2940 "CMDgram.c" break; - case 122: /* assign_op_struct: opMINUSMINUS */ -#line 508 "CMDgram.y" + case 124: /* assign_op_struct: opMINUSMINUS */ +#line 521 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[0].i).lineNumber; (yyval.asn).token = opMINUSMINUS; (yyval.asn).expr = FloatNode::alloc( (yyvsp[0].i).lineNumber, 1 ); } -#line 2882 "CMDgram.c" +#line 2946 "CMDgram.c" break; - case 123: /* assign_op_struct: opPLASN expr */ -#line 510 "CMDgram.y" + case 125: /* assign_op_struct: opPLASN expr */ +#line 523 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '+'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2888 "CMDgram.c" +#line 2952 "CMDgram.c" break; - case 124: /* assign_op_struct: opMIASN expr */ -#line 512 "CMDgram.y" + case 126: /* assign_op_struct: opMIASN expr */ +#line 525 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '-'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2894 "CMDgram.c" +#line 2958 "CMDgram.c" break; - case 125: /* assign_op_struct: opMLASN expr */ -#line 514 "CMDgram.y" + case 127: /* assign_op_struct: opMLASN expr */ +#line 527 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '*'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2900 "CMDgram.c" +#line 2964 "CMDgram.c" break; - case 126: /* assign_op_struct: opDVASN expr */ -#line 516 "CMDgram.y" + case 128: /* assign_op_struct: opDVASN expr */ +#line 529 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '/'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2906 "CMDgram.c" +#line 2970 "CMDgram.c" break; - case 127: /* assign_op_struct: opMODASN expr */ -#line 518 "CMDgram.y" + case 129: /* assign_op_struct: opMODASN expr */ +#line 531 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '%'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2912 "CMDgram.c" +#line 2976 "CMDgram.c" break; - case 128: /* assign_op_struct: opANDASN expr */ -#line 520 "CMDgram.y" + case 130: /* assign_op_struct: opANDASN expr */ +#line 533 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '&'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2918 "CMDgram.c" +#line 2982 "CMDgram.c" break; - case 129: /* assign_op_struct: opXORASN expr */ -#line 522 "CMDgram.y" + case 131: /* assign_op_struct: opXORASN expr */ +#line 535 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '^'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2924 "CMDgram.c" +#line 2988 "CMDgram.c" break; - case 130: /* assign_op_struct: opORASN expr */ -#line 524 "CMDgram.y" + case 132: /* assign_op_struct: opORASN expr */ +#line 537 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = '|'; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2930 "CMDgram.c" +#line 2994 "CMDgram.c" break; - case 131: /* assign_op_struct: opSLASN expr */ -#line 526 "CMDgram.y" + case 133: /* assign_op_struct: opSLASN expr */ +#line 539 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = opSHL; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2936 "CMDgram.c" +#line 3000 "CMDgram.c" break; - case 132: /* assign_op_struct: opSRASN expr */ -#line 528 "CMDgram.y" + case 134: /* assign_op_struct: opSRASN expr */ +#line 541 "CMDgram.y" { (yyval.asn).lineNumber = (yyvsp[-1].i).lineNumber; (yyval.asn).token = opSHR; (yyval.asn).expr = (yyvsp[0].expr); } -#line 2942 "CMDgram.c" +#line 3006 "CMDgram.c" break; - case 133: /* stmt_expr: funcall_expr */ -#line 533 "CMDgram.y" + case 135: /* stmt_expr: funcall_expr */ +#line 546 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 2948 "CMDgram.c" +#line 3012 "CMDgram.c" break; - case 134: /* stmt_expr: assert_expr */ -#line 535 "CMDgram.y" + case 136: /* stmt_expr: assert_expr */ +#line 548 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 2954 "CMDgram.c" +#line 3018 "CMDgram.c" break; - case 135: /* stmt_expr: object_decl */ -#line 537 "CMDgram.y" + case 137: /* stmt_expr: object_decl */ +#line 550 "CMDgram.y" { (yyval.expr) = (yyvsp[0].od); } -#line 2960 "CMDgram.c" +#line 3024 "CMDgram.c" break; - case 136: /* stmt_expr: VAR '=' expr */ -#line 539 "CMDgram.y" + case 138: /* stmt_expr: VAR '=' expr */ +#line 552 "CMDgram.y" { (yyval.expr) = AssignExprNode::alloc( (yyvsp[-2].s).lineNumber, (yyvsp[-2].s).value, NULL, (yyvsp[0].expr)); } -#line 2966 "CMDgram.c" +#line 3030 "CMDgram.c" break; - case 137: /* stmt_expr: VAR '[' aidx_expr ']' '=' expr */ -#line 541 "CMDgram.y" + case 139: /* stmt_expr: VAR '[' aidx_expr ']' '=' expr */ +#line 554 "CMDgram.y" { (yyval.expr) = AssignExprNode::alloc( (yyvsp[-5].s).lineNumber, (yyvsp[-5].s).value, (yyvsp[-3].expr), (yyvsp[0].expr)); } -#line 2972 "CMDgram.c" +#line 3036 "CMDgram.c" break; - case 138: /* stmt_expr: VAR assign_op_struct */ -#line 543 "CMDgram.y" + case 140: /* stmt_expr: VAR assign_op_struct */ +#line 556 "CMDgram.y" { (yyval.expr) = AssignOpExprNode::alloc( (yyvsp[-1].s).lineNumber, (yyvsp[-1].s).value, NULL, (yyvsp[0].asn).expr, (yyvsp[0].asn).token); } -#line 2978 "CMDgram.c" +#line 3042 "CMDgram.c" break; - case 139: /* stmt_expr: VAR '[' aidx_expr ']' assign_op_struct */ -#line 545 "CMDgram.y" + case 141: /* stmt_expr: VAR '[' aidx_expr ']' assign_op_struct */ +#line 558 "CMDgram.y" { (yyval.expr) = AssignOpExprNode::alloc( (yyvsp[-4].s).lineNumber, (yyvsp[-4].s).value, (yyvsp[-2].expr), (yyvsp[0].asn).expr, (yyvsp[0].asn).token); } -#line 2984 "CMDgram.c" +#line 3048 "CMDgram.c" break; - case 140: /* stmt_expr: slot_acc assign_op_struct */ -#line 547 "CMDgram.y" + case 142: /* stmt_expr: slot_acc assign_op_struct */ +#line 560 "CMDgram.y" { (yyval.expr) = SlotAssignOpNode::alloc( (yyvsp[-1].slot).lineNumber, (yyvsp[-1].slot).object, (yyvsp[-1].slot).slotName, (yyvsp[-1].slot).array, (yyvsp[0].asn).token, (yyvsp[0].asn).expr); } -#line 2990 "CMDgram.c" +#line 3054 "CMDgram.c" break; - case 141: /* stmt_expr: slot_acc '=' expr */ -#line 549 "CMDgram.y" + case 143: /* stmt_expr: slot_acc '=' expr */ +#line 562 "CMDgram.y" { (yyval.expr) = SlotAssignNode::alloc( (yyvsp[-2].slot).lineNumber, (yyvsp[-2].slot).object, (yyvsp[-2].slot).array, (yyvsp[-2].slot).slotName, (yyvsp[0].expr)); } -#line 2996 "CMDgram.c" +#line 3060 "CMDgram.c" break; - case 142: /* stmt_expr: slot_acc '=' '{' expr_list '}' */ -#line 551 "CMDgram.y" + case 144: /* stmt_expr: slot_acc '=' '{' expr_list '}' */ +#line 564 "CMDgram.y" { (yyval.expr) = SlotAssignNode::alloc( (yyvsp[-4].slot).lineNumber, (yyvsp[-4].slot).object, (yyvsp[-4].slot).array, (yyvsp[-4].slot).slotName, (yyvsp[-1].expr)); } -#line 3002 "CMDgram.c" +#line 3066 "CMDgram.c" break; - case 143: /* funcall_expr: IDENT '(' expr_list_decl ')' */ -#line 556 "CMDgram.y" + case 145: /* funcall_expr: IDENT '(' expr_list_decl ')' */ +#line 569 "CMDgram.y" { (yyval.expr) = FuncCallExprNode::alloc( (yyvsp[-3].s).lineNumber, (yyvsp[-3].s).value, NULL, (yyvsp[-1].expr), false); } -#line 3008 "CMDgram.c" +#line 3072 "CMDgram.c" break; - case 144: /* funcall_expr: IDENT opCOLONCOLON IDENT '(' expr_list_decl ')' */ -#line 558 "CMDgram.y" + case 146: /* funcall_expr: IDENT opCOLONCOLON IDENT '(' expr_list_decl ')' */ +#line 571 "CMDgram.y" { (yyval.expr) = FuncCallExprNode::alloc( (yyvsp[-5].s).lineNumber, (yyvsp[-3].s).value, (yyvsp[-5].s).value, (yyvsp[-1].expr), false); } -#line 3014 "CMDgram.c" +#line 3078 "CMDgram.c" break; - case 145: /* funcall_expr: expr '.' IDENT '(' expr_list_decl ')' */ -#line 560 "CMDgram.y" + case 147: /* funcall_expr: expr '.' IDENT '(' expr_list_decl ')' */ +#line 573 "CMDgram.y" { (yyvsp[-5].expr)->append((yyvsp[-1].expr)); (yyval.expr) = FuncCallExprNode::alloc( (yyvsp[-5].expr)->dbgLineNumber, (yyvsp[-3].s).value, NULL, (yyvsp[-5].expr), true); } -#line 3020 "CMDgram.c" +#line 3084 "CMDgram.c" break; - case 146: /* assert_expr: rwASSERT '(' expr ')' */ -#line 570 "CMDgram.y" + case 148: /* assert_expr: rwASSERT '(' expr ')' */ +#line 583 "CMDgram.y" { (yyval.expr) = AssertCallExprNode::alloc( (yyvsp[-3].i).lineNumber, (yyvsp[-1].expr), NULL ); } -#line 3026 "CMDgram.c" +#line 3090 "CMDgram.c" break; - case 147: /* assert_expr: rwASSERT '(' expr ',' STRATOM ')' */ -#line 572 "CMDgram.y" + case 149: /* assert_expr: rwASSERT '(' expr ',' STRATOM ')' */ +#line 585 "CMDgram.y" { (yyval.expr) = AssertCallExprNode::alloc( (yyvsp[-5].i).lineNumber, (yyvsp[-3].expr), (yyvsp[-1].str).value ); } -#line 3032 "CMDgram.c" +#line 3096 "CMDgram.c" break; - case 148: /* expr_list_decl: %empty */ -#line 577 "CMDgram.y" + case 150: /* expr_list_decl: %empty */ +#line 590 "CMDgram.y" { (yyval.expr) = NULL; } -#line 3038 "CMDgram.c" +#line 3102 "CMDgram.c" break; - case 149: /* expr_list_decl: expr_list */ -#line 579 "CMDgram.y" + case 151: /* expr_list_decl: expr_list */ +#line 592 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 3044 "CMDgram.c" +#line 3108 "CMDgram.c" break; - case 150: /* expr_list: expr */ -#line 584 "CMDgram.y" + case 152: /* expr_list: expr */ +#line 597 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 3050 "CMDgram.c" +#line 3114 "CMDgram.c" break; - case 151: /* expr_list: expr_list ',' expr */ -#line 586 "CMDgram.y" + case 153: /* expr_list: expr_list ',' expr */ +#line 599 "CMDgram.y" { ((yyvsp[-2].expr))->append((yyvsp[0].expr)); (yyval.expr) = (yyvsp[-2].expr); } -#line 3056 "CMDgram.c" +#line 3120 "CMDgram.c" break; - case 152: /* slot_assign_list_opt: %empty */ -#line 591 "CMDgram.y" + case 154: /* slot_assign_list_opt: %empty */ +#line 604 "CMDgram.y" { (yyval.slist) = NULL; } -#line 3062 "CMDgram.c" +#line 3126 "CMDgram.c" break; - case 153: /* slot_assign_list_opt: slot_assign_list */ -#line 593 "CMDgram.y" + case 155: /* slot_assign_list_opt: slot_assign_list */ +#line 606 "CMDgram.y" { (yyval.slist) = (yyvsp[0].slist); } -#line 3068 "CMDgram.c" +#line 3132 "CMDgram.c" break; - case 154: /* slot_assign_list: slot_assign */ -#line 598 "CMDgram.y" + case 156: /* slot_assign_list: slot_assign */ +#line 611 "CMDgram.y" { (yyval.slist) = (yyvsp[0].slist); } -#line 3074 "CMDgram.c" +#line 3138 "CMDgram.c" break; - case 155: /* slot_assign_list: slot_assign_list slot_assign */ -#line 600 "CMDgram.y" + case 157: /* slot_assign_list: slot_assign_list slot_assign */ +#line 613 "CMDgram.y" { (yyvsp[-1].slist)->append((yyvsp[0].slist)); (yyval.slist) = (yyvsp[-1].slist); } -#line 3080 "CMDgram.c" +#line 3144 "CMDgram.c" break; - case 156: /* slot_assign: IDENT '=' expr ';' */ -#line 605 "CMDgram.y" + case 158: /* slot_assign: IDENT '=' expr ';' */ +#line 618 "CMDgram.y" { (yyval.slist) = SlotAssignNode::alloc( (yyvsp[-3].s).lineNumber, NULL, NULL, (yyvsp[-3].s).value, (yyvsp[-1].expr)); } -#line 3086 "CMDgram.c" +#line 3150 "CMDgram.c" break; - case 157: /* slot_assign: TYPEIDENT IDENT '=' expr ';' */ -#line 607 "CMDgram.y" + case 159: /* slot_assign: TYPEIDENT IDENT '=' expr ';' */ +#line 620 "CMDgram.y" { (yyval.slist) = SlotAssignNode::alloc( (yyvsp[-4].i).lineNumber, NULL, NULL, (yyvsp[-3].s).value, (yyvsp[-1].expr), (yyvsp[-4].i).value); } -#line 3092 "CMDgram.c" +#line 3156 "CMDgram.c" break; - case 158: /* slot_assign: rwDATABLOCK '=' expr ';' */ -#line 609 "CMDgram.y" + case 160: /* slot_assign: rwDATABLOCK '=' expr ';' */ +#line 622 "CMDgram.y" { (yyval.slist) = SlotAssignNode::alloc( (yyvsp[-3].i).lineNumber, NULL, NULL, StringTable->insert("datablock"), (yyvsp[-1].expr)); } -#line 3098 "CMDgram.c" +#line 3162 "CMDgram.c" break; - case 159: /* slot_assign: IDENT '[' aidx_expr ']' '=' expr ';' */ -#line 611 "CMDgram.y" + case 161: /* slot_assign: IDENT '[' aidx_expr ']' '=' expr ';' */ +#line 624 "CMDgram.y" { (yyval.slist) = SlotAssignNode::alloc( (yyvsp[-6].s).lineNumber, NULL, (yyvsp[-4].expr), (yyvsp[-6].s).value, (yyvsp[-1].expr)); } -#line 3104 "CMDgram.c" +#line 3168 "CMDgram.c" break; - case 160: /* slot_assign: TYPEIDENT IDENT '[' aidx_expr ']' '=' expr ';' */ -#line 613 "CMDgram.y" + case 162: /* slot_assign: TYPEIDENT IDENT '[' aidx_expr ']' '=' expr ';' */ +#line 626 "CMDgram.y" { (yyval.slist) = SlotAssignNode::alloc( (yyvsp[-7].i).lineNumber, NULL, (yyvsp[-4].expr), (yyvsp[-6].s).value, (yyvsp[-1].expr), (yyvsp[-7].i).value); } -#line 3110 "CMDgram.c" +#line 3174 "CMDgram.c" break; - case 161: /* aidx_expr: expr */ -#line 618 "CMDgram.y" + case 163: /* aidx_expr: expr */ +#line 631 "CMDgram.y" { (yyval.expr) = (yyvsp[0].expr); } -#line 3116 "CMDgram.c" +#line 3180 "CMDgram.c" break; - case 162: /* aidx_expr: aidx_expr ',' expr */ -#line 620 "CMDgram.y" + case 164: /* aidx_expr: aidx_expr ',' expr */ +#line 633 "CMDgram.y" { (yyval.expr) = CommaCatExprNode::alloc( (yyvsp[-2].expr)->dbgLineNumber, (yyvsp[-2].expr), (yyvsp[0].expr)); } -#line 3122 "CMDgram.c" +#line 3186 "CMDgram.c" break; -#line 3126 "CMDgram.c" +#line 3190 "CMDgram.c" default: break; } @@ -3325,7 +3389,7 @@ yyparse (void) return yyresult; } -#line 622 "CMDgram.y" +#line 635 "CMDgram.y" int diff --git a/Engine/source/console/torquescript/codeBlock.cpp b/Engine/source/console/torquescript/codeBlock.cpp index 5a4bdb30ae..414c95c958 100644 --- a/Engine/source/console/torquescript/codeBlock.cpp +++ b/Engine/source/console/torquescript/codeBlock.cpp @@ -1389,6 +1389,19 @@ void CodeBlock::dumpInstructions(U32 startIp, bool upToReturn) break; } + case OP_CREATE_VECTOR: + { + U32 count = code[ip]; + Con::printf("%i: OP_CREATE_VECTOR stk=+1 count=%u", ip - 2, count); + ++ip; + break; + } + case OP_VECTOR_PUSH: + { + Con::printf("%i: OP_VECTOR_PUSH stk=0", ip - 1); + break; + } + default: Con::printf("%i: !!INVALID!!", ip - 1); break; diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index f6cb5695ec..59bf7e7e0f 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -360,6 +360,11 @@ const char *ExprEvalState::getStringVariable() return currentVariable ? currentVariable->getStringValue() : ""; } +std::shared_ptr> ExprEvalState::getVectorVariable() +{ + return currentVariable ? currentVariable->getVectorValue() : NULL; +} + //------------------------------------------------------------ void ExprEvalState::setIntVariable(S32 val) @@ -380,6 +385,12 @@ void ExprEvalState::setStringVariable(const char *val) currentVariable->setStringValue(val); } +void ExprEvalState::setVectorVariable(std::shared_ptr> val) +{ + AssertFatal(currentVariable != NULL, "Invalid evaluator state - trying to set null variable!"); + currentVariable->setVectorValue(val); +} + //----------------------------------------------------------------------------- enum class FloatOperation @@ -1441,6 +1452,72 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi curNSDocBlock = NULL; break; + case OP_SETCURVAR_VECTOR_MEMBER: + { + U32 index = stack[_STK--].getInt(); // index + ConsoleValue& vecVal = stack[_STK--]; // vector + ConsoleValue exprVal = stack[_STK--]; // value + + std::shared_ptr> vec = vecVal.getVector(); + if (!vec) + { + Con::errorf("Assigning to non-vector variable, promoting to a vector."); + vecVal.setVector(std::make_shared>()); + vec = vecVal.getVector(); + } + + if (index > vec->size()) + { + vec->setSize(index); + } + + vec->insert(index, exprVal); + vec.reset(); + break; + } + case OP_SETCURVAR_VECTOR_MEMBER_GLOBAL: + { + currentRegister = -1; + U32 index = stack[_STK--].getInt(); // pop index + ConsoleValue exprVal = stack[_STK--]; // pop assigned value + + std::shared_ptr> vec = Script::gEvalState.getVectorVariable(); + + if (!vec) + { + Script::gEvalState.setVectorVariable(std::make_shared>()); + vec = Script::gEvalState.getVectorVariable(); + } + + // Grow vector if necessary + if (index > vec->size()) + vec->setSize(index); + + vec->insert(index, exprVal); + vec.reset(); + break; + } + case OP_SETCURVAR_VECTOR_MEMBER_LOCAL: + { + U32 index = stack[_STK--].getInt(); // pop index + ConsoleValue exprVal = stack[_STK--]; // pop assigned value + reg = code[ip++]; // read the local variable register + currentRegister = reg; + + std::shared_ptr> vec = Script::gEvalState.getLocalVectorVariable(reg); + if (!vec) + { + Script::gEvalState.setLocalVectorVariable(reg, std::make_shared>()); + vec = Script::gEvalState.getLocalVectorVariable(reg); + } + + if (index > vec->size()) + vec->setSize(index); + + vec->insert(index, exprVal); + vec.reset(); + break; + } case OP_LOADVAR_UINT: currentRegister = -1; stack[_STK + 1].setInt(Script::gEvalState.getIntVariable()); @@ -1459,6 +1536,147 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi _STK++; break; + case OP_LOADVAR_VECTOR: + currentRegister = -1; + if (!Script::gEvalState.getVectorVariable()) + { + Script::gEvalState.setVectorVariable(std::make_shared>()); + } + stack[_STK + 1].setVector(Script::gEvalState.getVectorVariable()); + _STK++; + break; + + case OP_LOADVAR_VECTOR_MEMBER: + { + U32 index = stack[_STK--].getInt(); // pop the index + ConsoleValue vecVal = stack[_STK]; // this is the vector + + TypeReq type = (TypeReq)code[ip++]; + + std::shared_ptr> vec = vecVal.getVector(); + if (!vec) + { + Con::errorf("Tried to index a non-vector variable. Promoting to vector."); + vecVal.setVector(std::make_shared>()); + vec = vecVal.getVector(); + vec->setSize(index); + } + + // out-of-bounds handling + if (index >= vec->size()) + { + Con::warnf(ConsoleLogEntry::Script, "%s: Index out of bounds", getFileLine(ip - 2)); + switch (type) + { + case TypeReqUInt: stack[_STK].setInt(-1); break; + case TypeReqFloat: stack[_STK].setFloat(0.0f); break; + case TypeReqVector: stack[_STK].setVector(std::make_shared>()); break; + case TypeReqString: + case TypeReqNone: stack[_STK].setString(""); break; + } + } + else + { + switch (type) + { + case TypeReqUInt: stack[_STK].setInt(vec->address()[index].getInt()); break; + case TypeReqFloat: stack[_STK].setFloat(vec->address()[index].getFloat()); break; + case TypeReqVector: stack[_STK].setVector(vec->address()[index].getVector()); break; + case TypeReqString: + case TypeReqNone: stack[_STK].setString(vec->address()[index].getString()); break; + } + } + + vec.reset(); + break; + } + case OP_LOADVAR_VECTOR_MEMBER_GLOBAL: + { + U32 index = stack[_STK--].getInt(); // pop index + TypeReq type = (TypeReq)code[ip++]; + + // Grab global vector variable + std::shared_ptr> vec = Script::gEvalState.getVectorVariable(); + if (!vec) + { + Script::gEvalState.setVectorVariable(std::make_shared>()); + vec = Script::gEvalState.getVectorVariable(); + } + + if (index >= vec->size()) + { + Con::warnf(ConsoleLogEntry::Script, "%s: Index %u out of bounds", getFileLine(ip - 2), index); + switch (type) + { + case TypeReqUInt: stack[_STK + 1].setInt(-1); break; + case TypeReqFloat: stack[_STK + 1].setFloat(0.0f); break; + case TypeReqVector: stack[_STK + 1].setVector(std::make_shared>()); break; + case TypeReqString: + case TypeReqNone: stack[_STK + 1].setString(""); break; + } + } + else + { + switch (type) + { + case TypeReqUInt: stack[_STK + 1].setInt(vec->address()[index].getInt()); break; + case TypeReqFloat: stack[_STK + 1].setFloat(vec->address()[index].getFloat()); break; + case TypeReqVector: stack[_STK + 1].setVector(vec->address()[index].getVector()); break; + case TypeReqString: + case TypeReqNone: stack[_STK + 1].setString(vec->address()[index].getString()); break; + } + } + vec.reset(); + _STK++; + break; + } + case OP_LOADVAR_VECTOR_MEMBER_LOCAL: + { + U32 index = stack[_STK--].getInt(); // pop index + TypeReq type = (TypeReq)code[ip++]; + + reg = code[ip++]; // local variable register index + currentRegister = reg; + + // See OP_SETCURVAR + prevField = NULL; + prevObject = NULL; + curObject = NULL; + + std::shared_ptr> vec = Script::gEvalState.getLocalVectorVariable(reg); + if (!vec) + { + Script::gEvalState.setLocalVectorVariable(reg, std::make_shared>()); + vec = Script::gEvalState.getLocalVectorVariable(reg); + } + + if (index >= vec->size()) + { + Con::warnf(ConsoleLogEntry::Script, "%s: Index %u out of bounds", getFileLine(ip - 2), index); + switch (type) + { + case TypeReqUInt: stack[_STK + 1].setInt(-1); break; + case TypeReqFloat: stack[_STK + 1].setFloat(0.0f); break; + case TypeReqVector: stack[_STK + 1].setVector(std::make_shared>()); break; + case TypeReqString: + case TypeReqNone: stack[_STK + 1].setString(""); break; + } + } + else + { + switch (type) + { + case TypeReqUInt: stack[_STK + 1].setInt(vec->address()[index].getInt()); break; + case TypeReqFloat: stack[_STK + 1].setFloat(vec->address()[index].getFloat()); break; + case TypeReqVector: stack[_STK + 1].setVector(vec->address()[index].getVector()); break; + case TypeReqString: + case TypeReqNone: stack[_STK + 1].setString(vec->address()[index].getString()); break; + } + } + vec.reset(); + _STK++; + break; + } case OP_SAVEVAR_UINT: Script::gEvalState.setIntVariable(stack[_STK].getInt()); break; @@ -1471,6 +1689,10 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi Script::gEvalState.setStringVariable(stack[_STK].getString()); break; + case OP_SAVEVAR_VECTOR: + Script::gEvalState.setVectorVariable(stack[_STK].getVector()); + break; + case OP_LOAD_LOCAL_VAR_UINT: reg = code[ip++]; currentRegister = reg; @@ -1511,6 +1733,23 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi _STK++; break; + case OP_LOAD_LOCAL_VAR_VECTOR: + reg = code[ip++]; + currentRegister = reg; + + // See OP_SETCURVAR + prevField = NULL; + prevObject = NULL; + curObject = NULL; + + if (!Script::gEvalState.getLocalVectorVariable(reg)) + { + Script::gEvalState.setLocalVectorVariable(reg, std::make_shared>()); + } + stack[_STK + 1].setVector(Script::gEvalState.getLocalVectorVariable(reg)); + _STK++; + break; + case OP_SAVE_LOCAL_VAR_UINT: reg = code[ip++]; currentRegister = reg; @@ -1548,6 +1787,17 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi Script::gEvalState.setLocalStringVariable(reg, val, (S32)dStrlen(val)); break; + case OP_SAVE_LOCAL_VAR_VECTOR: + reg = code[ip++]; + currentRegister = reg; + + // See OP_SETCURVAR + prevField = NULL; + prevObject = NULL; + curObject = NULL; + Script::gEvalState.setLocalVectorVariable(reg, stack[_STK].getVector()); + break; + case OP_SETCUROBJECT: // Save the previous object for parsing vector fields. prevObject = curObject; @@ -2238,6 +2488,34 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi break; } + case OP_CREATE_VECTOR: + { + U32 count = code[ip++]; + + stack[_STK + 1].setVector(std::make_shared>()); + stack[_STK + 1].getVector()->reserve(count); + _STK++; + break; + } + + case OP_VECTOR_PUSH: + { + // Vector must be at _STK + ConsoleValue elem = stack[_STK+1]; + + if (!stack[_STK].getVector()) + { + Con::printf("ERROR: OP_VECTOR_PUSH vector is null at _STK=%d", _STK); + break; + } + + stack[_STK].getVector()->push_back(elem); + if (elem.getType() == cvVector) + elem.getVector().reset(); + + break; + } + case OP_INVALID: TORQUE_CASE_FALLTHROUGH; default: diff --git a/Engine/source/console/torquescript/compiler.cpp b/Engine/source/console/torquescript/compiler.cpp index 890f47e98c..2ba78ba204 100644 --- a/Engine/source/console/torquescript/compiler.cpp +++ b/Engine/source/console/torquescript/compiler.cpp @@ -173,7 +173,7 @@ S32 FuncVars::assign(StringTableEntry var, TypeReq currentType, S32 lineNumber, return id; } -S32 FuncVars::lookup(StringTableEntry var, S32 lineNumber) +S32 FuncVars::lookup(StringTableEntry var, S32 lineNumber, TypeReq defaultType) { std::unordered_map::iterator found = vars.find(var); @@ -182,12 +182,23 @@ S32 FuncVars::lookup(StringTableEntry var, S32 lineNumber) const char* str = avar("Script Warning: Variable %s referenced before used when compiling script. File: %s Line: %d", var, CodeBlock::smCurrentParser->getCurrentFile(), lineNumber); scriptErrorHandler(str); - return assign(var, TypeReqString, lineNumber, false); + return assign(var, defaultType, lineNumber, false); } return found->second.reg; } +bool FuncVars::find(StringTableEntry var) +{ + std::unordered_map::iterator found = vars.find(var); + if (found == vars.end()) + { + return false; + } + + return true; +} + TypeReq FuncVars::lookupType(StringTableEntry var, S32 lineNumber) { std::unordered_map::iterator found = vars.find(var); diff --git a/Engine/source/console/torquescript/compiler.h b/Engine/source/console/torquescript/compiler.h index 74737c7730..ea3a4615b9 100644 --- a/Engine/source/console/torquescript/compiler.h +++ b/Engine/source/console/torquescript/compiler.h @@ -105,22 +105,32 @@ namespace Compiler OP_SETCURVAR_CREATE, OP_SETCURVAR_ARRAY, OP_SETCURVAR_ARRAY_CREATE, + OP_SETCURVAR_VECTOR_MEMBER, + OP_SETCURVAR_VECTOR_MEMBER_GLOBAL, + OP_SETCURVAR_VECTOR_MEMBER_LOCAL, OP_LOADVAR_UINT,// 40 OP_LOADVAR_FLT, OP_LOADVAR_STR, + OP_LOADVAR_VECTOR, + OP_LOADVAR_VECTOR_MEMBER, + OP_LOADVAR_VECTOR_MEMBER_GLOBAL, + OP_LOADVAR_VECTOR_MEMBER_LOCAL, OP_SAVEVAR_UINT, OP_SAVEVAR_FLT, OP_SAVEVAR_STR, + OP_SAVEVAR_VECTOR, OP_LOAD_LOCAL_VAR_UINT, OP_LOAD_LOCAL_VAR_FLT, OP_LOAD_LOCAL_VAR_STR, + OP_LOAD_LOCAL_VAR_VECTOR, OP_SAVE_LOCAL_VAR_UINT, OP_SAVE_LOCAL_VAR_FLT, OP_SAVE_LOCAL_VAR_STR, + OP_SAVE_LOCAL_VAR_VECTOR, OP_SETCUROBJECT, OP_SETCUROBJECT_NEW, @@ -166,6 +176,9 @@ namespace Compiler OP_ITER, ///< Enter foreach loop. OP_ITER_END, ///< End foreach loop. + OP_CREATE_VECTOR, + OP_VECTOR_PUSH, + OP_INVALID, // 90 MAX_OP_CODELEN ///< The amount of op codes. @@ -297,7 +310,9 @@ class FuncVars public: S32 assign(StringTableEntry var, TypeReq currentType, S32 lineNumber, bool isConstant = false); - S32 lookup(StringTableEntry var, S32 lineNumber); + S32 lookup(StringTableEntry var, S32 lineNumber, TypeReq defaultType = TypeReqString); + + bool find(StringTableEntry var); TypeReq lookupType(StringTableEntry var, S32 lineNumber); diff --git a/Engine/source/console/torquescript/evalState.h b/Engine/source/console/torquescript/evalState.h index 05c3be3351..54a1fcd6a4 100644 --- a/Engine/source/console/torquescript/evalState.h +++ b/Engine/source/console/torquescript/evalState.h @@ -42,9 +42,11 @@ class ExprEvalState S32 getIntVariable(); F64 getFloatVariable(); const char *getStringVariable(); + std::shared_ptr> getVectorVariable(); void setIntVariable(S32 val); void setFloatVariable(F64 val); void setStringVariable(const char *str); + void setVectorVariable(std::shared_ptr> val); TORQUE_FORCEINLINE S32 getLocalIntVariable(S32 reg) { @@ -61,6 +63,11 @@ class ExprEvalState return currentRegisterArray->values[reg].getString(); } + TORQUE_FORCEINLINE std::shared_ptr> getLocalVectorVariable(S32 reg) + { + return currentRegisterArray->values[reg].getVector(); + } + TORQUE_FORCEINLINE void setLocalIntVariable(S32 reg, S64 val) { currentRegisterArray->values[reg].setInt(val); @@ -81,6 +88,11 @@ class ExprEvalState currentRegisterArray->values[reg].setStringTableEntry(val); } + TORQUE_FORCEINLINE void setLocalVectorVariable(S32 reg, std::shared_ptr> val) + { + currentRegisterArray->values[reg].setVector(val); + } + TORQUE_FORCEINLINE void moveConsoleValue(S32 reg, ConsoleValue val) { currentRegisterArray->values[reg] = (val); diff --git a/Engine/source/testing/ScriptTest.cpp b/Engine/source/testing/ScriptTest.cpp index 08212938e0..d36045a796 100644 --- a/Engine/source/testing/ScriptTest.cpp +++ b/Engine/source/testing/ScriptTest.cpp @@ -269,6 +269,197 @@ TEST_F(ScriptTest, Basic_Function_Call_And_Local_Variable_Testing) ASSERT_EQ(staticCall.getInt(), 3); } +TEST_F(ScriptTest, VectorTests) +{ + ConsoleValue vecTest = RunScript(R"( + $pref::SFX::channelVolume[1] = 1; + $pref::SFX::channelVolume[2] = 1; + $pref::SFX::channelVolume[3] = 1; + $pref::SFX::channelVolume[4] = 1; + $pref::SFX::channelVolume[5] = 1; + $pref::SFX::channelVolume[6] = 1; + $pref::SFX::channelVolume[7] = 1; + $pref::SFX::channelVolume[8] = 1; + + function setChannel(%channel, %volume){ + $channelVol[%channel] = %volume; + } + + function doTest(){ + for( %channel = 0; %channel <= 8; %channel ++ ) + setChannel(%channel, $pref::SFX::channelVolume[ %channel ] ); + } + + doTest(); + + return $channelVol[1]; + )"); + ASSERT_EQ(vecTest.getInt(), 1); + + vecTest = RunScript(R"( + function doTest(){ + %arr = [1,2,3,4]; + return %arr[1]; + } + return doTest(); + )"); + ASSERT_EQ(vecTest.getInt(), 2); + + vecTest = RunScript(R"( + function test2(){ + for ( %i = 0; %i < 7; %i++ ) + %val[%i] = %i; + + return %val[1]; + } + return test2(); + )"); + ASSERT_EQ(vecTest.getInt(), 1); + + vecTest = RunScript(R"( + function doTest(){ + for ( %i = 0; %i < 7; %i++ ) + $val[%i] = %i; + + return $val[1]; + } + + return doTest(); + )"); + + ASSERT_EQ(vecTest.getInt(), 1); + + vecTest = RunScript(R"( + $arr = [[1,2,3],[4,5,6]]; + return $arr[1][1]; + )"); + ASSERT_EQ(vecTest.getInt(), 5); + + vecTest = RunScript(R"( + function doTest(){ + %vec1 = [1,2,3]; + %vec2 = [4,5,6]; + %vec3 = [7,8,9]; + %vecCombine = [%vec1,%vec2,%vec3]; + + return %vecCombine[2][1]; + } + return doTest(); + )"); + + ASSERT_EQ(vecTest.getInt(), 8); + + vecTest = RunScript(R"( + $count = 0; + function addToVector(%inWord){ + $wordList[$count] = %inWord; + $count++; + } + addToVector("test1"); + addToVector("test2"); + addToVector("test3"); + + return $wordList; + )"); + + ASSERT_STRCASEEQ(vecTest.getString(), "test1 test2 test3"); + + vecTest = RunScript(R"( + $count = 0; + function buildVector(){ + %wordList[$count] = "test1"; + %wordList[$count++] = "test2"; + %wordList[$count++] = "test3"; + return %wordList; + } + + return buildVector(); + )"); + + ASSERT_STRCASEEQ(vecTest.getString(), "test1 test2 test3"); + + vecTest = RunScript(R"( + function doTest(){ + %vec1 = [1,2,3]; + + return %vec1[0]++; + } + return doTest(); + )"); + + ASSERT_EQ(vecTest.getInt(), 2); + + vecTest = RunScript(R"( + function doTest(){ + $vec1 = [1,2,3]; + + return $vec1[0]++; + } + return doTest(); + )"); + + ASSERT_EQ(vecTest.getInt(), 2); + + vecTest = RunScript(R"( + function doTestAdd(%size){ + for ( %i = 0; %i < %size; %i++ ) + %val[%i] = %i; + + return %val; + } + + function doTest(){ + %bar = [[doTestAdd(3)], [doTestAdd(3)], [doTestAdd(3)]]; + return %bar; + } + + return doTest(); + )"); + ASSERT_STRCASEEQ(vecTest.getString(), "0 1 2 0 1 2 0 1 2"); + + vecTest = RunScript(R"( + $vecSize = 0; + function doTestAdd(%size){ + $val = ""; + $vecSize = $vecSize + %size; + for ( %i = 0; %i < $vecSize; %i++ ) + $val[%i] = %i; + + return $val; + } + + function doTest(){ + %bar = [[doTestAdd(3)], [doTestAdd(3)], [doTestAdd(3)]]; + return %bar; + } + + return doTest(); + )"); + ASSERT_STRCASEEQ(vecTest.getString(), "0 1 2 0 1 2 3 4 5 0 1 2 3 4 5 6 7 8"); + + vecTest = RunScript(R"( + $val = ""; + function doTestAdd(%size){ + %stryng = "$val = [0"; + for (%i=1; %i<%size; %i++) + { + %stryng = %stryng @","@ %i; + } + %stryng = %stryng @"];"; + eval(%stryng); + return $val; + } + + function doTest(){ + %bar = [doTestAdd(3), doTestAdd(3), doTestAdd(3)]; + return %bar; + } + + return doTest(); + )"); + ASSERT_STRCASEEQ(vecTest.getString(), "0 1 2 0 1 2 0 1 2"); +} + TEST_F(ScriptTest, Basic_Conditional_Statements) { ConsoleValue value = RunScript(R"( @@ -896,6 +1087,18 @@ TEST_F(ScriptTest, Sugar_Syntax) ASSERT_EQ(valueSetArray.getInt(), 5); + ConsoleValue valueSetArrayGlobal = RunScript(R"( + function a() + { + $vector[0] = "1 2 3"; + $vector[0].z = 5; + return $vector[0].z; + } + return a(); + )"); + + ASSERT_EQ(valueSetArrayGlobal.getInt(), 5); + ConsoleValue valueStoreCalculated = RunScript(R"( function a() { diff --git a/Templates/BaseGame/game/tools/main.tscript b/Templates/BaseGame/game/tools/main.tscript index bddff7addd..7043f50f75 100644 --- a/Templates/BaseGame/game/tools/main.tscript +++ b/Templates/BaseGame/game/tools/main.tscript @@ -98,8 +98,8 @@ function onStart() $ignoredDatablockSet = new SimSet(); // fill the list of editors - $editors[count] = getWordCount( $Tools::loadFirst ); - for ( %i = 0; %i < $editors[count]; %i++ ) + $editorsCount = getWordCount( $Tools::loadFirst ); + for ( %i = 0; %i < $editorsCount; %i++ ) { $editors[%i] = getWord( $Tools::loadFirst, %i ); } @@ -123,8 +123,8 @@ function onStart() // Yes, this sucks and should be done better if ( strstr( $Tools::loadFirst, %editor ) == -1 ) { - $editors[$editors[count]] = %editor; - $editors[count]++; + $editors[$editorsCount] = %editor; + $editorsCount++; } } } @@ -151,9 +151,9 @@ function onStart() // Yes, this sucks and should be done better if ( strstr( $Tools::loadFirst, %editor ) == -1 ) { - $editors[$editors[count]] = %editor; - $editorsPath[$editors[count]] = %folder; - $editors[count]++; + $editors[$editorsCount] = %editor; + $editorsPath[$editorsCount] = %folder; + $editorsCount++; } } } @@ -162,7 +162,7 @@ function onStart() // initialize every editor new SimSet( EditorPluginSet ); - %count = $editors[count]; + %count = $editorsCount; for ( %i = 0; %i < %count; %i++ ) { %editorFilename = "./" @ $editors[%i] @ "/main." @ $TorqueScriptFileExtension; @@ -261,8 +261,7 @@ function onExit() // Save any Layouts we might be using //GuiFormManager::SaveLayout(LevelBuilder, Default, User); - - %count = $editors[count]; + %count = $editorsCount; for (%i = 0; %i < %count; %i++) { %destroyFunction = "destroy" @ $editors[%i];