diff --git a/engines/director/lingo/lingo-ast.h b/engines/director/lingo/lingo-ast.h index 3a0411ff925..c5546a2d0f4 100644 --- a/engines/director/lingo/lingo-ast.h +++ b/engines/director/lingo/lingo-ast.h @@ -35,6 +35,10 @@ struct PropertyNode; struct InstanceNode; struct IfStmtNode; struct IfElseStmtNode; +struct RepeatWhileNode; +struct RepeatWithToNode; +struct NextRepeatNode; +struct ExitRepeatNode; struct IntNode; struct FloatNode; struct SymbolNode; @@ -68,6 +72,10 @@ enum NodeType { kInstanceNode, kIfStmtNode, kIfElseStmtNode, + kRepeatWhileNode, + kRepeatWithToNode, + kNextRepeatNode, + kExitRepeatNode, kIntNode, kFloatNode, kSymbolNode, @@ -95,6 +103,10 @@ public: virtual void visitInstanceNode(InstanceNode *node) = 0; virtual void visitIfStmtNode(IfStmtNode *node) = 0; virtual void visitIfElseStmtNode(IfElseStmtNode *node) = 0; + virtual void visitRepeatWhileNode(RepeatWhileNode *node) = 0; + virtual void visitRepeatWithToNode(RepeatWithToNode *node) = 0; + virtual void visitNextRepeatNode(NextRepeatNode *node) = 0; + virtual void visitExitRepeatNode(ExitRepeatNode *node) = 0; virtual void visitIntNode(IntNode *node) = 0; virtual void visitFloatNode(FloatNode *node) = 0; virtual void visitSymbolNode(SymbolNode *node) = 0; @@ -112,8 +124,9 @@ struct Node { NodeType type; bool isExpression; bool isStatement; + bool isLoop; - Node(NodeType t) : type(t), isExpression(false), isStatement(false) {} + Node(NodeType t) : type(t), isExpression(false), isStatement(false), isLoop(false) {} virtual ~Node() {} virtual void accept(NodeVisitor *visitor) = 0; }; @@ -136,6 +149,18 @@ struct StmtNode : Node { virtual ~StmtNode() {} }; +/* LoopNode */ + +struct LoopNode : StmtNode { + Common::Array nextRepeats; + Common::Array exitRepeats; + + LoopNode(NodeType t) : StmtNode(t) { + isLoop = true; + } + virtual ~LoopNode() {} +}; + /* ScriptNode */ struct ScriptNode : Node { @@ -281,6 +306,65 @@ struct IfElseStmtNode : StmtNode { } }; +/* RepeatWhileNode */ + +struct RepeatWhileNode : LoopNode { + Node *cond; + NodeList *stmts; + + RepeatWhileNode(Node *condIn, NodeList *stmtsIn) + : LoopNode(kRepeatWhileNode), cond(condIn), stmts(stmtsIn) {} + virtual ~RepeatWhileNode() { + delete cond; + deleteList(stmts); + } + virtual void accept(NodeVisitor *visitor) { + visitor->visitRepeatWhileNode(this); + } +}; + +/* RepeatWithToNode */ + +struct RepeatWithToNode : LoopNode { + Common::String *var; + Node *start; + bool down; + Node *end; + NodeList *stmts; + + RepeatWithToNode(Common::String *varIn, Node *startIn, bool downIn, Node *endIn, NodeList *stmtsIn) + : LoopNode(kRepeatWithToNode), var(varIn), start(startIn), down(downIn), end(endIn), stmts(stmtsIn) {} + virtual ~RepeatWithToNode() { + delete var; + delete start; + delete end; + deleteList(stmts); + } + virtual void accept(NodeVisitor *visitor) { + visitor->visitRepeatWithToNode(this); + } +}; + +/* NextRepeatNode */ + +struct NextRepeatNode : StmtNode { + NextRepeatNode() : StmtNode(kNextRepeatNode) {} + virtual ~NextRepeatNode() {} + virtual void accept(NodeVisitor *visitor) { + visitor->visitNextRepeatNode(this); + } +}; + +/* ExitRepeatNode */ + +struct ExitRepeatNode : StmtNode { + ExitRepeatNode() : StmtNode(kExitRepeatNode) {} + virtual ~ExitRepeatNode() {} + virtual void accept(NodeVisitor *visitor) { + visitor->visitExitRepeatNode(this); + } +}; + /* IntNode */ struct IntNode : ExprNode { diff --git a/engines/director/lingo/lingo-codegen.cpp b/engines/director/lingo/lingo-codegen.cpp index 6a946bb8525..3a178b3cdd0 100644 --- a/engines/director/lingo/lingo-codegen.cpp +++ b/engines/director/lingo/lingo-codegen.cpp @@ -66,6 +66,7 @@ LingoCompiler::LingoCompiler() { _lines[0] = _lines[1] = _lines[2] = nullptr; _inFactory = false; + _currentLoop = nullptr; _hadError = false; } @@ -251,6 +252,15 @@ int LingoCompiler::codeFunc(Common::String *s, int numpar) { return ret; } +VarType LingoCompiler::globalCheck() { + // If in a definition, assume variables are local unless + // they were declared global with `global varname` + if (_indef) { + return kVarLocal; + } + return kVarGlobal; +} + void LingoCompiler::registerMethodVar(const Common::String &name, VarType type) { if (!_methodVars->contains(name)) { (*_methodVars)[name] = type; @@ -274,6 +284,24 @@ void LingoCompiler::registerFactory(Common::String &name) { } } +void LingoCompiler::updateLoopJumps(uint nextTargetPos, uint exitTargetPos) { + if (!_currentLoop) + return; + + for (uint i = 0; i < _currentLoop->nextRepeats.size(); i++) { + uint nextRepeatPos = _currentLoop->nextRepeats[i]; + inst jmpOffset = 0; + WRITE_UINT32(&jmpOffset, nextTargetPos - nextRepeatPos); + (*_currentAssembly)[nextRepeatPos + 1] = jmpOffset; + } + for (uint i = 0; i < _currentLoop->exitRepeats.size(); i++) { + uint exitRepeatPos = _currentLoop->exitRepeats[i]; + inst jmpOffset = 0; + WRITE_UINT32(&jmpOffset, exitTargetPos - exitRepeatPos); + (*_currentAssembly)[exitRepeatPos + 1] = jmpOffset; + } +} + void LingoCompiler::parseMenu(const char *code) { warning("STUB: parseMenu"); } @@ -433,6 +461,112 @@ void LingoCompiler::visitIfElseStmtNode(IfElseStmtNode *node) { (*_currentAssembly)[jmpPos + 1] = jmpOffset; } +/* RepeatWhileNode */ + +void LingoCompiler::visitRepeatWhileNode(RepeatWhileNode *node) { + LoopNode *prevLoop = _currentLoop; + _currentLoop = node; + + uint startPos = _currentAssembly->size(); + compile(node->cond); + uint jzPos = _currentAssembly->size(); + code2(LC::c_jumpifz, 0); + compileList(node->stmts); + uint jmpPos = _currentAssembly->size(); + code2(LC::c_jump, 0); + uint endPos = _currentAssembly->size(); + + inst jzOffset = 0; + WRITE_UINT32(&jzOffset, endPos - jzPos); + (*_currentAssembly)[jzPos + 1] = jzOffset; + + inst jmpOffset = 0; + WRITE_UINT32(&jmpOffset, startPos - jmpPos); + (*_currentAssembly)[jmpPos + 1] = jmpOffset; + + updateLoopJumps(jmpPos, endPos); + _currentLoop = prevLoop; +} + +/* RepeatWithToNode */ + +void LingoCompiler::visitRepeatWithToNode(RepeatWithToNode *node) { + LoopNode *prevLoop = _currentLoop; + _currentLoop = node; + + registerMethodVar(*node->var, globalCheck()); + + compile(node->start); + code1(LC::c_varpush); + codeString(node->var->c_str()); + code1(LC::c_assign); + + uint startPos = _currentAssembly->size(); + code1(LC::c_eval); + codeString(node->var->c_str()); + compile(node->end); + if (node->down) { + code1(LC::c_ge); + } else { + code1(LC::c_le); + } + uint jzPos = _currentAssembly->size(); + code2(LC::c_jumpifz, 0); + + compileList(node->stmts); + + uint incrementPos = _currentAssembly->size(); + code1(LC::c_eval); + codeString(node->var->c_str()); + code1(LC::c_intpush); + codeInt(1); + if (node->down) { + code1(LC::c_sub); + } else { + code1(LC::c_add); + } + code1(LC::c_varpush); + codeString(node->var->c_str()); + code1(LC::c_assign); + + uint jmpPos = _currentAssembly->size(); + code2(LC::c_jump, 0); + uint endPos = _currentAssembly->size(); + + inst jzOffset = 0; + WRITE_UINT32(&jzOffset, endPos - jzPos); + (*_currentAssembly)[jzPos + 1] = jzOffset; + + inst jmpOffset = 0; + WRITE_UINT32(&jmpOffset, startPos - jmpPos); + (*_currentAssembly)[jmpPos + 1] = jmpOffset; + + updateLoopJumps(incrementPos, endPos); + _currentLoop = prevLoop; +} + +/* NextRepeatNode */ + +void LingoCompiler::visitNextRepeatNode(NextRepeatNode *node) { + if (_currentLoop) { + _currentLoop->nextRepeats.push_back(_currentAssembly->size()); + code2(LC::c_jump, 0); + } else { + warning("# LINGO: next repeat not inside repeat loop"); + } +} + +/* ExitRepeatNode */ + +void LingoCompiler::visitExitRepeatNode(ExitRepeatNode *node) { + if (_currentLoop) { + _currentLoop->exitRepeats.push_back(_currentAssembly->size()); + code2(LC::c_jump, 0); + } else { + warning("# LINGO: exit repeat not inside repeat loop"); + } +} + /* IntNode */ void LingoCompiler::visitIntNode(IntNode *node) { diff --git a/engines/director/lingo/lingo-codegen.h b/engines/director/lingo/lingo-codegen.h index 9d2b9425b9f..5f705601201 100644 --- a/engines/director/lingo/lingo-codegen.h +++ b/engines/director/lingo/lingo-codegen.h @@ -48,7 +48,9 @@ public: int codeInt(int val); int codeString(const char *s); void registerFactory(Common::String &s); + VarType globalCheck(); void registerMethodVar(const Common::String &name, VarType type); + void updateLoopJumps(uint nextTargetPos, uint exitTargetPos); LingoArchive *_assemblyArchive; ScriptContext *_assemblyContext; @@ -60,6 +62,7 @@ public: uint _bytenumber; const char *_lines[3]; bool _inFactory; + LoopNode *_currentLoop; Common::HashMap *_methodVars; Common::HashMap *_methodVarsStash; @@ -79,6 +82,10 @@ public: virtual void visitInstanceNode(InstanceNode *node); virtual void visitIfStmtNode(IfStmtNode *node); virtual void visitIfElseStmtNode(IfElseStmtNode *node); + virtual void visitRepeatWhileNode(RepeatWhileNode *node); + virtual void visitRepeatWithToNode(RepeatWithToNode *node); + virtual void visitNextRepeatNode(NextRepeatNode *node); + virtual void visitExitRepeatNode(ExitRepeatNode *node); virtual void visitIntNode(IntNode *node); virtual void visitFloatNode(FloatNode *node); virtual void visitSymbolNode(SymbolNode *node); diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp index e0b8a3da495..ee6f7077ddb 100644 --- a/engines/director/lingo/lingo-gr.cpp +++ b/engines/director/lingo/lingo-gr.cpp @@ -263,14 +263,15 @@ enum yysymbol_kind_t YYSYMBOL_definevars = 108, /* definevars */ YYSYMBOL_ifstmt = 109, /* ifstmt */ YYSYMBOL_ifelsestmt = 110, /* ifelsestmt */ - YYSYMBOL_stmtlist = 111, /* stmtlist */ - YYSYMBOL_nonemptystmtlist = 112, /* nonemptystmtlist */ - YYSYMBOL_stmtlistline = 113, /* stmtlistline */ - YYSYMBOL_simpleexprnoparens = 114, /* simpleexprnoparens */ - YYSYMBOL_simpleexpr = 115, /* simpleexpr */ - YYSYMBOL_expr = 116, /* expr */ - YYSYMBOL_exprlist = 117, /* exprlist */ - YYSYMBOL_nonemptyexprlist = 118 /* nonemptyexprlist */ + YYSYMBOL_loop = 111, /* loop */ + YYSYMBOL_stmtlist = 112, /* stmtlist */ + YYSYMBOL_nonemptystmtlist = 113, /* nonemptystmtlist */ + YYSYMBOL_stmtlistline = 114, /* stmtlistline */ + YYSYMBOL_simpleexprnoparens = 115, /* simpleexprnoparens */ + YYSYMBOL_simpleexpr = 116, /* simpleexpr */ + YYSYMBOL_expr = 117, /* expr */ + YYSYMBOL_exprlist = 118, /* exprlist */ + YYSYMBOL_nonemptyexprlist = 119 /* nonemptyexprlist */ }; typedef enum yysymbol_kind_t yysymbol_kind_t; @@ -590,18 +591,18 @@ union yyalloc #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ -#define YYFINAL 81 +#define YYFINAL 89 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 1016 +#define YYLAST 1362 /* YYNTOKENS -- Number of terminals. */ #define YYNTOKENS 90 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 29 +#define YYNNTS 30 /* YYNRULES -- Number of rules. */ -#define YYNRULES 121 +#define YYNRULES 127 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 189 +#define YYNSTATES 218 /* YYMAXUTOK -- Last valid token kind. */ #define YYMAXUTOK 332 @@ -664,13 +665,13 @@ static const yytype_int16 yyrline[] = 290, 293, 295, 298, 300, 301, 302, 303, 306, 307, 308, 309, 310, 312, 313, 314, 315, 316, 318, 319, 320, 321, 322, 323, 325, 326, 327, 328, 329, 330, - 331, 332, 333, 336, 337, 340, 344, 351, 352, 353, - 356, 357, 360, 361, 364, 365, 366, 369, 373, 377, - 383, 387, 391, 395, 396, 400, 406, 413, 414, 419, - 420, 421, 422, 423, 424, 425, 426, 427, 430, 431, - 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, - 444, 445, 446, 447, 448, 449, 450, 451, 454, 455, - 458, 462 + 331, 332, 333, 336, 337, 340, 344, 354, 355, 356, + 357, 360, 361, 364, 365, 366, 367, 370, 371, 372, + 375, 379, 383, 389, 393, 397, 401, 403, 405, 409, + 410, 414, 420, 427, 428, 433, 434, 435, 436, 437, + 438, 439, 440, 441, 444, 445, 448, 449, 450, 451, + 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 468, 469, 472, 476 }; #endif @@ -704,8 +705,8 @@ yysymbol_name (yysymbol_kind_t yysymbol) "scriptpart", "macro", "factory", "method", "methodlist", "nonemptymethodlist", "methodlistline", "handler", "endargdef", "ID", "idlist", "nonemptyidlist", "stmt", "stmtoneliner", "proc", "definevars", - "ifstmt", "ifelsestmt", "stmtlist", "nonemptystmtlist", "stmtlistline", - "simpleexprnoparens", "simpleexpr", "expr", "exprlist", + "ifstmt", "ifelsestmt", "loop", "stmtlist", "nonemptystmtlist", + "stmtlistline", "simpleexprnoparens", "simpleexpr", "expr", "exprlist", "nonemptyexprlist", YY_NULLPTR }; return yy_sname[yysymbol]; @@ -729,7 +730,7 @@ static const yytype_int16 yytoknum[] = }; #endif -#define YYPACT_NINF (-91) +#define YYPACT_NINF (-158) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) @@ -743,25 +744,28 @@ static const yytype_int16 yytoknum[] = STATE-NUM. */ static const yytype_int16 yypact[] = { - 313, -91, -91, -91, -91, -91, -91, -91, -91, 863, - 173, -91, -91, 863, -91, -91, -91, -91, -91, -91, - -91, -91, -91, -91, -91, 863, -91, -91, 863, -91, - -91, -91, -91, -91, -91, -91, -91, -91, -91, -91, - -91, -91, -91, -91, 863, 863, -91, -91, 4, 313, - -91, -91, -91, -91, 243, -91, -91, -91, -91, -91, - -91, -91, -76, -66, -91, -91, -91, -91, 173, 173, - 173, 173, -73, -91, -91, -21, 863, -64, -63, -60, - 863, -91, -91, 173, 897, -59, -52, -91, 863, -91, - -91, -91, 884, 173, 621, 173, 173, 173, 173, 173, - 173, 173, 173, 173, 173, 173, 173, 173, 173, 173, - 173, 173, -44, -72, -91, -91, -40, 884, -65, -91, - 173, -91, -91, -42, 682, 24, 38, 38, 38, 38, - 932, 932, -91, -14, 38, 38, 38, 38, -14, -46, - -46, -91, -91, 682, 863, -91, -91, -36, -91, -91, - 682, -34, 897, -91, -91, -91, 374, -91, -91, 743, - 682, 863, -72, 436, -91, 804, -33, -91, 682, -91, - -30, -91, 863, 682, -91, -91, 497, 682, -69, -91, - 559, -22, 682, -91, 863, -15, -91, -91, -91 + 346, -158, -158, -158, -158, -158, -158, -158, -35, 1086, + 206, -158, -158, 1086, -158, -32, -158, -158, -158, -18, + -158, -158, -158, -158, -158, 1086, -158, -158, 1086, -158, + -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, + -158, -158, -158, -158, 1086, 1086, -158, -158, 12, 346, + -158, -158, -158, -158, 276, -158, -158, -158, -158, -158, + -158, -158, -158, -158, -158, -158, -158, -76, -68, -158, + -158, -158, -158, 206, 206, 206, 206, -67, -158, -158, + 1130, 1086, -158, 1086, 206, -44, -40, -38, 1086, -158, + -158, 206, 1265, -34, -37, -158, 1086, -158, -158, -158, + 1165, 206, 844, 206, 206, 206, 206, 206, 206, 206, + 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, + -29, 6, 1178, -72, -158, -158, -25, 1165, -24, -158, + 206, -158, -158, -21, 905, 36, 10, 10, 10, 10, + 1278, 1278, -158, -49, 10, 10, 10, 10, -49, -54, + -54, -158, -158, 905, 206, 905, 1086, -158, -158, -23, + -158, -158, 905, -22, 1265, -158, -158, -158, 407, -158, + -158, 966, 905, 1115, 469, 1086, -72, 537, -158, 1027, + -17, -158, 905, -158, 29, 206, -13, -12, -158, 1086, + 905, -158, -158, 598, 206, 1215, -158, 905, -46, -158, + 660, -11, 1228, 905, 905, -158, 1086, -10, -158, 905, + 722, -158, -158, 783, -9, -7, -158, -158 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -774,36 +778,39 @@ static const yytype_int8 yydefact[] = 51, 54, 57, 60, 58, 0, 43, 45, 63, 26, 44, 41, 38, 25, 27, 52, 29, 36, 37, 62, 56, 34, 61, 53, 63, 0, 55, 5, 0, 2, - 3, 6, 7, 8, 118, 9, 67, 70, 71, 68, - 69, 65, 0, 64, 89, 90, 92, 91, 41, 0, - 0, 0, 97, 98, 100, 0, 63, 0, 0, 0, - 63, 1, 4, 118, 120, 0, 119, 74, 0, 95, - 93, 94, 0, 118, 0, 0, 0, 0, 0, 0, + 3, 6, 7, 8, 124, 9, 67, 71, 72, 68, + 69, 70, 76, 31, 40, 49, 65, 0, 64, 95, + 96, 98, 97, 41, 0, 0, 0, 103, 104, 106, + 0, 63, 75, 0, 0, 0, 0, 0, 63, 1, + 4, 124, 126, 0, 125, 77, 0, 101, 99, 100, + 0, 124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 13, 76, 75, 0, 120, 0, 73, - 0, 66, 99, 0, 83, 77, 110, 111, 108, 109, - 112, 113, 105, 115, 116, 117, 107, 106, 114, 101, - 102, 103, 104, 83, 0, 17, 18, 11, 14, 15, - 83, 0, 121, 96, 87, 88, 0, 84, 85, 0, - 10, 63, 0, 20, 72, 0, 0, 86, 83, 79, - 0, 16, 21, 83, 81, 78, 0, 83, 0, 22, - 0, 0, 12, 19, 0, 0, 80, 23, 82 + 0, 0, 0, 13, 79, 78, 0, 126, 0, 74, + 0, 66, 105, 0, 89, 80, 116, 117, 114, 115, + 118, 119, 111, 121, 122, 123, 113, 112, 120, 107, + 108, 109, 110, 89, 0, 89, 0, 17, 18, 11, + 14, 15, 89, 0, 127, 102, 93, 94, 0, 90, + 91, 0, 10, 0, 0, 63, 0, 20, 73, 0, + 0, 92, 89, 82, 0, 0, 0, 0, 16, 21, + 89, 84, 81, 0, 0, 0, 86, 89, 0, 22, + 0, 0, 0, 89, 12, 19, 0, 0, 83, 89, + 0, 23, 85, 0, 0, 0, 87, 88 }; /* YYPGOTO[NTERM-NUM]. */ -static const yytype_int8 yypgoto[] = +static const yytype_int16 yypgoto[] = { - -91, -91, -91, 16, -91, -91, -91, -91, -91, -90, - -91, -91, 0, -25, -91, 5, -91, -91, -91, -91, - -91, -77, -91, -31, -91, -62, 6, -81, -91 + -158, -158, -158, 31, -158, -158, -158, -158, -158, -94, + -158, -158, 0, -26, -158, 5, -158, -158, -158, -158, + -158, -158, -131, -158, -157, -158, -36, 13, -85, -158 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_uint8 yydefgoto[] = { - 0, 48, 49, 50, 51, 52, 146, 147, 148, 149, - 53, 178, 72, 62, 63, 155, 56, 57, 58, 59, - 60, 156, 157, 158, 73, 74, 84, 85, 86 + 0, 48, 49, 50, 51, 52, 158, 159, 160, 161, + 53, 198, 77, 67, 68, 167, 56, 57, 58, 59, + 60, 61, 168, 169, 170, 78, 79, 92, 93, 94 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -811,165 +818,191 @@ static const yytype_uint8 yydefgoto[] = number is the opposite. If YYTABLE_NINF, syntax error. */ static const yytype_uint8 yytable[] = { - 54, 144, 118, 78, 81, 55, 89, 90, 91, 61, - 87, 101, 123, 76, 145, 93, 75, 183, 184, 79, - 94, 88, 113, 114, 151, 77, 115, 119, 61, 95, - 96, 97, 98, 99, 100, 120, 101, 110, 111, 102, - 103, 104, 143, 101, 61, 80, 150, 153, 159, 54, - 162, 112, 164, 175, 55, 116, 177, 105, 106, 107, - 108, 109, 110, 111, 186, 82, 160, 108, 109, 110, - 111, 188, 171, 163, 0, 0, 61, 92, 0, 0, - 61, 0, 0, 0, 0, 0, 0, 0, 121, 117, - 0, 176, 0, 0, 54, 101, 180, 0, 102, 125, - 182, 126, 127, 128, 129, 130, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 107, 108, - 109, 110, 111, 0, 54, 167, 152, 0, 0, 167, - 0, 0, 167, 0, 0, 0, 170, 0, 0, 0, - 0, 0, 0, 54, 161, 167, 0, 0, 0, 167, - 54, 167, 0, 0, 0, 0, 54, 0, 0, 54, - 54, 61, 0, 54, 169, 54, 0, 0, 54, 0, - 174, 0, 179, 54, 0, 0, 54, 54, 64, 0, - 54, 0, 54, 65, 187, 0, 1, 66, 67, 0, - 2, 0, 3, 4, 5, 6, 7, 0, 0, 8, - 0, 0, 0, 0, 11, 12, 0, 14, 15, 16, + 54, 156, 86, 109, 62, 55, 128, 82, 109, 66, + 95, 181, 89, 81, 157, 181, 133, 181, 87, 96, + 181, 101, 172, 80, 174, 85, 83, 84, 66, 118, + 119, 177, 116, 117, 118, 119, 181, 97, 98, 99, + 205, 206, 123, 181, 66, 88, 124, 181, 125, 54, + 130, 193, 129, 181, 55, 120, 181, 153, 154, 200, + 171, 162, 126, 176, 178, 163, 204, 109, 165, 192, + 110, 194, 210, 196, 197, 208, 212, 216, 213, 217, + 90, 66, 188, 121, 0, 0, 0, 0, 66, 100, + 115, 116, 117, 118, 119, 0, 131, 122, 0, 0, + 0, 0, 54, 0, 127, 0, 0, 135, 0, 0, + 0, 0, 0, 0, 0, 0, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 0, 54, 0, 0, 0, 0, 0, + 0, 0, 0, 164, 0, 0, 0, 0, 0, 187, + 0, 0, 0, 54, 0, 54, 175, 0, 0, 0, + 0, 0, 54, 0, 0, 0, 0, 173, 54, 0, + 0, 54, 54, 0, 54, 66, 183, 54, 0, 54, + 0, 0, 54, 0, 191, 0, 0, 0, 0, 199, + 54, 0, 0, 54, 0, 0, 0, 54, 195, 0, + 54, 0, 0, 54, 54, 0, 211, 202, 0, 54, + 54, 69, 0, 54, 0, 0, 70, 0, 0, 1, + 71, 72, 0, 2, 0, 3, 4, 5, 6, 7, + 0, 0, 63, 0, 0, 0, 0, 11, 12, 0, + 14, 64, 16, 17, 18, 65, 20, 0, 21, 22, + 23, 24, 0, 26, 27, 0, 0, 0, 0, 0, + 29, 30, 73, 32, 33, 34, 0, 0, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 0, 0, 0, + 0, 69, 0, 46, 0, 0, 70, 74, 75, 1, + 71, 72, 0, 2, 76, 3, 4, 5, 6, 7, + 0, 0, 63, 0, 0, 0, 0, 11, 12, 0, + 14, 64, 16, 17, 18, 65, 20, 0, 21, 22, + 23, 24, 0, 26, 27, 0, 0, 0, 0, 0, + 29, 30, 73, 32, 33, 34, 0, 0, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 0, 0, 0, + 0, 0, 0, 46, 0, 0, 0, 74, 75, 1, + 0, 0, 0, 2, 91, 3, 4, 5, 6, 7, + 0, 0, 8, 9, 0, 0, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, + 23, 24, 25, 26, 27, 28, 0, 0, 0, 0, + 29, 30, 31, 32, 33, 34, 0, 0, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 0, + 1, 0, 0, 46, 2, 0, 3, 4, 5, 6, + 7, 179, 47, 8, 9, 0, 0, 10, 11, 12, + 0, 14, 15, 16, 17, 18, 19, 20, 0, 21, + 22, 23, 24, 0, 26, 27, 28, 0, 0, 0, + 0, 29, 30, 31, 32, 33, 34, 0, 0, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 0, + 0, 180, 1, 0, 46, 0, 2, 0, 3, 4, + 5, 6, 7, 166, 0, 8, 9, 0, 0, 10, + 11, 12, 0, 14, 15, 16, 17, 18, 19, 20, + 0, 21, 22, 23, 24, 0, 26, 27, 28, 0, + 0, 0, 0, 29, 30, 31, 32, 33, 34, 0, + 0, 35, 36, 37, 38, 39, 40, 41, 42, 43, + 44, 0, 0, 0, 186, 0, 46, 0, 0, 0, + 1, 0, 0, 189, 2, 166, 3, 4, 5, 6, + 7, 0, 0, 8, 9, 0, 0, 10, 11, 12, + 0, 14, 15, 16, 17, 18, 19, 20, 0, 21, + 22, 23, 24, 0, 26, 27, 28, 0, 0, 0, + 0, 29, 30, 31, 32, 33, 34, 0, 0, 35, + 36, 37, 38, 39, 40, 41, 42, 43, 44, 0, + 0, 1, 0, 0, 46, 2, 0, 3, 4, 5, + 6, 7, 0, 166, 8, 9, 0, 0, 10, 11, + 12, 0, 14, 15, 16, 17, 18, 19, 20, 0, + 21, 22, 23, 24, 0, 26, 27, 28, 0, 0, + 0, 0, 29, 30, 31, 32, 33, 34, 0, 0, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 0, 0, 201, 1, 0, 46, 0, 2, 0, 3, + 4, 5, 6, 7, 166, 0, 8, 9, 0, 0, + 10, 11, 12, 0, 14, 15, 16, 17, 18, 19, + 20, 0, 21, 22, 23, 24, 0, 26, 27, 28, + 0, 0, 0, 0, 29, 30, 31, 32, 33, 34, + 0, 0, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 0, 0, 207, 1, 0, 46, 0, 2, + 0, 3, 4, 5, 6, 7, 166, 0, 8, 9, + 0, 0, 10, 11, 12, 0, 14, 15, 16, 17, + 18, 19, 20, 0, 21, 22, 23, 24, 0, 26, + 27, 28, 0, 0, 0, 0, 29, 30, 31, 32, + 33, 34, 0, 0, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 0, 0, 1, 214, 0, 46, + 2, 0, 3, 4, 5, 6, 7, 0, 166, 8, + 9, 0, 0, 10, 11, 12, 0, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 0, - 26, 27, 0, 0, 0, 0, 0, 29, 30, 68, - 32, 33, 34, 0, 0, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 0, 0, 0, 0, 64, 0, - 46, 0, 0, 65, 69, 70, 1, 66, 67, 0, - 2, 71, 3, 4, 5, 6, 7, 0, 0, 8, - 0, 0, 0, 0, 11, 12, 0, 14, 15, 16, - 17, 18, 19, 20, 0, 21, 22, 23, 24, 0, - 26, 27, 0, 0, 0, 0, 0, 29, 30, 68, - 32, 33, 34, 0, 0, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 0, 0, 0, 0, 0, 0, - 46, 0, 0, 0, 69, 70, 1, 0, 0, 0, - 2, 83, 3, 4, 5, 6, 7, 0, 0, 8, - 9, 0, 0, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 0, 21, 22, 23, 24, 25, 26, 27, 28, 0, 0, 0, 0, 29, 30, 31, 32, 33, 34, 0, 0, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 0, 1, 0, 0, - 46, 2, 0, 3, 4, 5, 6, 7, 165, 47, + 40, 41, 42, 43, 44, 0, 0, 1, 215, 0, + 46, 2, 0, 3, 4, 5, 6, 7, 0, 166, 8, 9, 0, 0, 10, 11, 12, 0, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 0, 26, 27, 28, 0, 0, 0, 0, 29, 30, 31, 32, 33, 34, 0, 0, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 0, 0, 166, 1, - 0, 46, 172, 2, 0, 3, 4, 5, 6, 7, - 154, 0, 8, 9, 0, 0, 10, 11, 12, 0, + 39, 40, 41, 42, 43, 44, 0, 0, 1, 0, + 0, 46, 2, 0, 3, 4, 5, 6, 7, 0, + 134, 8, 9, 0, 0, 10, 11, 12, 0, 14, + 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, + 24, 0, 26, 27, 28, 0, 0, 0, 0, 29, + 30, 31, 32, 33, 34, 0, 0, 35, 36, 37, + 38, 39, 40, 41, 42, 43, 44, 0, 0, 1, + 0, 0, 46, 2, 0, 3, 4, 5, 6, 7, + 0, 166, 8, 9, 0, 0, 10, 11, 12, 0, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 0, 26, 27, 28, 0, 0, 0, 0, 29, 30, 31, 32, 33, 34, 0, 0, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 0, 0, 1, 0, 0, 46, 2, 0, 3, 4, 5, 6, - 7, 0, 154, 8, 9, 0, 0, 10, 11, 12, + 7, 0, 182, 8, 9, 0, 0, 10, 11, 12, 0, 14, 15, 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, 0, 26, 27, 28, 0, 0, 0, 0, 29, 30, 31, 32, 33, 34, 0, 0, 35, - 36, 37, 38, 39, 40, 41, 42, 43, 44, 0, - 0, 181, 1, 0, 46, 0, 2, 0, 3, 4, - 5, 6, 7, 154, 0, 8, 9, 0, 0, 10, - 11, 12, 0, 14, 15, 16, 17, 18, 19, 20, - 0, 21, 22, 23, 24, 0, 26, 27, 28, 0, - 0, 0, 0, 29, 30, 31, 32, 33, 34, 0, - 0, 35, 36, 37, 38, 39, 40, 41, 42, 43, - 44, 0, 0, 185, 1, 0, 46, 0, 2, 0, - 3, 4, 5, 6, 7, 154, 0, 8, 9, 0, - 0, 10, 11, 12, 0, 14, 15, 16, 17, 18, - 19, 20, 0, 21, 22, 23, 24, 0, 26, 27, - 28, 0, 0, 0, 0, 29, 30, 31, 32, 33, - 34, 0, 0, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 0, 0, 1, 0, 0, 46, 2, - 0, 3, 4, 5, 6, 7, 0, 124, 8, 9, - 0, 0, 10, 11, 12, 0, 14, 15, 16, 17, - 18, 19, 20, 0, 21, 22, 23, 24, 0, 26, - 27, 28, 0, 0, 0, 0, 29, 30, 31, 32, - 33, 34, 0, 0, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 0, 0, 1, 0, 0, 46, - 2, 0, 3, 4, 5, 6, 7, 0, 154, 8, - 9, 0, 0, 10, 11, 12, 0, 14, 15, 16, - 17, 18, 19, 20, 0, 21, 22, 23, 24, 0, - 26, 27, 28, 0, 0, 0, 0, 29, 30, 31, - 32, 33, 34, 0, 0, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 0, 0, 1, 0, 0, - 46, 2, 0, 3, 4, 5, 6, 7, 0, 168, - 8, 9, 0, 0, 10, 11, 12, 0, 14, 15, - 16, 17, 18, 19, 20, 0, 21, 22, 23, 24, - 0, 26, 27, 28, 0, 0, 0, 0, 29, 30, - 31, 32, 33, 34, 0, 0, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 1, 0, 0, 0, - 2, 46, 3, 4, 5, 6, 7, 0, 0, 8, - 173, 0, 0, 0, 11, 12, 0, 14, 15, 16, - 17, 18, 19, 20, 0, 21, 22, 23, 24, 0, - 26, 27, 0, 0, 0, 0, 0, 29, 30, 31, - 32, 33, 34, 0, 0, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 95, 96, 97, 98, 99, 100, - 46, 101, 0, 0, 102, 103, 104, 95, 96, 97, - 98, 99, 100, 0, 101, 0, 0, 102, 103, 104, - 0, 0, 105, 106, 107, 108, 109, 110, 111, 0, - 0, 0, 0, 122, 0, 105, 106, 107, 108, 109, - 110, 111, 95, 96, 97, 98, 0, 0, 0, 101, - 0, 0, 102, 103, 104, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 105, 106, 107, 108, 109, 110, 111 + 36, 37, 38, 39, 40, 41, 42, 43, 44, 1, + 0, 0, 0, 2, 46, 3, 4, 5, 6, 7, + 0, 0, 63, 190, 0, 0, 0, 11, 12, 0, + 14, 64, 16, 17, 18, 65, 20, 0, 21, 22, + 23, 24, 0, 26, 27, 0, 0, 0, 184, 0, + 29, 30, 31, 32, 33, 34, 0, 0, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 185, 0, 0, + 0, 0, 0, 46, 0, 103, 104, 105, 106, 107, + 108, 102, 109, 0, 0, 110, 111, 112, 0, 0, + 103, 104, 105, 106, 107, 108, 0, 109, 0, 0, + 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 0, 0, 0, 0, 0, 0, 0, 0, 113, 114, + 115, 116, 117, 118, 119, 103, 104, 105, 106, 107, + 108, 0, 109, 0, 0, 110, 111, 112, 103, 104, + 105, 106, 107, 108, 0, 109, 0, 0, 110, 111, + 112, 0, 0, 113, 114, 115, 116, 117, 118, 119, + 0, 0, 0, 0, 132, 0, 113, 114, 115, 116, + 117, 118, 119, 0, 155, 103, 104, 105, 106, 107, + 108, 0, 109, 0, 0, 110, 111, 112, 103, 104, + 105, 106, 107, 108, 0, 109, 0, 0, 110, 111, + 112, 0, 0, 113, 114, 115, 116, 117, 118, 119, + 0, 203, 0, 0, 0, 0, 113, 114, 115, 116, + 117, 118, 119, 0, 209, 103, 104, 105, 106, 107, + 108, 0, 109, 0, 0, 110, 111, 112, 103, 104, + 105, 106, 0, 0, 0, 109, 0, 0, 110, 111, + 112, 0, 0, 113, 114, 115, 116, 117, 118, 119, + 0, 0, 0, 0, 0, 0, 113, 114, 115, 116, + 117, 118, 119 }; static const yytype_int16 yycheck[] = { - 0, 73, 83, 28, 0, 0, 68, 69, 70, 9, - 86, 57, 93, 13, 86, 88, 10, 86, 87, 44, - 41, 87, 86, 86, 89, 25, 86, 86, 28, 50, - 51, 52, 53, 54, 55, 87, 57, 83, 84, 60, - 61, 62, 86, 57, 44, 45, 86, 89, 24, 49, - 86, 76, 86, 86, 49, 80, 86, 78, 79, 80, - 81, 82, 83, 84, 86, 49, 143, 81, 82, 83, - 84, 86, 162, 150, -1, -1, 76, 71, -1, -1, - 80, -1, -1, -1, -1, -1, -1, -1, 88, 83, - -1, 168, -1, -1, 94, 57, 173, -1, 60, 94, - 177, 95, 96, 97, 98, 99, 100, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 110, 111, 80, 81, - 82, 83, 84, -1, 124, 156, 120, -1, -1, 160, - -1, -1, 163, -1, -1, -1, 161, -1, -1, -1, - -1, -1, -1, 143, 144, 176, -1, -1, -1, 180, - 150, 182, -1, -1, -1, -1, 156, -1, -1, 159, - 160, 161, -1, 163, 159, 165, -1, -1, 168, -1, - 165, -1, 172, 173, -1, -1, 176, 177, 5, -1, - 180, -1, 182, 10, 184, -1, 13, 14, 15, -1, - 17, -1, 19, 20, 21, 22, 23, -1, -1, 26, - -1, -1, -1, -1, 31, 32, -1, 34, 35, 36, - 37, 38, 39, 40, -1, 42, 43, 44, 45, -1, - 47, 48, -1, -1, -1, -1, -1, 54, 55, 56, - 57, 58, 59, -1, -1, 62, 63, 64, 65, 66, - 67, 68, 69, 70, -1, -1, -1, -1, 5, -1, - 77, -1, -1, 10, 81, 82, 13, 14, 15, -1, - 17, 88, 19, 20, 21, 22, 23, -1, -1, 26, - -1, -1, -1, -1, 31, 32, -1, 34, 35, 36, - 37, 38, 39, 40, -1, 42, 43, 44, 45, -1, - 47, 48, -1, -1, -1, -1, -1, 54, 55, 56, - 57, 58, 59, -1, -1, 62, 63, 64, 65, 66, - 67, 68, 69, 70, -1, -1, -1, -1, -1, -1, - 77, -1, -1, -1, 81, 82, 13, -1, -1, -1, - 17, 88, 19, 20, 21, 22, 23, -1, -1, 26, - 27, -1, -1, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, -1, 42, 43, 44, 45, 46, - 47, 48, 49, -1, -1, -1, -1, 54, 55, 56, - 57, 58, 59, -1, -1, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, -1, 13, -1, -1, - 77, 17, -1, 19, 20, 21, 22, 23, 24, 86, - 26, 27, -1, -1, 30, 31, 32, -1, 34, 35, - 36, 37, 38, 39, 40, -1, 42, 43, 44, 45, - -1, 47, 48, 49, -1, -1, -1, -1, 54, 55, - 56, 57, 58, 59, -1, -1, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, -1, -1, 74, 13, - -1, 77, 16, 17, -1, 19, 20, 21, 22, 23, - 86, -1, 26, 27, -1, -1, 30, 31, 32, -1, + 0, 73, 28, 57, 39, 0, 91, 39, 57, 9, + 86, 168, 0, 13, 86, 172, 101, 174, 44, 87, + 177, 88, 153, 10, 155, 25, 44, 45, 28, 83, + 84, 162, 81, 82, 83, 84, 193, 73, 74, 75, + 86, 87, 86, 200, 44, 45, 86, 204, 86, 49, + 87, 182, 86, 210, 49, 81, 213, 86, 52, 190, + 24, 86, 88, 86, 86, 89, 197, 57, 89, 86, + 60, 42, 203, 86, 86, 86, 86, 86, 209, 86, + 49, 81, 176, 83, -1, -1, -1, -1, 88, 76, + 80, 81, 82, 83, 84, -1, 96, 84, -1, -1, + -1, -1, 102, -1, 91, -1, -1, 102, -1, -1, + -1, -1, -1, -1, -1, -1, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, + 117, 118, 119, -1, 134, -1, -1, -1, -1, -1, + -1, -1, -1, 130, -1, -1, -1, -1, -1, 175, + -1, -1, -1, 153, -1, 155, 156, -1, -1, -1, + -1, -1, 162, -1, -1, -1, -1, 154, 168, -1, + -1, 171, 172, -1, 174, 175, 171, 177, -1, 179, + -1, -1, 182, -1, 179, -1, -1, -1, -1, 189, + 190, -1, -1, 193, -1, -1, -1, 197, 185, -1, + 200, -1, -1, 203, 204, -1, 206, 194, -1, 209, + 210, 5, -1, 213, -1, -1, 10, -1, -1, 13, + 14, 15, -1, 17, -1, 19, 20, 21, 22, 23, + -1, -1, 26, -1, -1, -1, -1, 31, 32, -1, 34, 35, 36, 37, 38, 39, 40, -1, 42, 43, - 44, 45, -1, 47, 48, 49, -1, -1, -1, -1, + 44, 45, -1, 47, 48, -1, -1, -1, -1, -1, 54, 55, 56, 57, 58, 59, -1, -1, 62, 63, - 64, 65, 66, 67, 68, 69, 70, 71, -1, -1, + 64, 65, 66, 67, 68, 69, 70, -1, -1, -1, + -1, 5, -1, 77, -1, -1, 10, 81, 82, 13, + 14, 15, -1, 17, 88, 19, 20, 21, 22, 23, + -1, -1, 26, -1, -1, -1, -1, 31, 32, -1, + 34, 35, 36, 37, 38, 39, 40, -1, 42, 43, + 44, 45, -1, 47, 48, -1, -1, -1, -1, -1, + 54, 55, 56, 57, 58, 59, -1, -1, 62, 63, + 64, 65, 66, 67, 68, 69, 70, -1, -1, -1, + -1, -1, -1, 77, -1, -1, -1, 81, 82, 13, + -1, -1, -1, 17, 88, 19, 20, 21, 22, 23, + -1, -1, 26, 27, -1, -1, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, -1, 42, 43, + 44, 45, 46, 47, 48, 49, -1, -1, -1, -1, + 54, 55, 56, 57, 58, 59, -1, -1, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, 72, -1, 13, -1, -1, 77, 17, -1, 19, 20, 21, 22, - 23, -1, 86, 26, 27, -1, -1, 30, 31, 32, + 23, 24, 86, 26, 27, -1, -1, 30, 31, 32, -1, 34, 35, 36, 37, 38, 39, 40, -1, 42, 43, 44, 45, -1, 47, 48, 49, -1, -1, -1, -1, 54, 55, 56, 57, 58, 59, -1, -1, 62, @@ -980,45 +1013,89 @@ static const yytype_int16 yycheck[] = -1, 42, 43, 44, 45, -1, 47, 48, 49, -1, -1, -1, -1, 54, 55, 56, 57, 58, 59, -1, -1, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, -1, -1, 74, 13, -1, 77, -1, 17, -1, - 19, 20, 21, 22, 23, 86, -1, 26, 27, -1, - -1, 30, 31, 32, -1, 34, 35, 36, 37, 38, - 39, 40, -1, 42, 43, 44, 45, -1, 47, 48, - 49, -1, -1, -1, -1, 54, 55, 56, 57, 58, - 59, -1, -1, 62, 63, 64, 65, 66, 67, 68, - 69, 70, 71, -1, -1, 13, -1, -1, 77, 17, - -1, 19, 20, 21, 22, 23, -1, 86, 26, 27, + 71, -1, -1, -1, 75, -1, 77, -1, -1, -1, + 13, -1, -1, 16, 17, 86, 19, 20, 21, 22, + 23, -1, -1, 26, 27, -1, -1, 30, 31, 32, + -1, 34, 35, 36, 37, 38, 39, 40, -1, 42, + 43, 44, 45, -1, 47, 48, 49, -1, -1, -1, + -1, 54, 55, 56, 57, 58, 59, -1, -1, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, -1, + -1, 13, -1, -1, 77, 17, -1, 19, 20, 21, + 22, 23, -1, 86, 26, 27, -1, -1, 30, 31, + 32, -1, 34, 35, 36, 37, 38, 39, 40, -1, + 42, 43, 44, 45, -1, 47, 48, 49, -1, -1, + -1, -1, 54, 55, 56, 57, 58, 59, -1, -1, + 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, + -1, -1, 74, 13, -1, 77, -1, 17, -1, 19, + 20, 21, 22, 23, 86, -1, 26, 27, -1, -1, + 30, 31, 32, -1, 34, 35, 36, 37, 38, 39, + 40, -1, 42, 43, 44, 45, -1, 47, 48, 49, + -1, -1, -1, -1, 54, 55, 56, 57, 58, 59, + -1, -1, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, -1, -1, 74, 13, -1, 77, -1, 17, + -1, 19, 20, 21, 22, 23, 86, -1, 26, 27, -1, -1, 30, 31, 32, -1, 34, 35, 36, 37, 38, 39, 40, -1, 42, 43, 44, 45, -1, 47, 48, 49, -1, -1, -1, -1, 54, 55, 56, 57, 58, 59, -1, -1, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, -1, -1, 13, -1, -1, 77, + 68, 69, 70, 71, -1, -1, 13, 75, -1, 77, 17, -1, 19, 20, 21, 22, 23, -1, 86, 26, 27, -1, -1, 30, 31, 32, -1, 34, 35, 36, 37, 38, 39, 40, -1, 42, 43, 44, 45, -1, 47, 48, 49, -1, -1, -1, -1, 54, 55, 56, 57, 58, 59, -1, -1, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, -1, -1, 13, -1, -1, + 67, 68, 69, 70, 71, -1, -1, 13, 75, -1, 77, 17, -1, 19, 20, 21, 22, 23, -1, 86, 26, 27, -1, -1, 30, 31, 32, -1, 34, 35, 36, 37, 38, 39, 40, -1, 42, 43, 44, 45, -1, 47, 48, 49, -1, -1, -1, -1, 54, 55, 56, 57, 58, 59, -1, -1, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 13, -1, -1, -1, - 17, 77, 19, 20, 21, 22, 23, -1, -1, 26, - 86, -1, -1, -1, 31, 32, -1, 34, 35, 36, - 37, 38, 39, 40, -1, 42, 43, 44, 45, -1, - 47, 48, -1, -1, -1, -1, -1, 54, 55, 56, - 57, 58, 59, -1, -1, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 50, 51, 52, 53, 54, 55, - 77, 57, -1, -1, 60, 61, 62, 50, 51, 52, - 53, 54, 55, -1, 57, -1, -1, 60, 61, 62, - -1, -1, 78, 79, 80, 81, 82, 83, 84, -1, - -1, -1, -1, 89, -1, 78, 79, 80, 81, 82, - 83, 84, 50, 51, 52, 53, -1, -1, -1, 57, - -1, -1, 60, 61, 62, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 78, 79, 80, 81, 82, 83, 84 + 66, 67, 68, 69, 70, 71, -1, -1, 13, -1, + -1, 77, 17, -1, 19, 20, 21, 22, 23, -1, + 86, 26, 27, -1, -1, 30, 31, 32, -1, 34, + 35, 36, 37, 38, 39, 40, -1, 42, 43, 44, + 45, -1, 47, 48, 49, -1, -1, -1, -1, 54, + 55, 56, 57, 58, 59, -1, -1, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, -1, -1, 13, + -1, -1, 77, 17, -1, 19, 20, 21, 22, 23, + -1, 86, 26, 27, -1, -1, 30, 31, 32, -1, + 34, 35, 36, 37, 38, 39, 40, -1, 42, 43, + 44, 45, -1, 47, 48, 49, -1, -1, -1, -1, + 54, 55, 56, 57, 58, 59, -1, -1, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, -1, -1, + 13, -1, -1, 77, 17, -1, 19, 20, 21, 22, + 23, -1, 86, 26, 27, -1, -1, 30, 31, 32, + -1, 34, 35, 36, 37, 38, 39, 40, -1, 42, + 43, 44, 45, -1, 47, 48, 49, -1, -1, -1, + -1, 54, 55, 56, 57, 58, 59, -1, -1, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 13, + -1, -1, -1, 17, 77, 19, 20, 21, 22, 23, + -1, -1, 26, 86, -1, -1, -1, 31, 32, -1, + 34, 35, 36, 37, 38, 39, 40, -1, 42, 43, + 44, 45, -1, 47, 48, -1, -1, -1, 23, -1, + 54, 55, 56, 57, 58, 59, -1, -1, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 42, -1, -1, + -1, -1, -1, 77, -1, 50, 51, 52, 53, 54, + 55, 41, 57, -1, -1, 60, 61, 62, -1, -1, + 50, 51, 52, 53, 54, 55, -1, 57, -1, -1, + 60, 61, 62, 78, 79, 80, 81, 82, 83, 84, + -1, -1, -1, -1, -1, -1, -1, -1, 78, 79, + 80, 81, 82, 83, 84, 50, 51, 52, 53, 54, + 55, -1, 57, -1, -1, 60, 61, 62, 50, 51, + 52, 53, 54, 55, -1, 57, -1, -1, 60, 61, + 62, -1, -1, 78, 79, 80, 81, 82, 83, 84, + -1, -1, -1, -1, 89, -1, 78, 79, 80, 81, + 82, 83, 84, -1, 86, 50, 51, 52, 53, 54, + 55, -1, 57, -1, -1, 60, 61, 62, 50, 51, + 52, 53, 54, 55, -1, 57, -1, -1, 60, 61, + 62, -1, -1, 78, 79, 80, 81, 82, 83, 84, + -1, 86, -1, -1, -1, -1, 78, 79, 80, 81, + 82, 83, 84, -1, 86, 50, 51, 52, 53, 54, + 55, -1, 57, -1, -1, 60, 61, 62, 50, 51, + 52, 53, -1, -1, -1, 57, -1, -1, 60, 61, + 62, -1, -1, 78, 79, 80, 81, 82, 83, 84, + -1, -1, -1, -1, -1, -1, 78, 79, 80, 81, + 82, 83, 84 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -1031,19 +1108,22 @@ static const yytype_int8 yystos[] = 55, 56, 57, 58, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 77, 86, 91, 92, 93, 94, 95, 100, 102, 105, 106, 107, 108, 109, - 110, 102, 103, 104, 5, 10, 14, 15, 56, 81, - 82, 88, 102, 114, 115, 116, 102, 102, 103, 103, - 102, 0, 93, 88, 116, 117, 118, 86, 87, 115, - 115, 115, 116, 88, 41, 50, 51, 52, 53, 54, - 55, 57, 60, 61, 62, 78, 79, 80, 81, 82, - 83, 84, 103, 86, 86, 86, 103, 116, 117, 86, - 87, 102, 89, 117, 86, 105, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 86, 73, 86, 96, 97, 98, 99, - 86, 89, 116, 89, 86, 105, 111, 112, 113, 24, - 111, 102, 86, 111, 86, 24, 74, 113, 86, 105, - 103, 99, 16, 86, 105, 86, 111, 86, 101, 102, - 111, 74, 111, 86, 87, 74, 86, 102, 86 + 110, 111, 39, 26, 35, 39, 102, 103, 104, 5, + 10, 14, 15, 56, 81, 82, 88, 102, 115, 116, + 117, 102, 39, 44, 45, 102, 103, 103, 102, 0, + 93, 88, 117, 118, 119, 86, 87, 116, 116, 116, + 117, 88, 41, 50, 51, 52, 53, 54, 55, 57, + 60, 61, 62, 78, 79, 80, 81, 82, 83, 84, + 103, 102, 117, 86, 86, 86, 103, 117, 118, 86, + 87, 102, 89, 118, 86, 105, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 86, 52, 86, 73, 86, 96, 97, + 98, 99, 86, 89, 117, 89, 86, 105, 112, 113, + 114, 24, 112, 117, 112, 102, 86, 112, 86, 24, + 74, 114, 86, 105, 23, 42, 75, 103, 99, 16, + 86, 105, 86, 112, 42, 117, 86, 86, 101, 102, + 112, 74, 117, 86, 112, 86, 87, 74, 86, 86, + 112, 102, 86, 112, 75, 75, 86, 86 }; /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ @@ -1056,12 +1136,12 @@ static const yytype_int8 yyr1[] = 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 103, 103, 104, 104, 105, 105, 105, - 106, 106, 107, 107, 108, 108, 108, 109, 109, 110, - 110, 110, 110, 111, 111, 112, 112, 113, 113, 114, - 114, 114, 114, 114, 114, 114, 114, 114, 115, 115, - 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116, 116, 116, 116, 116, 116, 117, 117, - 118, 118 + 105, 106, 106, 107, 107, 107, 107, 108, 108, 108, + 109, 109, 110, 110, 110, 110, 111, 111, 111, 112, + 112, 113, 113, 114, 114, 115, 115, 115, 115, 115, + 115, 115, 115, 115, 116, 116, 117, 117, 117, 117, + 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, + 117, 117, 117, 117, 118, 118, 119, 119 }; /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ @@ -1074,12 +1154,12 @@ static const yytype_int8 yyr2[] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 3, 1, 1, 1, - 1, 1, 5, 3, 3, 3, 3, 4, 7, 6, - 9, 7, 10, 0, 1, 1, 2, 1, 1, 1, - 1, 1, 1, 2, 2, 2, 4, 1, 1, 3, - 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 0, 1, - 1, 3 + 1, 1, 1, 5, 3, 2, 2, 3, 3, 3, + 4, 7, 6, 9, 7, 10, 7, 11, 12, 0, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, + 2, 2, 4, 1, 1, 3, 1, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 0, 1, 1, 3 }; @@ -1353,49 +1433,49 @@ yydestruct (const char *yymsg, case YYSYMBOL_tTHEFUNC: /* tTHEFUNC */ #line 184 "engines/director/lingo/lingo-gr.y" { delete ((*yyvaluep).s); } -#line 1357 "engines/director/lingo/lingo-gr.cpp" +#line 1437 "engines/director/lingo/lingo-gr.cpp" break; case YYSYMBOL_tTHEFUNCINOF: /* tTHEFUNCINOF */ #line 184 "engines/director/lingo/lingo-gr.y" { delete ((*yyvaluep).s); } -#line 1363 "engines/director/lingo/lingo-gr.cpp" +#line 1443 "engines/director/lingo/lingo-gr.cpp" break; case YYSYMBOL_tVARID: /* tVARID */ #line 184 "engines/director/lingo/lingo-gr.y" { delete ((*yyvaluep).s); } -#line 1369 "engines/director/lingo/lingo-gr.cpp" +#line 1449 "engines/director/lingo/lingo-gr.cpp" break; case YYSYMBOL_tSTRING: /* tSTRING */ #line 184 "engines/director/lingo/lingo-gr.y" { delete ((*yyvaluep).s); } -#line 1375 "engines/director/lingo/lingo-gr.cpp" +#line 1455 "engines/director/lingo/lingo-gr.cpp" break; case YYSYMBOL_tSYMBOL: /* tSYMBOL */ #line 184 "engines/director/lingo/lingo-gr.y" { delete ((*yyvaluep).s); } -#line 1381 "engines/director/lingo/lingo-gr.cpp" +#line 1461 "engines/director/lingo/lingo-gr.cpp" break; case YYSYMBOL_tENDCLAUSE: /* tENDCLAUSE */ #line 184 "engines/director/lingo/lingo-gr.y" { delete ((*yyvaluep).s); } -#line 1387 "engines/director/lingo/lingo-gr.cpp" +#line 1467 "engines/director/lingo/lingo-gr.cpp" break; case YYSYMBOL_tPLAYACCEL: /* tPLAYACCEL */ #line 184 "engines/director/lingo/lingo-gr.y" { delete ((*yyvaluep).s); } -#line 1393 "engines/director/lingo/lingo-gr.cpp" +#line 1473 "engines/director/lingo/lingo-gr.cpp" break; case YYSYMBOL_ID: /* ID */ #line 184 "engines/director/lingo/lingo-gr.y" { delete ((*yyvaluep).s); } -#line 1399 "engines/director/lingo/lingo-gr.cpp" +#line 1479 "engines/director/lingo/lingo-gr.cpp" break; default: @@ -1663,7 +1743,7 @@ yyreduce: case 2: /* script: scriptpartlist */ #line 190 "engines/director/lingo/lingo-gr.y" { g_lingo->_compiler->_assemblyAST = new ScriptNode((yyvsp[0].nodelist)); } -#line 1667 "engines/director/lingo/lingo-gr.cpp" +#line 1747 "engines/director/lingo/lingo-gr.cpp" break; case 3: /* scriptpartlist: scriptpart */ @@ -1674,7 +1754,7 @@ yyreduce: list->push_back((yyvsp[0].node)); } (yyval.nodelist) = list; } -#line 1678 "engines/director/lingo/lingo-gr.cpp" +#line 1758 "engines/director/lingo/lingo-gr.cpp" break; case 4: /* scriptpartlist: scriptpartlist scriptpart */ @@ -1684,37 +1764,37 @@ yyreduce: (yyvsp[-1].nodelist)->push_back((yyvsp[0].node)); } (yyval.nodelist) = (yyvsp[-1].nodelist); } -#line 1688 "engines/director/lingo/lingo-gr.cpp" +#line 1768 "engines/director/lingo/lingo-gr.cpp" break; case 5: /* scriptpart: '\n' */ #line 205 "engines/director/lingo/lingo-gr.y" { (yyval.node) = nullptr; } -#line 1694 "engines/director/lingo/lingo-gr.cpp" +#line 1774 "engines/director/lingo/lingo-gr.cpp" break; case 10: /* macro: tMACRO ID idlist '\n' stmtlist */ #line 238 "engines/director/lingo/lingo-gr.y" { (yyval.node) = new HandlerNode((yyvsp[-3].s), (yyvsp[-2].idlist), (yyvsp[0].nodelist)); } -#line 1700 "engines/director/lingo/lingo-gr.cpp" +#line 1780 "engines/director/lingo/lingo-gr.cpp" break; case 11: /* factory: tFACTORY ID '\n' methodlist */ #line 242 "engines/director/lingo/lingo-gr.y" { (yyval.node) = new FactoryNode((yyvsp[-2].s), (yyvsp[0].nodelist)); } -#line 1706 "engines/director/lingo/lingo-gr.cpp" +#line 1786 "engines/director/lingo/lingo-gr.cpp" break; case 12: /* method: tMETHOD ID idlist '\n' stmtlist */ #line 244 "engines/director/lingo/lingo-gr.y" { (yyval.node) = new HandlerNode((yyvsp[-3].s), (yyvsp[-2].idlist), (yyvsp[0].nodelist)); } -#line 1712 "engines/director/lingo/lingo-gr.cpp" +#line 1792 "engines/director/lingo/lingo-gr.cpp" break; case 13: /* methodlist: %empty */ #line 246 "engines/director/lingo/lingo-gr.y" { (yyval.nodelist) = new NodeList; } -#line 1718 "engines/director/lingo/lingo-gr.cpp" +#line 1798 "engines/director/lingo/lingo-gr.cpp" break; case 15: /* nonemptymethodlist: methodlistline */ @@ -1725,7 +1805,7 @@ yyreduce: list->push_back((yyvsp[0].node)); } (yyval.nodelist) = list; } -#line 1729 "engines/director/lingo/lingo-gr.cpp" +#line 1809 "engines/director/lingo/lingo-gr.cpp" break; case 16: /* nonemptymethodlist: methodlist '\n' methodlistline */ @@ -1735,13 +1815,13 @@ yyreduce: (yyvsp[-2].nodelist)->push_back((yyvsp[0].node)); } (yyval.nodelist) = (yyvsp[-2].nodelist); } -#line 1739 "engines/director/lingo/lingo-gr.cpp" +#line 1819 "engines/director/lingo/lingo-gr.cpp" break; case 17: /* methodlistline: '\n' */ #line 263 "engines/director/lingo/lingo-gr.y" { (yyval.node) = nullptr; } -#line 1745 "engines/director/lingo/lingo-gr.cpp" +#line 1825 "engines/director/lingo/lingo-gr.cpp" break; case 19: /* handler: tON ID idlist '\n' stmtlist tENDCLAUSE endargdef '\n' */ @@ -1750,260 +1830,260 @@ yyreduce: (yyval.node) = new HandlerNode((yyvsp[-6].s), (yyvsp[-5].idlist), (yyvsp[-3].nodelist)); checkEnd((yyvsp[-2].s), (yyvsp[-6].s), false); delete (yyvsp[-2].s); } -#line 1754 "engines/director/lingo/lingo-gr.cpp" +#line 1834 "engines/director/lingo/lingo-gr.cpp" break; case 20: /* handler: tON ID idlist '\n' stmtlist */ #line 273 "engines/director/lingo/lingo-gr.y" { // D4. No 'end' clause (yyval.node) = new HandlerNode((yyvsp[-3].s), (yyvsp[-2].idlist), (yyvsp[0].nodelist)); } -#line 1761 "engines/director/lingo/lingo-gr.cpp" +#line 1841 "engines/director/lingo/lingo-gr.cpp" break; case 22: /* endargdef: ID */ #line 278 "engines/director/lingo/lingo-gr.y" { delete (yyvsp[0].s); } -#line 1767 "engines/director/lingo/lingo-gr.cpp" +#line 1847 "engines/director/lingo/lingo-gr.cpp" break; case 23: /* endargdef: endargdef ',' ID */ #line 279 "engines/director/lingo/lingo-gr.y" { delete (yyvsp[0].s); } -#line 1773 "engines/director/lingo/lingo-gr.cpp" +#line 1853 "engines/director/lingo/lingo-gr.cpp" break; case 25: /* ID: tAFTER */ #line 285 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("after"); } -#line 1779 "engines/director/lingo/lingo-gr.cpp" +#line 1859 "engines/director/lingo/lingo-gr.cpp" break; case 26: /* ID: tAND */ #line 286 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("and"); } -#line 1785 "engines/director/lingo/lingo-gr.cpp" +#line 1865 "engines/director/lingo/lingo-gr.cpp" break; case 27: /* ID: tBEFORE */ #line 287 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("before"); } -#line 1791 "engines/director/lingo/lingo-gr.cpp" +#line 1871 "engines/director/lingo/lingo-gr.cpp" break; case 28: /* ID: tCAST */ #line 288 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("cast"); } -#line 1797 "engines/director/lingo/lingo-gr.cpp" +#line 1877 "engines/director/lingo/lingo-gr.cpp" break; case 29: /* ID: tCHAR */ #line 289 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("char"); } -#line 1803 "engines/director/lingo/lingo-gr.cpp" +#line 1883 "engines/director/lingo/lingo-gr.cpp" break; case 30: /* ID: tDOWN */ #line 290 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("down"); } -#line 1809 "engines/director/lingo/lingo-gr.cpp" +#line 1889 "engines/director/lingo/lingo-gr.cpp" break; case 31: /* ID: tEXIT */ #line 293 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("exit"); } -#line 1815 "engines/director/lingo/lingo-gr.cpp" +#line 1895 "engines/director/lingo/lingo-gr.cpp" break; case 32: /* ID: tFIELD */ #line 295 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("field"); } -#line 1821 "engines/director/lingo/lingo-gr.cpp" +#line 1901 "engines/director/lingo/lingo-gr.cpp" break; case 33: /* ID: tIN */ #line 298 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("in"); } -#line 1827 "engines/director/lingo/lingo-gr.cpp" +#line 1907 "engines/director/lingo/lingo-gr.cpp" break; case 34: /* ID: tINTERSECTS */ #line 300 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("intersects"); } -#line 1833 "engines/director/lingo/lingo-gr.cpp" +#line 1913 "engines/director/lingo/lingo-gr.cpp" break; case 35: /* ID: tINTO */ #line 301 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("into"); } -#line 1839 "engines/director/lingo/lingo-gr.cpp" +#line 1919 "engines/director/lingo/lingo-gr.cpp" break; case 36: /* ID: tITEM */ #line 302 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("item"); } -#line 1845 "engines/director/lingo/lingo-gr.cpp" +#line 1925 "engines/director/lingo/lingo-gr.cpp" break; case 37: /* ID: tLINE */ #line 303 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("line"); } -#line 1851 "engines/director/lingo/lingo-gr.cpp" +#line 1931 "engines/director/lingo/lingo-gr.cpp" break; case 38: /* ID: tMOD */ #line 306 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("mod"); } -#line 1857 "engines/director/lingo/lingo-gr.cpp" +#line 1937 "engines/director/lingo/lingo-gr.cpp" break; case 39: /* ID: tMOVIE */ #line 307 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("movie"); } -#line 1863 "engines/director/lingo/lingo-gr.cpp" +#line 1943 "engines/director/lingo/lingo-gr.cpp" break; case 40: /* ID: tNEXT */ #line 308 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("next"); } -#line 1869 "engines/director/lingo/lingo-gr.cpp" +#line 1949 "engines/director/lingo/lingo-gr.cpp" break; case 41: /* ID: tNOT */ #line 309 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("not"); } -#line 1875 "engines/director/lingo/lingo-gr.cpp" +#line 1955 "engines/director/lingo/lingo-gr.cpp" break; case 42: /* ID: tOF */ #line 310 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("of"); } -#line 1881 "engines/director/lingo/lingo-gr.cpp" +#line 1961 "engines/director/lingo/lingo-gr.cpp" break; case 43: /* ID: tOPEN */ #line 312 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("open"); } -#line 1887 "engines/director/lingo/lingo-gr.cpp" +#line 1967 "engines/director/lingo/lingo-gr.cpp" break; case 44: /* ID: tOR */ #line 313 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("or"); } -#line 1893 "engines/director/lingo/lingo-gr.cpp" +#line 1973 "engines/director/lingo/lingo-gr.cpp" break; case 45: /* ID: tPLAY */ #line 314 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("play"); } -#line 1899 "engines/director/lingo/lingo-gr.cpp" +#line 1979 "engines/director/lingo/lingo-gr.cpp" break; case 46: /* ID: tPLAYACCEL */ #line 315 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("playAccel"); } -#line 1905 "engines/director/lingo/lingo-gr.cpp" +#line 1985 "engines/director/lingo/lingo-gr.cpp" break; case 47: /* ID: tPREVIOUS */ #line 316 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("previous"); } -#line 1911 "engines/director/lingo/lingo-gr.cpp" +#line 1991 "engines/director/lingo/lingo-gr.cpp" break; case 48: /* ID: tPUT */ #line 318 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("put"); } -#line 1917 "engines/director/lingo/lingo-gr.cpp" +#line 1997 "engines/director/lingo/lingo-gr.cpp" break; case 49: /* ID: tREPEAT */ #line 319 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("repeat"); } -#line 1923 "engines/director/lingo/lingo-gr.cpp" +#line 2003 "engines/director/lingo/lingo-gr.cpp" break; case 50: /* ID: tSCRIPT */ #line 320 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("script"); } -#line 1929 "engines/director/lingo/lingo-gr.cpp" +#line 2009 "engines/director/lingo/lingo-gr.cpp" break; case 51: /* ID: tSET */ #line 321 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("set"); } -#line 1935 "engines/director/lingo/lingo-gr.cpp" +#line 2015 "engines/director/lingo/lingo-gr.cpp" break; case 52: /* ID: tSTARTS */ #line 322 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("starts"); } -#line 1941 "engines/director/lingo/lingo-gr.cpp" +#line 2021 "engines/director/lingo/lingo-gr.cpp" break; case 53: /* ID: tTELL */ #line 323 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("tell"); } -#line 1947 "engines/director/lingo/lingo-gr.cpp" +#line 2027 "engines/director/lingo/lingo-gr.cpp" break; case 54: /* ID: tTO */ #line 325 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("to"); } -#line 1953 "engines/director/lingo/lingo-gr.cpp" +#line 2033 "engines/director/lingo/lingo-gr.cpp" break; case 55: /* ID: tASSERTERROR */ #line 326 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("scummvmAssertError"); } -#line 1959 "engines/director/lingo/lingo-gr.cpp" +#line 2039 "engines/director/lingo/lingo-gr.cpp" break; case 56: /* ID: tSPRITE */ #line 327 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("sprite"); } -#line 1965 "engines/director/lingo/lingo-gr.cpp" +#line 2045 "engines/director/lingo/lingo-gr.cpp" break; case 57: /* ID: tWHEN */ #line 328 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("when"); } -#line 1971 "engines/director/lingo/lingo-gr.cpp" +#line 2051 "engines/director/lingo/lingo-gr.cpp" break; case 58: /* ID: tWHILE */ #line 329 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("while"); } -#line 1977 "engines/director/lingo/lingo-gr.cpp" +#line 2057 "engines/director/lingo/lingo-gr.cpp" break; case 59: /* ID: tWINDOW */ #line 330 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("window"); } -#line 1983 "engines/director/lingo/lingo-gr.cpp" +#line 2063 "engines/director/lingo/lingo-gr.cpp" break; case 60: /* ID: tWITH */ #line 331 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("with"); } -#line 1989 "engines/director/lingo/lingo-gr.cpp" +#line 2069 "engines/director/lingo/lingo-gr.cpp" break; case 61: /* ID: tWITHIN */ #line 332 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("within"); } -#line 1995 "engines/director/lingo/lingo-gr.cpp" +#line 2075 "engines/director/lingo/lingo-gr.cpp" break; case 62: /* ID: tWORD */ #line 333 "engines/director/lingo/lingo-gr.y" { (yyval.s) = new Common::String("word"); } -#line 2001 "engines/director/lingo/lingo-gr.cpp" +#line 2081 "engines/director/lingo/lingo-gr.cpp" break; case 63: /* idlist: %empty */ #line 336 "engines/director/lingo/lingo-gr.y" { (yyval.idlist) = new IDList; } -#line 2007 "engines/director/lingo/lingo-gr.cpp" +#line 2087 "engines/director/lingo/lingo-gr.cpp" break; case 65: /* nonemptyidlist: ID */ @@ -2012,7 +2092,7 @@ yyreduce: Common::Array *list = new IDList; list->push_back((yyvsp[0].s)); (yyval.idlist) = list; } -#line 2016 "engines/director/lingo/lingo-gr.cpp" +#line 2096 "engines/director/lingo/lingo-gr.cpp" break; case 66: /* nonemptyidlist: nonemptyidlist ',' ID */ @@ -2020,317 +2100,350 @@ yyreduce: { (yyvsp[-2].idlist)->push_back((yyvsp[0].s)); (yyval.idlist) = (yyvsp[-2].idlist); } -#line 2024 "engines/director/lingo/lingo-gr.cpp" +#line 2104 "engines/director/lingo/lingo-gr.cpp" break; - case 72: /* proc: ID '(' exprlist ')' '\n' */ -#line 360 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new CmdNode((yyvsp[-4].s), (yyvsp[-2].nodelist)); } -#line 2030 "engines/director/lingo/lingo-gr.cpp" - break; - - case 73: /* proc: ID exprlist '\n' */ -#line 361 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new CmdNode((yyvsp[-2].s), (yyvsp[-1].nodelist)); } -#line 2036 "engines/director/lingo/lingo-gr.cpp" - break; - - case 74: /* definevars: tGLOBAL idlist '\n' */ + case 73: /* proc: ID '(' exprlist ')' '\n' */ #line 364 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new GlobalNode((yyvsp[-1].idlist)); } -#line 2042 "engines/director/lingo/lingo-gr.cpp" + { (yyval.node) = new CmdNode((yyvsp[-4].s), (yyvsp[-2].nodelist)); } +#line 2110 "engines/director/lingo/lingo-gr.cpp" break; - case 75: /* definevars: tPROPERTY idlist '\n' */ + case 74: /* proc: ID exprlist '\n' */ #line 365 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new PropertyNode((yyvsp[-1].idlist)); } -#line 2048 "engines/director/lingo/lingo-gr.cpp" + { (yyval.node) = new CmdNode((yyvsp[-2].s), (yyvsp[-1].nodelist)); } +#line 2116 "engines/director/lingo/lingo-gr.cpp" break; - case 76: /* definevars: tINSTANCE idlist '\n' */ + case 75: /* proc: tNEXT tREPEAT */ #line 366 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new InstanceNode((yyvsp[-1].idlist)); } -#line 2054 "engines/director/lingo/lingo-gr.cpp" + { (yyval.node) = new NextRepeatNode(); } +#line 2122 "engines/director/lingo/lingo-gr.cpp" break; - case 77: /* ifstmt: tIF expr tTHEN stmt */ -#line 369 "engines/director/lingo/lingo-gr.y" + case 76: /* proc: tEXIT tREPEAT */ +#line 367 "engines/director/lingo/lingo-gr.y" + { (yyval.node) = new ExitRepeatNode(); } +#line 2128 "engines/director/lingo/lingo-gr.cpp" + break; + + case 77: /* definevars: tGLOBAL idlist '\n' */ +#line 370 "engines/director/lingo/lingo-gr.y" + { (yyval.node) = new GlobalNode((yyvsp[-1].idlist)); } +#line 2134 "engines/director/lingo/lingo-gr.cpp" + break; + + case 78: /* definevars: tPROPERTY idlist '\n' */ +#line 371 "engines/director/lingo/lingo-gr.y" + { (yyval.node) = new PropertyNode((yyvsp[-1].idlist)); } +#line 2140 "engines/director/lingo/lingo-gr.cpp" + break; + + case 79: /* definevars: tINSTANCE idlist '\n' */ +#line 372 "engines/director/lingo/lingo-gr.y" + { (yyval.node) = new InstanceNode((yyvsp[-1].idlist)); } +#line 2146 "engines/director/lingo/lingo-gr.cpp" + break; + + case 80: /* ifstmt: tIF expr tTHEN stmt */ +#line 375 "engines/director/lingo/lingo-gr.y" { NodeList *stmtlist = new NodeList; stmtlist->push_back((yyvsp[0].node)); (yyval.node) = new IfStmtNode((yyvsp[-2].node), stmtlist); } -#line 2063 "engines/director/lingo/lingo-gr.cpp" +#line 2155 "engines/director/lingo/lingo-gr.cpp" break; - case 78: /* ifstmt: tIF expr tTHEN '\n' stmtlist tENDIF '\n' */ -#line 373 "engines/director/lingo/lingo-gr.y" + case 81: /* ifstmt: tIF expr tTHEN '\n' stmtlist tENDIF '\n' */ +#line 379 "engines/director/lingo/lingo-gr.y" { (yyval.node) = new IfStmtNode((yyvsp[-5].node), (yyvsp[-2].nodelist)); } -#line 2070 "engines/director/lingo/lingo-gr.cpp" +#line 2162 "engines/director/lingo/lingo-gr.cpp" break; - case 79: /* ifelsestmt: tIF expr tTHEN stmt tELSE stmt */ -#line 377 "engines/director/lingo/lingo-gr.y" + case 82: /* ifelsestmt: tIF expr tTHEN stmt tELSE stmt */ +#line 383 "engines/director/lingo/lingo-gr.y" { NodeList *stmtlist1 = new NodeList; stmtlist1->push_back((yyvsp[-2].node)); NodeList *stmtlist2 = new NodeList; stmtlist2->push_back((yyvsp[0].node)); (yyval.node) = new IfElseStmtNode((yyvsp[-4].node), stmtlist1, stmtlist2); } -#line 2081 "engines/director/lingo/lingo-gr.cpp" +#line 2173 "engines/director/lingo/lingo-gr.cpp" break; - case 80: /* ifelsestmt: tIF expr tTHEN stmt tELSE '\n' stmtlist tENDIF '\n' */ -#line 383 "engines/director/lingo/lingo-gr.y" + case 83: /* ifelsestmt: tIF expr tTHEN stmt tELSE '\n' stmtlist tENDIF '\n' */ +#line 389 "engines/director/lingo/lingo-gr.y" { NodeList *stmtlist1 = new NodeList; stmtlist1->push_back((yyvsp[-5].node)); (yyval.node) = new IfElseStmtNode((yyvsp[-7].node), stmtlist1, (yyvsp[-2].nodelist)); } -#line 2090 "engines/director/lingo/lingo-gr.cpp" +#line 2182 "engines/director/lingo/lingo-gr.cpp" break; - case 81: /* ifelsestmt: tIF expr tTHEN '\n' stmtlist tELSE stmt */ -#line 387 "engines/director/lingo/lingo-gr.y" + case 84: /* ifelsestmt: tIF expr tTHEN '\n' stmtlist tELSE stmt */ +#line 393 "engines/director/lingo/lingo-gr.y" { NodeList *stmtlist2 = new NodeList; stmtlist2->push_back((yyvsp[0].node)); (yyval.node) = new IfElseStmtNode((yyvsp[-5].node), (yyvsp[-2].nodelist), stmtlist2); } -#line 2099 "engines/director/lingo/lingo-gr.cpp" +#line 2191 "engines/director/lingo/lingo-gr.cpp" break; - case 82: /* ifelsestmt: tIF expr tTHEN '\n' stmtlist tELSE '\n' stmtlist tENDIF '\n' */ -#line 391 "engines/director/lingo/lingo-gr.y" + case 85: /* ifelsestmt: tIF expr tTHEN '\n' stmtlist tELSE '\n' stmtlist tENDIF '\n' */ +#line 397 "engines/director/lingo/lingo-gr.y" { (yyval.node) = new IfElseStmtNode((yyvsp[-8].node), (yyvsp[-5].nodelist), (yyvsp[-2].nodelist)); } -#line 2106 "engines/director/lingo/lingo-gr.cpp" +#line 2198 "engines/director/lingo/lingo-gr.cpp" break; - case 83: /* stmtlist: %empty */ -#line 395 "engines/director/lingo/lingo-gr.y" + case 86: /* loop: tREPEAT tWHILE expr '\n' stmtlist tENDREPEAT '\n' */ +#line 401 "engines/director/lingo/lingo-gr.y" + { + (yyval.node) = new RepeatWhileNode((yyvsp[-4].node), (yyvsp[-2].nodelist)); } +#line 2205 "engines/director/lingo/lingo-gr.cpp" + break; + + case 87: /* loop: tREPEAT tWITH ID tEQ expr tTO expr '\n' stmtlist tENDREPEAT '\n' */ +#line 403 "engines/director/lingo/lingo-gr.y" + { + (yyval.node) = new RepeatWithToNode((yyvsp[-8].s), (yyvsp[-6].node), false, (yyvsp[-4].node), (yyvsp[-2].nodelist)); } +#line 2212 "engines/director/lingo/lingo-gr.cpp" + break; + + case 88: /* loop: tREPEAT tWITH ID tEQ expr tDOWN tTO expr '\n' stmtlist tENDREPEAT '\n' */ +#line 405 "engines/director/lingo/lingo-gr.y" + { + (yyval.node) = new RepeatWithToNode((yyvsp[-9].s), (yyvsp[-7].node), true, (yyvsp[-4].node), (yyvsp[-2].nodelist)); } +#line 2219 "engines/director/lingo/lingo-gr.cpp" + break; + + case 89: /* stmtlist: %empty */ +#line 409 "engines/director/lingo/lingo-gr.y" { (yyval.nodelist) = new NodeList; } -#line 2112 "engines/director/lingo/lingo-gr.cpp" +#line 2225 "engines/director/lingo/lingo-gr.cpp" break; - case 85: /* nonemptystmtlist: stmtlistline */ -#line 400 "engines/director/lingo/lingo-gr.y" + case 91: /* nonemptystmtlist: stmtlistline */ +#line 414 "engines/director/lingo/lingo-gr.y" { NodeList *list = new NodeList; if ((yyvsp[0].node)) { list->push_back((yyvsp[0].node)); } (yyval.nodelist) = list; } -#line 2123 "engines/director/lingo/lingo-gr.cpp" +#line 2236 "engines/director/lingo/lingo-gr.cpp" break; - case 86: /* nonemptystmtlist: stmtlist stmtlistline */ -#line 406 "engines/director/lingo/lingo-gr.y" + case 92: /* nonemptystmtlist: stmtlist stmtlistline */ +#line 420 "engines/director/lingo/lingo-gr.y" { if ((yyvsp[0].node)) { (yyvsp[-1].nodelist)->push_back((yyvsp[0].node)); } (yyval.nodelist) = (yyvsp[-1].nodelist); } -#line 2133 "engines/director/lingo/lingo-gr.cpp" +#line 2246 "engines/director/lingo/lingo-gr.cpp" break; - case 87: /* stmtlistline: '\n' */ -#line 413 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = nullptr; } -#line 2139 "engines/director/lingo/lingo-gr.cpp" - break; - - case 89: /* simpleexprnoparens: tINT */ -#line 419 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new IntNode((yyvsp[0].i)); } -#line 2145 "engines/director/lingo/lingo-gr.cpp" - break; - - case 90: /* simpleexprnoparens: tFLOAT */ -#line 420 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new FloatNode((yyvsp[0].f)); } -#line 2151 "engines/director/lingo/lingo-gr.cpp" - break; - - case 91: /* simpleexprnoparens: tSYMBOL */ -#line 421 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new SymbolNode((yyvsp[0].s)); } -#line 2157 "engines/director/lingo/lingo-gr.cpp" - break; - - case 92: /* simpleexprnoparens: tSTRING */ -#line 422 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new StringNode((yyvsp[0].s)); } -#line 2163 "engines/director/lingo/lingo-gr.cpp" - break; - - case 93: /* simpleexprnoparens: '+' simpleexpr */ -#line 423 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = (yyvsp[0].node); } -#line 2169 "engines/director/lingo/lingo-gr.cpp" - break; - - case 94: /* simpleexprnoparens: '-' simpleexpr */ -#line 424 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new UnaryOpNode(LC::c_negate, (yyvsp[0].node)); } -#line 2175 "engines/director/lingo/lingo-gr.cpp" - break; - - case 95: /* simpleexprnoparens: tNOT simpleexpr */ -#line 425 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new UnaryOpNode(LC::c_not, (yyvsp[0].node)); } -#line 2181 "engines/director/lingo/lingo-gr.cpp" - break; - - case 96: /* simpleexprnoparens: ID '(' exprlist ')' */ -#line 426 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new FuncNode((yyvsp[-3].s), (yyvsp[-1].nodelist)); } -#line 2187 "engines/director/lingo/lingo-gr.cpp" - break; - - case 97: /* simpleexprnoparens: ID */ + case 93: /* stmtlistline: '\n' */ #line 427 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new VarNode((yyvsp[0].s)); } -#line 2193 "engines/director/lingo/lingo-gr.cpp" + { (yyval.node) = nullptr; } +#line 2252 "engines/director/lingo/lingo-gr.cpp" break; - case 99: /* simpleexpr: '(' expr ')' */ -#line 431 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = (yyvsp[-1].node); } -#line 2199 "engines/director/lingo/lingo-gr.cpp" + case 95: /* simpleexprnoparens: tINT */ +#line 433 "engines/director/lingo/lingo-gr.y" + { (yyval.node) = new IntNode((yyvsp[0].i)); } +#line 2258 "engines/director/lingo/lingo-gr.cpp" break; - case 100: /* expr: simpleexpr */ + case 96: /* simpleexprnoparens: tFLOAT */ #line 434 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = (yyvsp[0].node); } -#line 2205 "engines/director/lingo/lingo-gr.cpp" + { (yyval.node) = new FloatNode((yyvsp[0].f)); } +#line 2264 "engines/director/lingo/lingo-gr.cpp" break; - case 101: /* expr: expr '+' expr */ + case 97: /* simpleexprnoparens: tSYMBOL */ #line 435 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new BinaryOpNode(LC::c_add, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2211 "engines/director/lingo/lingo-gr.cpp" + { (yyval.node) = new SymbolNode((yyvsp[0].s)); } +#line 2270 "engines/director/lingo/lingo-gr.cpp" break; - case 102: /* expr: expr '-' expr */ + case 98: /* simpleexprnoparens: tSTRING */ #line 436 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new BinaryOpNode(LC::c_sub, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2217 "engines/director/lingo/lingo-gr.cpp" + { (yyval.node) = new StringNode((yyvsp[0].s)); } +#line 2276 "engines/director/lingo/lingo-gr.cpp" break; - case 103: /* expr: expr '*' expr */ + case 99: /* simpleexprnoparens: '+' simpleexpr */ #line 437 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new BinaryOpNode(LC::c_mul, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2223 "engines/director/lingo/lingo-gr.cpp" + { (yyval.node) = (yyvsp[0].node); } +#line 2282 "engines/director/lingo/lingo-gr.cpp" break; - case 104: /* expr: expr '/' expr */ + case 100: /* simpleexprnoparens: '-' simpleexpr */ #line 438 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new BinaryOpNode(LC::c_div, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2229 "engines/director/lingo/lingo-gr.cpp" + { (yyval.node) = new UnaryOpNode(LC::c_negate, (yyvsp[0].node)); } +#line 2288 "engines/director/lingo/lingo-gr.cpp" break; - case 105: /* expr: expr tMOD expr */ + case 101: /* simpleexprnoparens: tNOT simpleexpr */ #line 439 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new BinaryOpNode(LC::c_mod, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2235 "engines/director/lingo/lingo-gr.cpp" + { (yyval.node) = new UnaryOpNode(LC::c_not, (yyvsp[0].node)); } +#line 2294 "engines/director/lingo/lingo-gr.cpp" break; - case 106: /* expr: expr '>' expr */ + case 102: /* simpleexprnoparens: ID '(' exprlist ')' */ #line 440 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new BinaryOpNode(LC::c_gt, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2241 "engines/director/lingo/lingo-gr.cpp" + { (yyval.node) = new FuncNode((yyvsp[-3].s), (yyvsp[-1].nodelist)); } +#line 2300 "engines/director/lingo/lingo-gr.cpp" break; - case 107: /* expr: expr '<' expr */ + case 103: /* simpleexprnoparens: ID */ #line 441 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new BinaryOpNode(LC::c_lt, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2247 "engines/director/lingo/lingo-gr.cpp" + { (yyval.node) = new VarNode((yyvsp[0].s)); } +#line 2306 "engines/director/lingo/lingo-gr.cpp" break; - case 108: /* expr: expr tEQ expr */ -#line 442 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new BinaryOpNode(LC::c_eq, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2253 "engines/director/lingo/lingo-gr.cpp" - break; - - case 109: /* expr: expr tNEQ expr */ -#line 443 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new BinaryOpNode(LC::c_neq, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2259 "engines/director/lingo/lingo-gr.cpp" - break; - - case 110: /* expr: expr tGE expr */ -#line 444 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new BinaryOpNode(LC::c_ge, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2265 "engines/director/lingo/lingo-gr.cpp" - break; - - case 111: /* expr: expr tLE expr */ + case 105: /* simpleexpr: '(' expr ')' */ #line 445 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new BinaryOpNode(LC::c_le, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2271 "engines/director/lingo/lingo-gr.cpp" + { (yyval.node) = (yyvsp[-1].node); } +#line 2312 "engines/director/lingo/lingo-gr.cpp" break; - case 112: /* expr: expr tAND expr */ -#line 446 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new BinaryOpNode(LC::c_and, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2277 "engines/director/lingo/lingo-gr.cpp" - break; - - case 113: /* expr: expr tOR expr */ -#line 447 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new BinaryOpNode(LC::c_or, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2283 "engines/director/lingo/lingo-gr.cpp" - break; - - case 114: /* expr: expr '&' expr */ + case 106: /* expr: simpleexpr */ #line 448 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new BinaryOpNode(LC::c_ampersand, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2289 "engines/director/lingo/lingo-gr.cpp" + { (yyval.node) = (yyvsp[0].node); } +#line 2318 "engines/director/lingo/lingo-gr.cpp" break; - case 115: /* expr: expr tCONCAT expr */ + case 107: /* expr: expr '+' expr */ #line 449 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new BinaryOpNode(LC::c_concat, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2295 "engines/director/lingo/lingo-gr.cpp" + { (yyval.node) = new BinaryOpNode(LC::c_add, (yyvsp[-2].node), (yyvsp[0].node)); } +#line 2324 "engines/director/lingo/lingo-gr.cpp" break; - case 116: /* expr: expr tCONTAINS expr */ + case 108: /* expr: expr '-' expr */ #line 450 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new BinaryOpNode(LC::c_contains, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2301 "engines/director/lingo/lingo-gr.cpp" + { (yyval.node) = new BinaryOpNode(LC::c_sub, (yyvsp[-2].node), (yyvsp[0].node)); } +#line 2330 "engines/director/lingo/lingo-gr.cpp" break; - case 117: /* expr: expr tSTARTS expr */ + case 109: /* expr: expr '*' expr */ #line 451 "engines/director/lingo/lingo-gr.y" - { (yyval.node) = new BinaryOpNode(LC::c_starts, (yyvsp[-2].node), (yyvsp[0].node)); } -#line 2307 "engines/director/lingo/lingo-gr.cpp" + { (yyval.node) = new BinaryOpNode(LC::c_mul, (yyvsp[-2].node), (yyvsp[0].node)); } +#line 2336 "engines/director/lingo/lingo-gr.cpp" break; - case 118: /* exprlist: %empty */ + case 110: /* expr: expr '/' expr */ +#line 452 "engines/director/lingo/lingo-gr.y" + { (yyval.node) = new BinaryOpNode(LC::c_div, (yyvsp[-2].node), (yyvsp[0].node)); } +#line 2342 "engines/director/lingo/lingo-gr.cpp" + break; + + case 111: /* expr: expr tMOD expr */ +#line 453 "engines/director/lingo/lingo-gr.y" + { (yyval.node) = new BinaryOpNode(LC::c_mod, (yyvsp[-2].node), (yyvsp[0].node)); } +#line 2348 "engines/director/lingo/lingo-gr.cpp" + break; + + case 112: /* expr: expr '>' expr */ #line 454 "engines/director/lingo/lingo-gr.y" - { (yyval.nodelist) = new NodeList; } -#line 2313 "engines/director/lingo/lingo-gr.cpp" + { (yyval.node) = new BinaryOpNode(LC::c_gt, (yyvsp[-2].node), (yyvsp[0].node)); } +#line 2354 "engines/director/lingo/lingo-gr.cpp" break; - case 120: /* nonemptyexprlist: expr */ + case 113: /* expr: expr '<' expr */ +#line 455 "engines/director/lingo/lingo-gr.y" + { (yyval.node) = new BinaryOpNode(LC::c_lt, (yyvsp[-2].node), (yyvsp[0].node)); } +#line 2360 "engines/director/lingo/lingo-gr.cpp" + break; + + case 114: /* expr: expr tEQ expr */ +#line 456 "engines/director/lingo/lingo-gr.y" + { (yyval.node) = new BinaryOpNode(LC::c_eq, (yyvsp[-2].node), (yyvsp[0].node)); } +#line 2366 "engines/director/lingo/lingo-gr.cpp" + break; + + case 115: /* expr: expr tNEQ expr */ +#line 457 "engines/director/lingo/lingo-gr.y" + { (yyval.node) = new BinaryOpNode(LC::c_neq, (yyvsp[-2].node), (yyvsp[0].node)); } +#line 2372 "engines/director/lingo/lingo-gr.cpp" + break; + + case 116: /* expr: expr tGE expr */ #line 458 "engines/director/lingo/lingo-gr.y" + { (yyval.node) = new BinaryOpNode(LC::c_ge, (yyvsp[-2].node), (yyvsp[0].node)); } +#line 2378 "engines/director/lingo/lingo-gr.cpp" + break; + + case 117: /* expr: expr tLE expr */ +#line 459 "engines/director/lingo/lingo-gr.y" + { (yyval.node) = new BinaryOpNode(LC::c_le, (yyvsp[-2].node), (yyvsp[0].node)); } +#line 2384 "engines/director/lingo/lingo-gr.cpp" + break; + + case 118: /* expr: expr tAND expr */ +#line 460 "engines/director/lingo/lingo-gr.y" + { (yyval.node) = new BinaryOpNode(LC::c_and, (yyvsp[-2].node), (yyvsp[0].node)); } +#line 2390 "engines/director/lingo/lingo-gr.cpp" + break; + + case 119: /* expr: expr tOR expr */ +#line 461 "engines/director/lingo/lingo-gr.y" + { (yyval.node) = new BinaryOpNode(LC::c_or, (yyvsp[-2].node), (yyvsp[0].node)); } +#line 2396 "engines/director/lingo/lingo-gr.cpp" + break; + + case 120: /* expr: expr '&' expr */ +#line 462 "engines/director/lingo/lingo-gr.y" + { (yyval.node) = new BinaryOpNode(LC::c_ampersand, (yyvsp[-2].node), (yyvsp[0].node)); } +#line 2402 "engines/director/lingo/lingo-gr.cpp" + break; + + case 121: /* expr: expr tCONCAT expr */ +#line 463 "engines/director/lingo/lingo-gr.y" + { (yyval.node) = new BinaryOpNode(LC::c_concat, (yyvsp[-2].node), (yyvsp[0].node)); } +#line 2408 "engines/director/lingo/lingo-gr.cpp" + break; + + case 122: /* expr: expr tCONTAINS expr */ +#line 464 "engines/director/lingo/lingo-gr.y" + { (yyval.node) = new BinaryOpNode(LC::c_contains, (yyvsp[-2].node), (yyvsp[0].node)); } +#line 2414 "engines/director/lingo/lingo-gr.cpp" + break; + + case 123: /* expr: expr tSTARTS expr */ +#line 465 "engines/director/lingo/lingo-gr.y" + { (yyval.node) = new BinaryOpNode(LC::c_starts, (yyvsp[-2].node), (yyvsp[0].node)); } +#line 2420 "engines/director/lingo/lingo-gr.cpp" + break; + + case 124: /* exprlist: %empty */ +#line 468 "engines/director/lingo/lingo-gr.y" + { (yyval.nodelist) = new NodeList; } +#line 2426 "engines/director/lingo/lingo-gr.cpp" + break; + + case 126: /* nonemptyexprlist: expr */ +#line 472 "engines/director/lingo/lingo-gr.y" { NodeList *list = new NodeList; list->push_back((yyvsp[0].node)); (yyval.nodelist) = list; } -#line 2322 "engines/director/lingo/lingo-gr.cpp" +#line 2435 "engines/director/lingo/lingo-gr.cpp" break; - case 121: /* nonemptyexprlist: nonemptyexprlist ',' expr */ -#line 462 "engines/director/lingo/lingo-gr.y" + case 127: /* nonemptyexprlist: nonemptyexprlist ',' expr */ +#line 476 "engines/director/lingo/lingo-gr.y" { (yyvsp[-2].nodelist)->push_back((yyvsp[0].node)); (yyval.nodelist) = (yyvsp[-2].nodelist); } -#line 2330 "engines/director/lingo/lingo-gr.cpp" +#line 2443 "engines/director/lingo/lingo-gr.cpp" break; -#line 2334 "engines/director/lingo/lingo-gr.cpp" +#line 2447 "engines/director/lingo/lingo-gr.cpp" default: break; } @@ -2529,7 +2642,7 @@ yyreturn: return yyresult; } -#line 467 "engines/director/lingo/lingo-gr.y" +#line 481 "engines/director/lingo/lingo-gr.y" int yyreport_syntax_error(const yypcontext_t *ctx) { diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y index 73f4e4e8011..4030e5758da 100644 --- a/engines/director/lingo/lingo-gr.y +++ b/engines/director/lingo/lingo-gr.y @@ -164,7 +164,7 @@ static void checkEnd(Common::String *token, Common::String *expect, bool require %type idlist nonemptyidlist // STATEMENT -%type stmt stmtoneliner proc definevars ifstmt ifelsestmt +%type stmt stmtoneliner proc definevars ifstmt ifelsestmt loop %type stmtlist nonemptystmtlist %type stmtlistline @@ -354,6 +354,7 @@ nonemptyidlist: ID[item] { stmt: stmtoneliner | ifstmt | ifelsestmt + | loop ; stmtoneliner: proc @@ -362,6 +363,8 @@ stmtoneliner: proc proc: ID '(' exprlist[args] ')' '\n' { $$ = new CmdNode($ID, $args); } | ID exprlist[args] '\n' { $$ = new CmdNode($ID, $args); } + | tNEXT tREPEAT { $$ = new NextRepeatNode(); } + | tEXIT tREPEAT { $$ = new ExitRepeatNode(); } ; definevars: tGLOBAL idlist '\n' { $$ = new GlobalNode($idlist); } @@ -395,6 +398,14 @@ ifelsestmt: tIF expr tTHEN stmt[stmt1] tELSE stmt[stmt2] { $$ = new IfElseStmtNode($expr, $stmtlist1, $stmtlist2); } ; +loop: tREPEAT tWHILE expr '\n' stmtlist tENDREPEAT '\n' { + $$ = new RepeatWhileNode($expr, $stmtlist); } + | tREPEAT tWITH ID tEQ expr[start] tTO expr[end] '\n' stmtlist tENDREPEAT '\n' { + $$ = new RepeatWithToNode($ID, $start, false, $end, $stmtlist); } + | tREPEAT tWITH ID tEQ expr[start] tDOWN tTO expr[end] '\n' stmtlist tENDREPEAT '\n' { + $$ = new RepeatWithToNode($ID, $start, true, $end, $stmtlist); } + ; + stmtlist: /* empty */ { $$ = new NodeList; } | nonemptystmtlist ;