[Scummvm-git-logs] scummvm master -> 729b8285c87559c948145cffc560709a75cd3a60

sev- sev at scummvm.org
Thu May 14 19:50:30 UTC 2020


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
729b8285c8 DIRECTOR: LINGO: Better error recovery, custom error processor


Commit: 729b8285c87559c948145cffc560709a75cd3a60
    https://github.com/scummvm/scummvm/commit/729b8285c87559c948145cffc560709a75cd3a60
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2020-05-14T21:50:16+02:00

Commit Message:
DIRECTOR: LINGO: Better error recovery, custom error processor

This bumps bison requirement to 3.6

Changed paths:
    engines/director/lingo/lingo-gr.cpp
    engines/director/lingo/lingo-gr.h
    engines/director/lingo/lingo-gr.y
    engines/director/lingo/lingo-lex.cpp
    engines/director/lingo/lingo-lex.l
    engines/director/lingo/lingo.cpp
    engines/director/lingo/lingo.h


diff --git a/engines/director/lingo/lingo-gr.cpp b/engines/director/lingo/lingo-gr.cpp
index 44dcbe7b8a..b89389087a 100644
--- a/engines/director/lingo/lingo-gr.cpp
+++ b/engines/director/lingo/lingo-gr.cpp
@@ -86,15 +86,8 @@ extern void lex_unput(int c);
 extern bool lex_check_parens();
 
 using namespace Director;
-void yyerror(const char *s) {
-	// Director parser till D3 was forgiving for any hanging parentheses
-	if (g_director->getVersion() <= 4) {
-		if (lex_check_parens()) {
-			warning("# LINGO: Ignoring trailing parens");
-			return;
-		}
-	}
 
+void yyerror(const char *s) {
 	g_lingo->_hadError = true;
 	warning("######################  LINGO: %s at line %d col %d", s, g_lingo->_linenumber, g_lingo->_colnumber);
 }
@@ -109,7 +102,7 @@ void checkEnd(Common::String *token, const char *expect, bool required) {
 }
 
 
-#line 113 "engines/director/lingo/lingo-gr.cpp"
+#line 106 "engines/director/lingo/lingo-gr.cpp"
 
 # ifndef YY_CAST
 #  ifdef __cplusplus
@@ -247,7 +240,7 @@ extern int yydebug;
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 96 "engines/director/lingo/lingo-gr.y"
+#line 89 "engines/director/lingo/lingo-gr.y"
 
 	Common::String *s;
 	int i;
@@ -267,7 +260,7 @@ union YYSTYPE
 		Common::String *field;
 	} objectref;
 
-#line 271 "engines/director/lingo/lingo-gr.cpp"
+#line 264 "engines/director/lingo/lingo-gr.cpp"
 
 };
 typedef union YYSTYPE YYSTYPE;
@@ -749,7 +742,7 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  129
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   1657
+#define YYLAST   2363
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  104
@@ -815,24 +808,24 @@ static const yytype_int8 yytranslate[] =
   /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
 static const yytype_int16 yyrline[] =
 {
-       0,   151,   151,   152,   154,   155,   156,   157,   159,   165,
-     169,   180,   181,   182,   188,   195,   201,   208,   214,   221,
-     232,   239,   240,   241,   243,   244,   245,   246,   248,   249,
-     254,   265,   282,   294,   305,   307,   312,   316,   321,   325,
-     335,   346,   347,   349,   356,   366,   377,   379,   385,   391,
-     398,   400,   402,   403,   404,   406,   412,   415,   418,   422,
-     426,   430,   438,   439,   441,   442,   443,   446,   449,   452,
-     455,   461,   466,   472,   473,   474,   475,   476,   477,   478,
-     479,   480,   481,   482,   483,   484,   485,   486,   487,   488,
-     489,   490,   491,   492,   493,   494,   496,   497,   498,   499,
-     500,   501,   502,   503,   505,   508,   510,   511,   512,   513,
-     514,   515,   515,   516,   516,   517,   518,   521,   524,   525,
-     527,   531,   536,   540,   545,   549,   561,   562,   563,   564,
-     568,   572,   577,   578,   580,   584,   588,   592,   592,   622,
-     622,   622,   629,   630,   630,   637,   647,   655,   655,   657,
-     658,   659,   661,   662,   663,   665,   667,   675,   676,   677,
-     679,   680,   682,   684,   685,   686,   687,   689,   690,   692,
-     693,   695,   699
+       0,   144,   144,   145,   147,   148,   149,   151,   157,   161,
+     172,   173,   174,   180,   187,   193,   200,   206,   213,   224,
+     231,   232,   233,   235,   236,   237,   238,   240,   241,   246,
+     257,   274,   286,   297,   299,   304,   308,   313,   317,   327,
+     338,   339,   341,   348,   358,   369,   371,   377,   383,   390,
+     392,   394,   395,   396,   398,   404,   407,   410,   414,   418,
+     422,   430,   431,   432,   443,   444,   445,   448,   451,   454,
+     457,   463,   468,   474,   475,   476,   477,   478,   479,   480,
+     481,   482,   483,   484,   485,   486,   487,   488,   489,   490,
+     491,   492,   493,   494,   495,   496,   498,   499,   500,   501,
+     502,   503,   504,   505,   507,   510,   512,   513,   514,   515,
+     516,   517,   517,   518,   518,   519,   520,   523,   526,   527,
+     529,   533,   538,   542,   547,   551,   563,   564,   565,   566,
+     570,   574,   579,   580,   582,   586,   590,   594,   594,   624,
+     624,   624,   631,   632,   632,   639,   649,   657,   657,   659,
+     660,   661,   663,   664,   665,   667,   669,   677,   678,   679,
+     681,   682,   684,   686,   687,   688,   689,   691,   692,   694,
+     695,   697,   701
 };
 #endif
 
@@ -844,25 +837,26 @@ static const yytype_int16 yyrline[] =
    YYSYMBOL.  No bounds checking.  */
 static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
 
-/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
-static const char *const yytname[] =
+static const char *
+yysymbol_name (yysymbol_kind_t yysymbol)
 {
-  "\"end of file\"", "error", "\"invalid token\"", "UNARY", "CASTREF",
-  "VOID", "VAR", "POINT", "RECT", "ARRAY", "OBJECT", "REFERENCE",
-  "LEXERROR", "PARRAY", "INT", "ARGC", "ARGCNORET", "THEENTITY",
-  "THEENTITYWITHID", "THEMENUITEMENTITY", "THEMENUITEMSENTITY", "FLOAT",
-  "BLTIN", "FBLTIN", "RBLTIN", "THEFBLTIN", "ID", "STRING", "HANDLER",
-  "SYMBOL", "ENDCLAUSE", "tPLAYACCEL", "tMETHOD", "THEOBJECTFIELD",
-  "THEOBJECTREF", "tDOWN", "tELSE", "tELSIF", "tEXIT", "tGLOBAL", "tGO",
-  "tIF", "tIN", "tINTO", "tLOOP", "tMACRO", "tMOVIE", "tNEXT", "tOF",
-  "tPREVIOUS", "tPUT", "tREPEAT", "tSET", "tTHEN", "tTO", "tWHEN", "tWITH",
-  "tWHILE", "tNLELSE", "tFACTORY", "tOPEN", "tPLAY", "tINSTANCE", "tGE",
-  "tLE", "tEQ", "tNEQ", "tAND", "tOR", "tNOT", "tMOD", "tAFTER", "tBEFORE",
-  "tCONCAT", "tCONTAINS", "tSTARTS", "tCHAR", "tITEM", "tLINE", "tWORD",
-  "tSPRITE", "tINTERSECTS", "tWITHIN", "tTELL", "tPROPERTY", "tON",
-  "tENDIF", "tENDREPEAT", "tENDTELL", "'<'", "'>'", "'&'", "'+'", "'-'",
-  "'*'", "'/'", "'%'", "'\\n'", "'('", "')'", "','", "'['", "']'", "':'",
+  static const char *const yy_sname[] =
+  {
+  "end of file", "error", "invalid token", "UNARY", "CASTREF", "VOID",
+  "VAR", "POINT", "RECT", "ARRAY", "OBJECT", "REFERENCE", "LEXERROR",
+  "PARRAY", "INT", "ARGC", "ARGCNORET", "THEENTITY", "THEENTITYWITHID",
+  "THEMENUITEMENTITY", "THEMENUITEMSENTITY", "FLOAT", "BLTIN", "FBLTIN",
+  "RBLTIN", "THEFBLTIN", "ID", "STRING", "HANDLER", "SYMBOL", "ENDCLAUSE",
+  "tPLAYACCEL", "tMETHOD", "THEOBJECTFIELD", "THEOBJECTREF", "tDOWN",
+  "tELSE", "tELSIF", "tEXIT", "tGLOBAL", "tGO", "tIF", "tIN", "tINTO",
+  "tLOOP", "tMACRO", "tMOVIE", "tNEXT", "tOF", "tPREVIOUS", "tPUT",
+  "tREPEAT", "tSET", "tTHEN", "tTO", "tWHEN", "tWITH", "tWHILE", "tNLELSE",
+  "tFACTORY", "tOPEN", "tPLAY", "tINSTANCE", "tGE", "tLE", "tEQ", "tNEQ",
+  "tAND", "tOR", "tNOT", "tMOD", "tAFTER", "tBEFORE", "tCONCAT",
+  "tCONTAINS", "tSTARTS", "tCHAR", "tITEM", "tLINE", "tWORD", "tSPRITE",
+  "tINTERSECTS", "tWITHIN", "tTELL", "tPROPERTY", "tON", "tENDIF",
+  "tENDREPEAT", "tENDTELL", "'<'", "'>'", "'&'", "'+'", "'-'", "'*'",
+  "'/'", "'%'", "'\\n'", "'('", "')'", "','", "'['", "']'", "':'",
   "$accept", "program", "programline", "asgn", "stmtoneliner",
   "stmtonelinerwithif", "stmt", "tellstart", "ifstmt", "elseifstmtlist",
   "elseifstmt", "ifoneliner", "repeatwhile", "repeatwith", "if", "elseif",
@@ -872,12 +866,8 @@ static const char *const yytname[] =
   "$@4", "$@5", "$@6", "on", "$@7", "argdef", "endargdef", "argstore",
   "macro", "arglist", "nonemptyarglist", "list", "valuelist", "linearlist",
   "proplist", "proppair", YY_NULLPTR
-};
-
-static const char *
-yysymbol_name (yysymbol_kind_t yysymbol)
-{
-  return yytname[yysymbol];
+  };
+  return yy_sname[yysymbol];
 }
 #endif
 
@@ -905,7 +895,7 @@ static const yytype_int16 yytoknum[] =
 #define yypact_value_is_default(Yyn) \
   ((Yyn) == YYPACT_NINF)
 
-#define YYTABLE_NINF (-5)
+#define YYTABLE_NINF (-164)
 
 #define yytable_value_is_error(Yyn) \
   0
@@ -914,44 +904,44 @@ static const yytype_int16 yytoknum[] =
      STATE-NUM.  */
 static const yytype_int16 yypact[] =
 {
-     321,   -77,  -275,  -275,    31,  -275,   941,   978,    31,   -15,
-    1060,  -275,  -275,  -275,  -275,  -275,  -275,     4,  -275,   822,
-    -275,  -275,    10,   204,    -7,    92,    -2,    44,  1097,   859,
-      55,  1097,  1097,  1097,  1097,  1097,  1097,  1097,  -275,  -275,
-    1097,  1097,  1097,   406,    97,     9,  -275,  -275,  -275,  -275,
-    1097,   -26,  1097,   658,  -275,  1549,  -275,  -275,  -275,  -275,
-    -275,  -275,  -275,  -275,  -275,  -275,  -275,  -275,    15,   204,
-    1097,  1549,    26,  1097,    26,  -275,    31,  1097,  1549,    28,
-    1097,  -275,  -275,    77,  -275,  1097,  -275,    71,  -275,  1136,
-    -275,   104,  -275,   108,   398,   126,  -275,   -47,    31,    31,
-     -33,   100,   102,  -275,  1446,  1136,  -275,  -275,    56,  -275,
-    1169,  1202,  1235,  1268,  1516,  1433,   132,   133,  -275,  -275,
-    1479,    57,    59,  -275,  1549,    61,    64,    65,  -275,  -275,
-     321,  1549,  -275,  -275,  1549,  -275,  -275,  1097,  1549,  -275,
-    -275,  1097,  1097,  1097,  1097,  1097,  1097,  1097,  1097,  1097,
-    1097,  1097,  1097,  1097,  1097,  1097,  1097,  1097,   140,  1097,
-     398,  1479,    16,  1097,    20,  -275,    22,  1097,    26,   140,
-    -275,    69,  1549,  1097,  -275,  -275,    31,    17,  1097,  1097,
-    -275,  1097,  1097,   -14,   122,  1097,  1097,  1097,  -275,  1097,
-    -275,   148,  1097,  1097,  1097,  1097,  1097,  1097,  1097,  1097,
-    1097,  1097,  -275,  -275,  -275,    78,  -275,  -275,    31,    31,
-    -275,  1097,    85,  -275,  -275,  1097,  1097,   124,  -275,  1549,
-       7,     7,     7,     7,  1562,  1562,  -275,    -4,     7,     7,
-       7,     7,    -4,    13,    13,  -275,  -275,  -275,   -35,  -275,
-    1549,  -275,  -275,  1549,   -28,   158,  1549,  -275,   142,  -275,
-    -275,  1549,  1549,  1549,     7,  1097,  1097,   170,  1549,     7,
-    1549,  1549,  -275,  1549,  1301,  1549,  1334,  1549,  1367,  1549,
-    1400,  1549,  1549,   740,  -275,   171,  -275,  -275,  1549,    57,
-      59,  -275,   576,  1549,  1549,  -275,   145,  -275,   173,  -275,
-    -275,   140,  1097,  1549,     7,    31,  1097,  1097,  1097,  1097,
-    -275,   576,  -275,  -275,  -275,   113,  -275,   -16,   576,   740,
-    -275,  -275,  -275,   -24,  1549,   147,  1549,  1549,  1549,  1549,
-    -275,   114,  -275,   576,   149,  1097,  -275,  -275,   494,   576,
-    -275,  1097,  -275,   117,  1097,  1549,    87,   -27,   180,  -275,
-    1549,  -275,  1549,  -275,  -275,  -275,  -275,  1097,   121,  -275,
-    -275,  -275,   111,   576,  -275,   576,  -275,  1549,  -275,   740,
-     182,   576,   125,   576,   160,  -275,  -275,   129,  -275,   131,
-    -275,   134,  -275,  -275,   576,  -275,  -275
+     783,   -77,  -275,  -275,    31,  -275,   605,   321,    31,   -15,
+     506,  -275,  -275,  -275,  -275,  -275,  -275,     4,  -275,  1630,
+    -275,  -275,    10,  1786,    -7,    92,    39,    44,  1868,  1667,
+      50,  1868,  1868,  1868,  1868,  1868,  1868,  1868,  -275,  -275,
+    1868,  1868,  1868,   416,    81,     0,  -275,  -275,  -275,  -275,
+    1868,   -26,  1868,  1466,  -275,  2255,  -275,  -275,  -275,  -275,
+    -275,  -275,  -275,  -275,  -275,  -275,  -275,  -275,    19,  1786,
+    1749,  2255,    26,  1749,    26,  -275,    31,  1749,  2255,    28,
+     694,  -275,  -275,    77,  -275,  1868,  -275,    60,  -275,   408,
+    -275,   104,  -275,   108,   153,   126,  -275,   -47,    31,    31,
+     -14,    59,   103,  -275,  2152,   408,  -275,  -275,    58,  -275,
+    1860,  1908,  1941,  1974,  2222,  2139,   133,   134,  -275,  -275,
+    2185,    61,    62,  -275,  2255,    64,    63,    69,  -275,  -275,
+     783,  2255,  -275,  -275,  2255,  -275,  -275,  1868,  2255,  -275,
+    -275,  1868,  1868,  1868,  1868,  1868,  1868,  1868,  1868,  1868,
+    1868,  1868,  1868,  1868,  1868,  1868,  1868,  1868,   136,  1749,
+     153,  2185,    20,  1868,    22,  -275,    24,  1868,    26,   136,
+    -275,    70,  2255,  1868,  -275,  -275,    31,    17,  1868,  1868,
+    -275,  1868,  1868,     8,   129,  1868,  1868,  1868,  -275,  1868,
+    -275,   148,  1868,  1868,  1868,  1868,  1868,  1868,  1868,  1868,
+    1868,  1868,  -275,  -275,  -275,    78,  -275,  -275,    31,    31,
+    -275,  1868,    87,  -275,  -275,  1868,  1868,   131,  -275,  2255,
+       7,     7,     7,     7,  2268,  2268,  -275,    -4,     7,     7,
+       7,     7,    -4,    13,    13,  -275,  -275,  -275,   -76,  -275,
+    2255,  -275,  -275,  2255,   -28,   159,  2255,  -275,   154,  -275,
+    -275,  2255,  2255,  2255,     7,  1868,  1868,   172,  2255,     7,
+    2255,  2255,  -275,  2255,  2007,  2255,  2040,  2255,  2073,  2255,
+    2106,  2255,  2255,  1548,  -275,   173,  -275,  -275,  2255,    61,
+      62,  -275,  1210,  2255,  2255,  -275,   147,  -275,   175,  -275,
+    -275,   136,  1868,  2255,     7,    31,  1868,  1868,  1868,  1868,
+    -275,  1295,  -275,  -275,  -275,   115,  -275,   -16,  1124,  1548,
+    -275,  -275,  -275,    15,  2255,   149,  2255,  2255,  2255,  2255,
+    -275,   116,  -275,  1210,   152,  1868,  -275,  -275,   869,   954,
+    -275,  1868,  -275,   120,  1868,  2255,   118,   -27,   182,  -275,
+    2255,  -275,  2255,  -275,  -275,  -275,  -275,  1868,   125,  -275,
+    -275,  -275,   112,  1039,  -275,  1210,  -275,  2255,  -275,  1548,
+     187,  1210,   135,  1380,   176,  -275,  -275,   143,  -275,   145,
+    -275,   146,  -275,  -275,  1124,  -275,  -275
 };
 
   /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@@ -959,55 +949,55 @@ static const yytype_int16 yypact[] =
      means the default is an error.  */
 static const yytype_uint8 yydefact[] =
 {
-       0,     0,    56,    61,     0,    57,   157,   157,     0,     0,
-      60,    59,    58,   137,   143,    71,    72,   110,   111,     0,
-      48,   139,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,    55,    60,     0,    56,     0,     0,     0,     0,
+       0,    58,    57,   137,   143,    71,    72,   110,   111,     0,
+      47,   139,     0,     0,     0,     0,     0,     0,     0,     0,
        0,     0,     0,     0,     0,     0,     0,     0,   113,   147,
-       0,     0,     0,   163,     0,     2,    73,    28,     6,    29,
-       0,     0,     0,     0,    64,    22,   105,    65,    23,   107,
-     108,     5,    50,    21,    63,     7,    60,    70,    60,     0,
-     157,   158,   117,   157,    67,   104,     0,   157,   160,   156,
-     157,    50,   109,     0,   126,     0,   127,     0,   128,   129,
-     131,     0,    34,     0,   106,     0,    46,     0,     0,     0,
+       0,     0,     0,     0,     0,     2,    73,    27,     6,    28,
+       0,     0,     0,     0,    64,    21,   105,    65,    22,   107,
+     108,     5,    49,    20,    62,    63,    59,    70,    59,     0,
+       0,   158,   117,     0,    67,   104,     0,     0,   160,   156,
+       0,    49,   109,     0,   126,     0,   127,     0,   128,   129,
+     131,     0,    33,     0,   106,     0,    45,     0,     0,     0,
        0,     0,     0,   142,   119,   134,   136,   124,   115,    87,
        0,     0,     0,     0,     0,     0,     0,     0,    92,    93,
-       0,    59,    58,   164,   167,     0,   165,   166,   169,     1,
-       0,    51,    50,    50,    51,    51,    27,     0,    25,    26,
-      24,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   149,   157,
+       0,    58,    57,   164,   167,     0,   165,   166,   169,     1,
+       0,    50,    49,    49,    50,    50,    26,     0,    24,    25,
+      23,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,   149,     0,
        0,   158,     0,     0,     0,    69,     0,     0,   138,   149,
      120,   112,   133,     0,   130,   140,     0,     0,     0,     0,
-      47,     0,     0,     0,     0,     0,     0,     0,    55,     0,
+      46,     0,     0,     0,     0,     0,     0,     0,    54,     0,
      135,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,    38,    38,   122,   114,   148,    62,     0,     0,
-     162,     0,     0,     3,    52,     0,     0,     0,    35,    51,
+       0,     0,    37,    37,   122,   114,   148,    61,     0,     0,
+     162,     0,     0,     3,    51,     0,     0,     0,    34,    50,
       83,    84,    81,    82,    85,    86,    78,    89,    90,    91,
       80,    79,    88,    74,    75,    76,    77,   150,     0,   116,
-     159,    66,    68,   161,     0,     0,   132,    50,     0,     8,
-       9,    11,    12,    16,    14,     0,     0,     0,    15,    13,
-      20,   118,   125,    96,     0,    98,     0,   100,     0,   102,
-       0,    94,    95,     0,    52,     0,   172,   171,   168,     0,
-       0,   170,    51,    51,    51,    52,     0,   155,     0,   155,
-     121,   149,     0,    17,    18,     0,     0,     0,     0,     0,
-      51,    51,   123,    53,    54,     0,    52,     0,    51,     0,
-      52,   151,    52,     0,    10,     0,    97,    99,   101,   103,
-      37,     0,    30,    51,     0,     0,    41,    51,   146,   144,
-     155,     0,    36,     0,     0,    51,    51,     0,   152,    52,
-      19,    33,    51,    52,    50,    49,    42,     0,     0,    50,
-      45,   153,   145,   141,    52,    51,    52,    51,    39,     0,
-       0,    51,     0,    51,     0,    51,   154,     0,    31,     0,
-      52,     0,    32,    40,    51,    44,    43
+     159,    66,    68,   161,     0,     0,   132,    49,     0,     7,
+       8,    10,    11,    15,    13,     0,     0,     0,    14,    12,
+      19,   118,   125,    96,     0,    98,     0,   100,     0,   102,
+       0,    94,    95,     0,    51,     0,   172,   171,   168,     0,
+       0,   170,     0,    50,    50,    51,     0,   155,     0,   155,
+     121,   149,     0,    16,    17,     0,     0,     0,     0,     0,
+      50,     0,   123,    52,    53,     0,    51,     0,     0,     0,
+      51,   151,    51,     0,     9,     0,    97,    99,   101,   103,
+      36,     0,    29,     0,     0,     0,    40,    50,     0,     0,
+     155,     0,    35,     0,     0,    50,    50,     0,   152,    51,
+      18,    32,    50,    51,    49,    48,    41,     0,     0,    49,
+      44,   153,   145,     0,    51,     0,    51,    50,    38,     0,
+       0,     0,     0,     0,     0,    50,   154,     0,    30,     0,
+      51,     0,    31,    39,     0,    43,    42
 };
 
   /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int16 yypgoto[] =
 {
-    -275,    89,  -275,  -275,  -267,  -275,     3,    23,  -275,  -275,
-    -275,  -275,  -275,  -275,   179,  -275,   -79,   -48,    82,  -275,
-       6,    -6,  -275,    46,   186,  -275,  -275,  -275,  -275,  -275,
+    -275,   107,  -275,  -275,  -267,  -275,     3,    30,  -275,  -275,
+    -275,  -275,  -275,  -275,   185,  -275,   -79,   -48,   630,  -275,
+       6,    -6,  -275,    74,   186,  -275,  -275,  -275,  -275,  -275,
     -275,   -21,  -275,  -275,  -275,  -275,  -275,  -275,  -275,  -275,
-    -164,  -275,  -274,   187,     5,  -275,  -275,  -275,  -275,  -275,
-      29
+    -164,  -275,  -274,   188,     5,  -275,  -275,  -275,  -275,  -275,
+      42
 };
 
   /* YYDEFGOTO[NTERM-NUM].  */
@@ -1028,313 +1018,448 @@ static const yytype_int16 yytable[] =
 {
       71,    71,   169,    48,    78,   244,   300,   181,   106,   349,
       67,    72,    74,    89,    75,   312,   132,    94,   182,   324,
-      65,   185,   104,   105,   102,   109,   110,   111,   112,   113,
-     114,   115,   186,    76,   118,   119,   120,   124,   325,   133,
-     255,     8,   327,   249,   131,     2,   134,   138,     3,    95,
-      96,   256,     5,   215,   216,    82,   339,    66,    11,   350,
-      12,    92,   287,   160,   161,   288,   147,   161,   174,   289,
-     103,   161,   288,   330,    71,   162,   288,   147,   164,   172,
-     148,   107,   165,   147,   190,   168,   217,   218,   154,   155,
-     156,   157,   365,    32,    33,    34,    35,   129,   153,   154,
-     155,   156,   157,   170,   183,   184,   130,   156,   157,    97,
-      98,    99,   279,   159,   280,   239,   163,   173,   100,   241,
-     163,   242,   163,   344,   345,   101,   163,   313,   167,    42,
+      65,   287,   104,   105,   288,   109,   110,   111,   112,   113,
+     114,   115,     1,    76,   118,   119,   120,   124,   325,   133,
+     185,     8,   327,   249,   131,     2,   134,   138,     3,    95,
+      96,   186,     5,   215,   216,    82,   339,    66,    11,   350,
+      12,    92,   255,   160,   161,   102,   147,   161,   174,   289,
+     103,   161,   288,   256,    71,   162,   107,   147,   164,   172,
+     148,   129,   165,   147,   190,   168,   217,   218,   154,   155,
+     156,   157,   365,    32,    33,    34,    35,   130,   153,   154,
+     155,   156,   157,   170,   183,   184,   173,   156,   157,    97,
+      98,    99,   330,   187,   279,   288,   280,   159,   100,   239,
+     163,   241,   163,   242,   163,   101,   163,   313,   167,    42,
      175,   219,    43,    48,   176,   220,   221,   222,   223,   224,
      225,   226,   227,   228,   229,   230,   231,   232,   233,   234,
-     235,   236,   180,    71,   187,   188,   191,   240,   204,   206,
-     208,   243,   209,   210,   211,   212,   237,   246,   291,   245,
-     257,   286,   251,   252,   262,   253,   254,   285,   275,   258,
-     259,   260,   248,   261,   290,   292,   263,   264,   265,   266,
-     267,   268,   269,   270,   271,   272,   295,   302,   309,   311,
-     322,   331,   332,   334,   341,   278,   351,   358,   366,   283,
-     284,   360,   368,   370,   276,   277,   372,   373,     2,   213,
-     375,     3,     4,   250,    93,     5,   274,     7,     8,     9,
-      68,    11,   137,    12,   305,   306,   307,    15,    16,   139,
-     140,   281,     0,     0,     0,     0,     0,     0,     0,   293,
-     294,     0,   320,   321,    69,     0,    25,     0,     0,     0,
+     235,   236,   180,    71,   344,   345,   188,   240,   191,   204,
+     206,   243,   237,   211,   208,   209,   210,   246,   291,   212,
+     245,   286,   251,   252,   262,   253,   254,   257,   275,   258,
+     259,   260,   248,   261,   285,   290,   263,   264,   265,   266,
+     267,   268,   269,   270,   271,   272,   177,   292,   295,   302,
+     309,   311,   322,   331,   332,   278,   334,   341,   351,   283,
+     284,   358,   360,   366,   276,   277,   141,   142,   143,   144,
+     145,   146,   368,   147,   178,   179,   148,   149,   150,   370,
+     372,   373,   375,   274,   305,   306,   307,   213,   137,   139,
+       0,   140,   151,   152,   153,   154,   155,   156,   157,   293,
+     294,   250,   320,   321,   281,     0,     0,     0,     0,     0,
      326,     0,     0,     0,     0,   356,     0,     0,     0,     0,
-     359,     0,     0,    31,     0,   333,     0,     0,     0,   337,
-      32,    33,    34,    35,    36,     0,   314,   343,   348,     0,
-     316,   317,   318,   319,   354,     0,    40,    41,     0,     0,
-       0,   315,    42,     0,     0,    43,     0,   362,     0,   364,
+     359,     0,     0,     0,     0,   333,     0,     0,     0,   337,
+       0,     0,     0,     0,     0,     0,   314,   343,   348,     0,
+     316,   317,   318,   319,   354,     0,     0,     0,     0,     0,
+       0,   315,     0,     0,     0,     0,     0,   362,     0,   364,
        0,     0,     0,   367,     0,   369,     0,   371,     0,   335,
-       0,    -4,     1,     0,     0,   340,   376,     0,   342,     0,
+       0,  -157,     1,     0,     0,   340,   376,     0,   342,     0,
        0,     0,     0,     0,     0,     2,     0,     0,     3,     4,
-       0,   357,     5,     6,     7,     8,     9,    10,    11,     0,
-      12,     0,    13,    14,    15,    16,   301,     0,     0,    17,
-      18,    19,    20,     0,     0,     0,    21,   308,    22,     0,
-       0,    23,    24,    25,     0,     0,    26,     0,     0,     0,
-      27,    28,    29,    30,     0,     0,     0,     0,   323,     0,
-      31,     0,   328,     0,   329,     0,     0,    32,    33,    34,
-      35,    36,     0,     0,    37,    38,    39,     0,     0,     0,
-       0,     0,     0,    40,    41,     0,     0,     0,    -4,    42,
-       2,   353,    43,     3,     4,   355,     0,     5,     0,     7,
-       8,     9,    68,   121,     0,   122,   361,     0,   363,    15,
-      16,   177,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,     0,   374,     0,     0,     0,    69,     0,    25,     0,
-       0,   141,   142,   143,   144,   145,   146,     0,   147,   178,
-     179,   148,   149,   150,     0,    31,     0,     0,     0,     0,
+       0,   357,     5,  -157,     7,     8,     9,    68,    11,     0,
+      12,  -157,  -157,     0,    15,    16,  -157,  -157,  -157,  -157,
+    -157,  -157,  -157,     0,  -157,     0,     0,  -157,  -157,  -157,
+       0,    69,  -157,    25,  -157,  -157,  -157,  -157,     0,     0,
+       0,  -157,  -157,  -157,  -157,  -157,  -157,  -157,  -157,  -157,
+      31,  -157,  -157,  -157,  -157,  -157,  -157,    32,    33,    34,
+      35,    36,  -157,  -157,  -157,  -157,     0,  -157,  -157,  -157,
+    -157,  -157,  -157,    40,    41,  -157,  -157,     1,  -157,    73,
+    -157,  -157,    43,  -157,     0,     0,     0,     0,     0,     0,
+       2,     0,     0,     3,     4,     0,     0,     5,     0,     7,
+       8,     9,    68,   121,     0,   122,     0,     0,     0,    15,
+      16,     0,     0,     0,    85,     0,    87,     0,     0,     0,
+       0,     0,     0,     0,     0,     0,    69,     0,    25,     0,
+       0,   141,   142,   143,   144,   145,   146,     0,   147,     0,
+       0,   148,   149,   150,     0,    31,     0,     0,     0,     0,
        0,     0,    32,    33,    34,    35,    36,   151,   152,   153,
-     154,   155,   156,   157,     0,     0,     0,     0,    40,    41,
-       0,     0,     0,     0,    42,     0,     0,    43,     2,   123,
-       0,     3,     4,     0,     0,     5,     6,     7,     8,     9,
-      10,    11,     0,    12,   338,    13,     0,    15,    16,     0,
+     154,   155,   156,   157,     0,     0,   -59,     1,    40,    41,
+       0,     0,     0,     0,    42,     0,     0,    43,  -163,   123,
+       2,     0,     0,     3,     4,     0,     0,     5,   -59,     7,
+       8,     9,    68,    11,     0,    12,   -59,   -59,     0,    15,
+      16,     0,   -59,   -59,   -59,   -59,   -59,   -59,     0,     0,
+       0,     0,     0,   -59,     0,     0,    69,   -59,    25,     0,
+       0,   -59,     0,     0,     0,     0,   -59,   -59,   -59,   -59,
+     -59,   -59,   -59,   -59,   -59,    31,   -59,     0,     0,   -59,
+     -59,   -59,    32,    33,    34,    35,    36,     0,     0,   -59,
+     -59,     0,   -59,   -59,   -59,   -59,   -59,   -59,    40,    41,
+     -59,   -59,     0,   -59,    77,  -157,     1,    43,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,     2,
+       0,     0,     3,     4,     0,     0,     5,  -157,     7,     8,
+       9,    68,    11,     0,    12,  -157,  -157,     0,    15,    16,
+       0,  -157,  -157,  -157,  -157,  -157,  -157,     0,     0,     0,
+       0,     0,  -157,     0,     0,    69,  -157,    25,     0,     0,
+    -157,     0,     0,     0,     0,  -157,  -157,  -157,     0,     0,
+       0,     0,     0,     0,    31,     0,     0,     0,     0,     0,
+       0,    32,    33,    34,    35,    36,     0,     0,  -157,  -157,
+       0,  -157,  -157,  -157,  -157,     1,     0,    40,    41,     0,
+       0,     0,  -157,    70,     0,  -157,    43,     0,     2,     0,
+       0,     3,     4,     0,     0,     5,  -157,     7,     8,     9,
+      68,    11,     0,    12,  -157,  -157,     0,    15,    16,     0,
+    -157,  -157,  -157,  -157,  -157,  -157,     0,     0,     0,     0,
+       0,  -157,     0,     0,    69,  -157,    25,     0,     0,  -157,
+       0,     0,     0,     0,  -157,  -157,  -157,     0,     0,     0,
+       0,     0,     0,    31,     0,     0,     0,     0,     0,     0,
+      32,    33,    34,    35,    36,     0,     0,  -157,  -157,     0,
+    -157,  -157,  -157,    -4,     1,     0,    40,    41,     0,     0,
+       0,  -157,    42,     0,  -157,    43,     0,     2,     0,     0,
+       3,     4,     0,     0,     5,     6,     7,     8,     9,    10,
+      11,     0,    12,     0,    13,    14,    15,    16,     0,     0,
+       0,    17,    18,    19,    20,     0,     0,     0,    21,     0,
+      22,     0,     0,    23,    24,    25,     0,     0,    26,     0,
+       0,     0,    27,    28,    29,    30,     0,     0,     0,     0,
+       0,     0,    31,     0,     0,     0,     0,     0,     0,    32,
+      33,    34,    35,    36,     0,     0,    37,    38,    39,  -146,
+       1,     0,     0,     0,     0,    40,    41,     0,     0,     0,
+      -4,    42,     0,     2,    43,     0,     3,     4,     0,     0,
+       5,     6,     7,     8,     9,    10,    11,     0,    12,   338,
+      13,     0,    15,    16,   301,     0,     0,    17,    18,    19,
+      20,     0,     0,     0,     0,   308,    22,     0,     0,    23,
+      24,    25,     0,     0,    26,     0,     0,     0,     0,    28,
+      29,    30,     0,     0,     0,     0,   323,     0,    31,     0,
+     328,     0,   329,     0,     0,    32,    33,    34,    35,    36,
+       0,     0,    37,    38,  -144,     1,     0,     0,     0,     0,
+       0,    40,    41,     0,     0,     0,   303,    42,     2,   353,
+      43,     3,     4,   355,     0,     5,     6,     7,     8,     9,
+      10,    11,     0,    12,   361,    13,   363,    15,    16,     0,
        0,     0,    17,    18,    19,    20,     0,     0,     0,     0,
+     374,    22,     0,     0,    23,    24,    25,     0,     0,    26,
+       0,     0,     0,     0,    28,    29,    30,     0,     0,     0,
+       0,     0,     0,    31,     0,     0,     0,     0,     0,     0,
+      32,    33,    34,    35,    36,     0,     0,    37,    38,  -141,
+       1,     0,     0,     0,     0,     0,    40,    41,     0,     0,
+       0,   303,    42,     2,     0,    43,     3,     4,     0,     0,
+       5,     6,     7,     8,     9,    10,    11,     0,    12,     0,
+      13,     0,    15,    16,     0,     0,     0,    17,    18,    19,
+      20,     0,     0,     0,     0,     0,    22,     0,     0,    23,
+      24,    25,     0,     0,    26,     0,     0,     0,     0,    28,
+      29,    30,     0,     0,     0,     0,     0,     0,    31,     0,
+       0,     0,     0,     0,     0,    32,    33,    34,    35,    36,
+       0,     0,    37,    38,     0,     1,     0,     0,     0,     0,
+       0,    40,    41,     0,     0,     0,   303,    42,     2,     0,
+      43,     3,     4,     0,     0,     5,     6,     7,     8,     9,
+      10,    11,     0,    12,     0,    13,     0,    15,    16,     0,
+     -50,   -50,    17,    18,    19,    20,     0,     0,     0,     0,
        0,    22,     0,     0,    23,    24,    25,     0,     0,    26,
        0,     0,     0,     0,    28,    29,    30,     0,     0,     0,
        0,     0,     0,    31,     0,     0,     0,     0,     0,     0,
       32,    33,    34,    35,    36,     0,     0,    37,    38,     0,
-       0,     0,     0,     0,     0,     0,    40,    41,     0,     0,
-       2,   303,    42,     3,     4,    43,     0,     5,     6,     7,
+     -50,     1,     0,     0,     0,     0,    40,    41,     0,     0,
+       0,   303,    42,     0,     2,    43,     0,     3,     4,     0,
+       0,     5,     6,     7,     8,     9,    10,    11,     0,    12,
+       0,    13,     0,    15,    16,     0,     0,     0,    17,    18,
+      19,    20,     0,     0,     0,     0,     0,    22,     0,     0,
+      23,    24,    25,     0,     0,    26,     0,     0,     0,     0,
+      28,    29,    30,     0,     0,     0,     0,     0,     0,    31,
+       0,     0,     0,     0,     0,     0,    32,    33,    34,    35,
+      36,     0,     0,    37,    38,     0,     1,   -50,     0,     0,
+       0,     0,    40,    41,     0,     0,     0,   303,    42,     2,
+       0,    43,     3,     4,     0,     0,     5,     6,     7,     8,
+       9,    10,    11,     0,    12,     0,    13,     0,    15,    16,
+       0,     0,     0,    17,    18,    19,    20,     0,     0,     0,
+       0,     0,    22,     0,     0,    23,    24,    25,     0,     0,
+      26,     0,     0,     0,     0,    28,    29,    30,     0,     0,
+       0,     0,     0,     0,    31,     0,     0,     0,     0,     0,
+       0,    32,    33,    34,    35,    36,     0,     0,    37,    38,
+       0,     1,     0,   -50,     0,     0,     0,    40,    41,     0,
+       0,     0,   303,    42,     2,     0,    43,     3,     4,     0,
+       0,     5,     6,     7,     8,     9,    10,    11,     0,    12,
+       0,    13,     0,    15,    16,     0,     0,     0,    17,    18,
+      19,    20,     0,     0,     0,     0,     0,    22,     0,     0,
+      23,    24,    25,     0,     0,    26,     0,     0,     0,     0,
+      28,    29,    30,     0,     0,     0,     0,     0,     0,    31,
+       0,     0,     0,     0,     0,     0,    32,    33,    34,    35,
+      36,     0,     0,    37,    38,     0,   -50,     1,     0,     0,
+       0,     0,    40,    41,     0,     0,     0,   303,    42,     0,
+       2,    43,     0,     3,     4,     0,     0,     5,     6,     7,
        8,     9,    10,    11,     0,    12,     0,    13,     0,    15,
       16,     0,     0,     0,    17,    18,    19,    20,     0,     0,
-       0,     0,     0,    22,     0,     0,    23,    24,    25,     0,
-       0,    26,     0,     0,     0,     0,    28,    29,    30,     0,
+       0,     0,     0,     0,     0,     0,    23,     0,    25,     0,
+       0,     0,     0,     0,     0,     0,    28,    29,    30,     0,
        0,     0,     0,     0,     0,    31,     0,     0,     0,     0,
-       0,     0,    32,    33,    34,    35,    36,     0,     0,    37,
+       0,     0,    32,    33,    34,    35,    36,     0,     0,     1,
       38,     0,     0,     0,     0,     0,     0,     0,    40,    41,
-       0,     0,     2,   303,    42,     3,     4,    43,     0,     5,
+       0,     0,     2,     0,    42,     3,     4,    43,     0,     5,
        6,     7,     8,     9,    10,    11,     0,    12,     0,    13,
-       0,    15,    16,     0,     0,     0,    17,    18,    19,    20,
+       0,    15,    16,     0,     0,     0,    17,    18,    19,     0,
        0,     0,     0,     0,     0,     0,     0,     0,    23,     0,
       25,     0,     0,     0,     0,     0,     0,     0,    28,    29,
       30,     0,     0,     0,     0,     0,     0,    31,     0,     0,
        0,     0,     0,     0,    32,    33,    34,    35,    36,     0,
-       0,     0,    38,     0,     0,     0,     0,     0,     0,     0,
+       0,     1,    38,     0,     0,     0,     0,     0,     0,     0,
       40,    41,     0,     0,     2,     0,    42,     3,     4,    43,
-       0,     5,     6,     7,     8,     9,    10,    11,     0,    12,
-       0,    13,     0,    15,    16,     0,     0,     0,    17,    18,
-      19,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      23,     0,    25,     0,     0,     0,     0,     0,     0,     0,
-      28,    29,    30,     0,     0,     0,     0,     0,     0,    31,
-       0,     0,     0,     0,     0,     0,    32,    33,    34,    35,
-      36,     0,     0,     0,    38,     0,     0,     0,     0,     0,
-       0,     0,    40,    41,     0,     0,     2,     0,    42,     3,
-       4,    43,     0,     5,     0,     7,     8,     9,    68,    11,
-       0,    12,     0,     0,     0,    15,    16,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,    84,     0,    85,    86,
-      87,    88,    69,     2,    25,     0,     3,     4,     0,     0,
-       5,     0,     7,     8,     9,    68,    11,     0,    12,     0,
-       0,    31,    15,    16,     0,     0,     0,     0,    32,    33,
-      34,    35,    36,     0,     0,    85,     0,    87,     0,    69,
-       0,    25,     0,     0,    40,    41,     0,     0,     0,     0,
-      42,     0,     0,    43,     0,     0,     0,     0,    31,     0,
-       0,     0,     0,     0,     0,    32,    33,    34,    35,    36,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    40,    41,     0,     0,     2,     0,    42,     3,     4,
-      43,     0,     5,     0,     7,     8,     9,    68,    11,     0,
-      12,     0,     0,     0,    15,    16,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-       0,    69,     2,    25,     0,     3,     4,     0,     0,     5,
-       0,     7,     8,     9,    68,    11,     0,    12,     0,     0,
-      31,    15,    16,     0,     0,     0,     0,    32,    33,    34,
-      35,    36,     0,     0,     0,     0,     0,     0,    69,     0,
-      25,     0,     0,    40,    41,     0,     0,     0,     0,    70,
-       0,     0,    43,     0,     0,     0,     0,    31,     0,     0,
-       0,     0,     0,     0,    32,    33,    34,    35,    36,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
-      40,    41,     0,     0,     2,     0,    73,     3,     4,    43,
        0,     5,     0,     7,     8,     9,    68,    11,     0,    12,
-       0,     0,     0,    15,    16,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,    15,    16,     0,     0,     0,     1,     0,
+       0,     0,     0,     0,    84,     0,    85,    86,    87,    88,
       69,     2,    25,     0,     3,     4,     0,     0,     5,     0,
        7,     8,     9,    68,    11,     0,    12,     0,     0,    31,
       15,    16,     0,     0,     0,     0,    32,    33,    34,    35,
-      36,     0,     0,     0,     0,     0,     0,    69,     0,    25,
-       0,     0,    40,    41,     0,     0,     0,     0,    77,     0,
+      36,     0,     0,    85,     0,    87,     0,    69,     0,    25,
+       0,     0,    40,    41,     0,     0,     0,     0,    42,     0,
        0,    43,     0,     0,     0,     0,    31,     0,     0,     0,
        0,     0,     0,    32,    33,    34,    35,    36,     0,     0,
-       0,     0,    85,     0,    87,     0,     0,     0,     0,    40,
-      41,     0,     0,     0,     0,    42,     0,     0,    43,   141,
-     142,   143,   144,   145,   146,     0,   147,     0,     0,   148,
-     149,   150,     0,     0,     0,     0,     0,   192,     0,     0,
-       0,     0,     0,   193,     0,   151,   152,   153,   154,   155,
-     156,   157,   141,   142,   143,   144,   145,   146,     0,   147,
-       0,     0,   148,   149,   150,     0,     0,     0,     0,     0,
-     194,     0,     0,     0,     0,     0,   195,     0,   151,   152,
-     153,   154,   155,   156,   157,   141,   142,   143,   144,   145,
-     146,     0,   147,     0,     0,   148,   149,   150,     0,     0,
-       0,     0,     0,   196,     0,     0,     0,     0,     0,   197,
-       0,   151,   152,   153,   154,   155,   156,   157,   141,   142,
-     143,   144,   145,   146,     0,   147,     0,     0,   148,   149,
-     150,     0,     0,     0,     0,     0,   198,     0,     0,     0,
-       0,     0,   199,     0,   151,   152,   153,   154,   155,   156,
-     157,   141,   142,   143,   144,   145,   146,     0,   147,     0,
-       0,   148,   149,   150,     0,     0,     0,     0,     0,   296,
-       0,     0,     0,     0,     0,     0,     0,   151,   152,   153,
+       1,     0,     0,     0,     0,     0,     0,     0,     0,    40,
+      41,     0,     0,     2,     0,    42,     3,     4,    43,     0,
+       5,     0,     7,     8,     9,    68,    11,     0,    12,     0,
+       0,     0,    15,    16,     0,     0,     0,     1,     0,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,     0,    69,
+       2,    25,     0,     3,     4,     0,    93,     5,     0,     7,
+       8,     9,    68,    11,     0,    12,     0,     0,    31,    15,
+      16,     0,     0,     0,     0,    32,    33,    34,    35,    36,
+       0,     0,     0,     0,     0,     0,    69,     0,    25,     0,
+       0,    40,    41,     0,     0,     0,     0,    42,  -157,  -157,
+      43,     0,     0,     0,     0,    31,     0,     0,     0,     0,
+       0,     0,    32,    33,    34,    35,    36,     0,     0,     1,
+       0,     0,     0,     0,     0,     0,     0,     0,    40,    41,
+       0,     0,     2,     0,    42,     3,     4,    43,     0,     5,
+       0,     7,     8,     9,    68,    11,     0,    12,     0,     0,
+       0,    15,    16,     0,     0,     0,     0,     0,   192,     0,
+       0,     0,     0,     0,   193,     0,     0,     0,    69,     0,
+      25,     0,     0,   141,   142,   143,   144,   145,   146,     0,
+     147,     0,     0,   148,   149,   150,     0,    31,     0,     0,
+       0,     0,     0,     0,    32,    33,    34,    35,    36,   151,
+     152,   153,   154,   155,   156,   157,   194,     0,     0,     0,
+      40,    41,   195,     0,     0,     0,    42,     0,     0,    43,
+       0,   141,   142,   143,   144,   145,   146,     0,   147,     0,
+       0,   148,   149,   150,     0,     0,     0,     0,     0,   196,
+       0,     0,     0,     0,     0,   197,     0,   151,   152,   153,
      154,   155,   156,   157,   141,   142,   143,   144,   145,   146,
        0,   147,     0,     0,   148,   149,   150,     0,     0,     0,
-       0,     0,   297,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,   198,     0,     0,     0,     0,     0,   199,     0,
      151,   152,   153,   154,   155,   156,   157,   141,   142,   143,
      144,   145,   146,     0,   147,     0,     0,   148,   149,   150,
-       0,     0,     0,     0,     0,   298,     0,     0,     0,     0,
+       0,     0,     0,     0,     0,   296,     0,     0,     0,     0,
        0,     0,     0,   151,   152,   153,   154,   155,   156,   157,
      141,   142,   143,   144,   145,   146,     0,   147,     0,     0,
-     148,   149,   150,     0,     0,     0,     0,     0,   299,     0,
+     148,   149,   150,     0,     0,     0,     0,     0,   297,     0,
        0,     0,     0,     0,     0,     0,   151,   152,   153,   154,
      155,   156,   157,   141,   142,   143,   144,   145,   146,     0,
      147,     0,     0,   148,   149,   150,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,   202,     0,   151,
+       0,   298,     0,     0,     0,     0,     0,     0,     0,   151,
      152,   153,   154,   155,   156,   157,   141,   142,   143,   144,
-     145,   146,   189,   147,     0,     0,   148,   149,   150,   141,
+     145,   146,     0,   147,     0,     0,   148,   149,   150,     0,
+       0,     0,     0,     0,   299,     0,     0,     0,     0,     0,
+       0,     0,   151,   152,   153,   154,   155,   156,   157,   141,
      142,   143,   144,   145,   146,     0,   147,     0,     0,   148,
-     149,   150,   151,   152,   153,   154,   155,   156,   157,     0,
-     203,     0,     0,     0,     0,   151,   152,   153,   154,   155,
-     156,   157,   141,   142,   143,   144,   145,   146,     0,   147,
-       0,     0,   148,   149,   150,     0,     0,     0,     0,     0,
-       0,     0,     0,     0,     0,     0,     0,     0,   151,   152,
-     153,   154,   155,   156,   157,     0,     0,     0,   207,   141,
-     142,   143,   144,   145,   146,     0,   147,     0,     0,   148,
-     149,   150,     0,     0,     0,     0,     0,   200,   201,     0,
-       0,     0,     0,     0,     0,   151,   152,   153,   154,   155,
-     156,   157,   141,   142,   143,   144,   145,   146,     0,   147,
-       0,     0,   148,   149,   150,   141,   142,   143,   144,     0,
-       0,     0,   147,     0,     0,   148,   149,   150,   151,   152,
-     153,   154,   155,   156,   157,     0,     0,     0,     0,     0,
-       0,   151,   152,   153,   154,   155,   156,   157
+     149,   150,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,   202,     0,   151,   152,   153,   154,   155,
+     156,   157,   141,   142,   143,   144,   145,   146,   189,   147,
+       0,     0,   148,   149,   150,   141,   142,   143,   144,   145,
+     146,     0,   147,     0,     0,   148,   149,   150,   151,   152,
+     153,   154,   155,   156,   157,     0,   203,     0,     0,     0,
+       0,   151,   152,   153,   154,   155,   156,   157,   141,   142,
+     143,   144,   145,   146,     0,   147,     0,     0,   148,   149,
+     150,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+       0,     0,     0,     0,   151,   152,   153,   154,   155,   156,
+     157,     0,     0,     0,   207,   141,   142,   143,   144,   145,
+     146,     0,   147,     0,     0,   148,   149,   150,     0,     0,
+       0,     0,     0,   200,   201,     0,     0,     0,     0,     0,
+       0,   151,   152,   153,   154,   155,   156,   157,   141,   142,
+     143,   144,   145,   146,     0,   147,     0,     0,   148,   149,
+     150,   141,   142,   143,   144,     0,     0,     0,   147,     0,
+       0,   148,   149,   150,   151,   152,   153,   154,   155,   156,
+     157,     0,     0,     0,     0,     0,     0,   151,   152,   153,
+     154,   155,   156,   157
 };
 
 static const yytype_int16 yycheck[] =
 {
        6,     7,    81,     0,    10,   169,   273,    54,    29,    36,
        4,     6,     7,    19,     8,   289,    42,    23,    65,    35,
-      97,    54,    28,    29,    26,    31,    32,    33,    34,    35,
-      36,    37,    65,    48,    40,    41,    42,    43,    54,    65,
+      97,    97,    28,    29,   100,    31,    32,    33,    34,    35,
+      36,    37,     1,    48,    40,    41,    42,    43,    54,    65,
       54,    24,   309,    26,    50,    14,    52,    53,    17,    56,
       57,    65,    21,   132,   133,    51,   330,    26,    27,    86,
-      29,    51,    97,    69,    70,   100,    70,    73,    89,    97,
-      26,    77,   100,    97,    80,    70,   100,    70,    73,    85,
-      73,    26,    76,    70,   105,    80,   134,   135,    92,    93,
-      94,    95,   359,    76,    77,    78,    79,     0,    91,    92,
-      93,    94,    95,    26,    98,    99,    97,    94,    95,    17,
-      18,    19,    27,    98,    29,    99,   100,    46,    26,    99,
-     100,    99,   100,    36,    37,    33,   100,   291,   100,    98,
+      29,    51,    54,    69,    70,    26,    70,    73,    89,    97,
+      26,    77,   100,    65,    80,    70,    26,    70,    73,    85,
+      73,     0,    76,    70,   105,    80,   134,   135,    92,    93,
+      94,    95,   359,    76,    77,    78,    79,    97,    91,    92,
+      93,    94,    95,    26,    98,    99,    46,    94,    95,    17,
+      18,    19,    97,    54,    27,   100,    29,    98,    26,    99,
+     100,    99,   100,    99,   100,    33,   100,   291,   100,    98,
       26,   137,   101,   130,    26,   141,   142,   143,   144,   145,
      146,   147,   148,   149,   150,   151,   152,   153,   154,   155,
-     156,   157,    26,   159,    54,    53,   100,   163,    26,    26,
-     103,   167,   103,   102,   100,   100,    26,   173,   247,   100,
-      48,   219,   178,   179,    26,   181,   182,    53,   100,   185,
-     186,   187,   176,   189,    26,    43,   192,   193,   194,   195,
-     196,   197,   198,   199,   200,   201,    26,    26,    53,    26,
-      87,    54,    88,    54,    87,   211,    26,    86,    26,   215,
-     216,   100,    87,    53,   208,   209,    87,    86,    14,   130,
-      86,    17,    18,   177,    20,    21,   203,    23,    24,    25,
-      26,    27,    53,    29,   282,   283,   284,    33,    34,    53,
-      53,   212,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   255,
-     256,    -1,   300,   301,    50,    -1,    52,    -1,    -1,    -1,
+     156,   157,    26,   159,    36,    37,    53,   163,   100,    26,
+      26,   167,    26,   100,   103,   103,   102,   173,   247,   100,
+     100,   219,   178,   179,    26,   181,   182,    48,   100,   185,
+     186,   187,   176,   189,    53,    26,   192,   193,   194,   195,
+     196,   197,   198,   199,   200,   201,    43,    43,    26,    26,
+      53,    26,    87,    54,    88,   211,    54,    87,    26,   215,
+     216,    86,   100,    26,   208,   209,    63,    64,    65,    66,
+      67,    68,    87,    70,    71,    72,    73,    74,    75,    53,
+      87,    86,    86,   203,   282,   283,   284,   130,    53,    53,
+      -1,    53,    89,    90,    91,    92,    93,    94,    95,   255,
+     256,   177,   300,   301,   212,    -1,    -1,    -1,    -1,    -1,
      308,    -1,    -1,    -1,    -1,   344,    -1,    -1,    -1,    -1,
-     349,    -1,    -1,    69,    -1,   323,    -1,    -1,    -1,   327,
-      76,    77,    78,    79,    80,    -1,   292,   335,   336,    -1,
-     296,   297,   298,   299,   342,    -1,    92,    93,    -1,    -1,
-      -1,   295,    98,    -1,    -1,   101,    -1,   355,    -1,   357,
+     349,    -1,    -1,    -1,    -1,   323,    -1,    -1,    -1,   327,
+      -1,    -1,    -1,    -1,    -1,    -1,   292,   335,   336,    -1,
+     296,   297,   298,   299,   342,    -1,    -1,    -1,    -1,    -1,
+      -1,   295,    -1,    -1,    -1,    -1,    -1,   355,    -1,   357,
       -1,    -1,    -1,   361,    -1,   363,    -1,   365,    -1,   325,
       -1,     0,     1,    -1,    -1,   331,   374,    -1,   334,    -1,
       -1,    -1,    -1,    -1,    -1,    14,    -1,    -1,    17,    18,
       -1,   347,    21,    22,    23,    24,    25,    26,    27,    -1,
-      29,    -1,    31,    32,    33,    34,   274,    -1,    -1,    38,
-      39,    40,    41,    -1,    -1,    -1,    45,   285,    47,    -1,
-      -1,    50,    51,    52,    -1,    -1,    55,    -1,    -1,    -1,
-      59,    60,    61,    62,    -1,    -1,    -1,    -1,   306,    -1,
-      69,    -1,   310,    -1,   312,    -1,    -1,    76,    77,    78,
-      79,    80,    -1,    -1,    83,    84,    85,    -1,    -1,    -1,
-      -1,    -1,    -1,    92,    93,    -1,    -1,    -1,    97,    98,
-      14,   339,   101,    17,    18,   343,    -1,    21,    -1,    23,
-      24,    25,    26,    27,    -1,    29,   354,    -1,   356,    33,
-      34,    43,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,   370,    -1,    -1,    -1,    50,    -1,    52,    -1,
-      -1,    63,    64,    65,    66,    67,    68,    -1,    70,    71,
-      72,    73,    74,    75,    -1,    69,    -1,    -1,    -1,    -1,
+      29,    30,    31,    -1,    33,    34,    35,    36,    37,    38,
+      39,    40,    41,    -1,    43,    -1,    -1,    46,    47,    48,
+      -1,    50,    51,    52,    53,    54,    55,    56,    -1,    -1,
+      -1,    60,    61,    62,    63,    64,    65,    66,    67,    68,
+      69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,    -1,    86,    87,    88,
+      89,    90,    91,    92,    93,    94,    95,     1,    97,    98,
+      99,   100,   101,   102,    -1,    -1,    -1,    -1,    -1,    -1,
+      14,    -1,    -1,    17,    18,    -1,    -1,    21,    -1,    23,
+      24,    25,    26,    27,    -1,    29,    -1,    -1,    -1,    33,
+      34,    -1,    -1,    -1,    46,    -1,    48,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    50,    -1,    52,    -1,
+      -1,    63,    64,    65,    66,    67,    68,    -1,    70,    -1,
+      -1,    73,    74,    75,    -1,    69,    -1,    -1,    -1,    -1,
       -1,    -1,    76,    77,    78,    79,    80,    89,    90,    91,
-      92,    93,    94,    95,    -1,    -1,    -1,    -1,    92,    93,
-      -1,    -1,    -1,    -1,    98,    -1,    -1,   101,    14,   103,
+      92,    93,    94,    95,    -1,    -1,     0,     1,    92,    93,
+      -1,    -1,    -1,    -1,    98,    -1,    -1,   101,   102,   103,
+      14,    -1,    -1,    17,    18,    -1,    -1,    21,    22,    23,
+      24,    25,    26,    27,    -1,    29,    30,    31,    -1,    33,
+      34,    -1,    36,    37,    38,    39,    40,    41,    -1,    -1,
+      -1,    -1,    -1,    47,    -1,    -1,    50,    51,    52,    -1,
+      -1,    55,    -1,    -1,    -1,    -1,    60,    61,    62,    63,
+      64,    65,    66,    67,    68,    69,    70,    -1,    -1,    73,
+      74,    75,    76,    77,    78,    79,    80,    -1,    -1,    83,
+      84,    -1,    86,    87,    88,    89,    90,    91,    92,    93,
+      94,    95,    -1,    97,    98,     0,     1,   101,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    14,
+      -1,    -1,    17,    18,    -1,    -1,    21,    22,    23,    24,
+      25,    26,    27,    -1,    29,    30,    31,    -1,    33,    34,
+      -1,    36,    37,    38,    39,    40,    41,    -1,    -1,    -1,
+      -1,    -1,    47,    -1,    -1,    50,    51,    52,    -1,    -1,
+      55,    -1,    -1,    -1,    -1,    60,    61,    62,    -1,    -1,
+      -1,    -1,    -1,    -1,    69,    -1,    -1,    -1,    -1,    -1,
+      -1,    76,    77,    78,    79,    80,    -1,    -1,    83,    84,
+      -1,    86,    87,    88,     0,     1,    -1,    92,    93,    -1,
+      -1,    -1,    97,    98,    -1,   100,   101,    -1,    14,    -1,
       -1,    17,    18,    -1,    -1,    21,    22,    23,    24,    25,
       26,    27,    -1,    29,    30,    31,    -1,    33,    34,    -1,
+      36,    37,    38,    39,    40,    41,    -1,    -1,    -1,    -1,
+      -1,    47,    -1,    -1,    50,    51,    52,    -1,    -1,    55,
+      -1,    -1,    -1,    -1,    60,    61,    62,    -1,    -1,    -1,
+      -1,    -1,    -1,    69,    -1,    -1,    -1,    -1,    -1,    -1,
+      76,    77,    78,    79,    80,    -1,    -1,    83,    84,    -1,
+      86,    87,    88,     0,     1,    -1,    92,    93,    -1,    -1,
+      -1,    97,    98,    -1,   100,   101,    -1,    14,    -1,    -1,
+      17,    18,    -1,    -1,    21,    22,    23,    24,    25,    26,
+      27,    -1,    29,    -1,    31,    32,    33,    34,    -1,    -1,
+      -1,    38,    39,    40,    41,    -1,    -1,    -1,    45,    -1,
+      47,    -1,    -1,    50,    51,    52,    -1,    -1,    55,    -1,
+      -1,    -1,    59,    60,    61,    62,    -1,    -1,    -1,    -1,
+      -1,    -1,    69,    -1,    -1,    -1,    -1,    -1,    -1,    76,
+      77,    78,    79,    80,    -1,    -1,    83,    84,    85,     0,
+       1,    -1,    -1,    -1,    -1,    92,    93,    -1,    -1,    -1,
+      97,    98,    -1,    14,   101,    -1,    17,    18,    -1,    -1,
+      21,    22,    23,    24,    25,    26,    27,    -1,    29,    30,
+      31,    -1,    33,    34,   274,    -1,    -1,    38,    39,    40,
+      41,    -1,    -1,    -1,    -1,   285,    47,    -1,    -1,    50,
+      51,    52,    -1,    -1,    55,    -1,    -1,    -1,    -1,    60,
+      61,    62,    -1,    -1,    -1,    -1,   306,    -1,    69,    -1,
+     310,    -1,   312,    -1,    -1,    76,    77,    78,    79,    80,
+      -1,    -1,    83,    84,     0,     1,    -1,    -1,    -1,    -1,
+      -1,    92,    93,    -1,    -1,    -1,    97,    98,    14,   339,
+     101,    17,    18,   343,    -1,    21,    22,    23,    24,    25,
+      26,    27,    -1,    29,   354,    31,   356,    33,    34,    -1,
       -1,    -1,    38,    39,    40,    41,    -1,    -1,    -1,    -1,
+     370,    47,    -1,    -1,    50,    51,    52,    -1,    -1,    55,
+      -1,    -1,    -1,    -1,    60,    61,    62,    -1,    -1,    -1,
+      -1,    -1,    -1,    69,    -1,    -1,    -1,    -1,    -1,    -1,
+      76,    77,    78,    79,    80,    -1,    -1,    83,    84,     0,
+       1,    -1,    -1,    -1,    -1,    -1,    92,    93,    -1,    -1,
+      -1,    97,    98,    14,    -1,   101,    17,    18,    -1,    -1,
+      21,    22,    23,    24,    25,    26,    27,    -1,    29,    -1,
+      31,    -1,    33,    34,    -1,    -1,    -1,    38,    39,    40,
+      41,    -1,    -1,    -1,    -1,    -1,    47,    -1,    -1,    50,
+      51,    52,    -1,    -1,    55,    -1,    -1,    -1,    -1,    60,
+      61,    62,    -1,    -1,    -1,    -1,    -1,    -1,    69,    -1,
+      -1,    -1,    -1,    -1,    -1,    76,    77,    78,    79,    80,
+      -1,    -1,    83,    84,    -1,     1,    -1,    -1,    -1,    -1,
+      -1,    92,    93,    -1,    -1,    -1,    97,    98,    14,    -1,
+     101,    17,    18,    -1,    -1,    21,    22,    23,    24,    25,
+      26,    27,    -1,    29,    -1,    31,    -1,    33,    34,    -1,
+      36,    37,    38,    39,    40,    41,    -1,    -1,    -1,    -1,
       -1,    47,    -1,    -1,    50,    51,    52,    -1,    -1,    55,
       -1,    -1,    -1,    -1,    60,    61,    62,    -1,    -1,    -1,
       -1,    -1,    -1,    69,    -1,    -1,    -1,    -1,    -1,    -1,
       76,    77,    78,    79,    80,    -1,    -1,    83,    84,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    92,    93,    -1,    -1,
-      14,    97,    98,    17,    18,   101,    -1,    21,    22,    23,
+      86,     1,    -1,    -1,    -1,    -1,    92,    93,    -1,    -1,
+      -1,    97,    98,    -1,    14,   101,    -1,    17,    18,    -1,
+      -1,    21,    22,    23,    24,    25,    26,    27,    -1,    29,
+      -1,    31,    -1,    33,    34,    -1,    -1,    -1,    38,    39,
+      40,    41,    -1,    -1,    -1,    -1,    -1,    47,    -1,    -1,
+      50,    51,    52,    -1,    -1,    55,    -1,    -1,    -1,    -1,
+      60,    61,    62,    -1,    -1,    -1,    -1,    -1,    -1,    69,
+      -1,    -1,    -1,    -1,    -1,    -1,    76,    77,    78,    79,
+      80,    -1,    -1,    83,    84,    -1,     1,    87,    -1,    -1,
+      -1,    -1,    92,    93,    -1,    -1,    -1,    97,    98,    14,
+      -1,   101,    17,    18,    -1,    -1,    21,    22,    23,    24,
+      25,    26,    27,    -1,    29,    -1,    31,    -1,    33,    34,
+      -1,    -1,    -1,    38,    39,    40,    41,    -1,    -1,    -1,
+      -1,    -1,    47,    -1,    -1,    50,    51,    52,    -1,    -1,
+      55,    -1,    -1,    -1,    -1,    60,    61,    62,    -1,    -1,
+      -1,    -1,    -1,    -1,    69,    -1,    -1,    -1,    -1,    -1,
+      -1,    76,    77,    78,    79,    80,    -1,    -1,    83,    84,
+      -1,     1,    -1,    88,    -1,    -1,    -1,    92,    93,    -1,
+      -1,    -1,    97,    98,    14,    -1,   101,    17,    18,    -1,
+      -1,    21,    22,    23,    24,    25,    26,    27,    -1,    29,
+      -1,    31,    -1,    33,    34,    -1,    -1,    -1,    38,    39,
+      40,    41,    -1,    -1,    -1,    -1,    -1,    47,    -1,    -1,
+      50,    51,    52,    -1,    -1,    55,    -1,    -1,    -1,    -1,
+      60,    61,    62,    -1,    -1,    -1,    -1,    -1,    -1,    69,
+      -1,    -1,    -1,    -1,    -1,    -1,    76,    77,    78,    79,
+      80,    -1,    -1,    83,    84,    -1,    86,     1,    -1,    -1,
+      -1,    -1,    92,    93,    -1,    -1,    -1,    97,    98,    -1,
+      14,   101,    -1,    17,    18,    -1,    -1,    21,    22,    23,
       24,    25,    26,    27,    -1,    29,    -1,    31,    -1,    33,
       34,    -1,    -1,    -1,    38,    39,    40,    41,    -1,    -1,
-      -1,    -1,    -1,    47,    -1,    -1,    50,    51,    52,    -1,
-      -1,    55,    -1,    -1,    -1,    -1,    60,    61,    62,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    50,    -1,    52,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    60,    61,    62,    -1,
       -1,    -1,    -1,    -1,    -1,    69,    -1,    -1,    -1,    -1,
-      -1,    -1,    76,    77,    78,    79,    80,    -1,    -1,    83,
+      -1,    -1,    76,    77,    78,    79,    80,    -1,    -1,     1,
       84,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    92,    93,
-      -1,    -1,    14,    97,    98,    17,    18,   101,    -1,    21,
+      -1,    -1,    14,    -1,    98,    17,    18,   101,    -1,    21,
       22,    23,    24,    25,    26,    27,    -1,    29,    -1,    31,
-      -1,    33,    34,    -1,    -1,    -1,    38,    39,    40,    41,
+      -1,    33,    34,    -1,    -1,    -1,    38,    39,    40,    -1,
       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    50,    -1,
       52,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    60,    61,
       62,    -1,    -1,    -1,    -1,    -1,    -1,    69,    -1,    -1,
       -1,    -1,    -1,    -1,    76,    77,    78,    79,    80,    -1,
-      -1,    -1,    84,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      92,    93,    -1,    -1,    14,    -1,    98,    17,    18,   101,
-      -1,    21,    22,    23,    24,    25,    26,    27,    -1,    29,
-      -1,    31,    -1,    33,    34,    -1,    -1,    -1,    38,    39,
-      40,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      50,    -1,    52,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      60,    61,    62,    -1,    -1,    -1,    -1,    -1,    -1,    69,
-      -1,    -1,    -1,    -1,    -1,    -1,    76,    77,    78,    79,
-      80,    -1,    -1,    -1,    84,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    92,    93,    -1,    -1,    14,    -1,    98,    17,
-      18,   101,    -1,    21,    -1,    23,    24,    25,    26,    27,
-      -1,    29,    -1,    -1,    -1,    33,    34,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    44,    -1,    46,    47,
-      48,    49,    50,    14,    52,    -1,    17,    18,    -1,    -1,
-      21,    -1,    23,    24,    25,    26,    27,    -1,    29,    -1,
-      -1,    69,    33,    34,    -1,    -1,    -1,    -1,    76,    77,
-      78,    79,    80,    -1,    -1,    46,    -1,    48,    -1,    50,
-      -1,    52,    -1,    -1,    92,    93,    -1,    -1,    -1,    -1,
-      98,    -1,    -1,   101,    -1,    -1,    -1,    -1,    69,    -1,
-      -1,    -1,    -1,    -1,    -1,    76,    77,    78,    79,    80,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    92,    93,    -1,    -1,    14,    -1,    98,    17,    18,
-     101,    -1,    21,    -1,    23,    24,    25,    26,    27,    -1,
-      29,    -1,    -1,    -1,    33,    34,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
-      -1,    50,    14,    52,    -1,    17,    18,    -1,    -1,    21,
-      -1,    23,    24,    25,    26,    27,    -1,    29,    -1,    -1,
-      69,    33,    34,    -1,    -1,    -1,    -1,    76,    77,    78,
-      79,    80,    -1,    -1,    -1,    -1,    -1,    -1,    50,    -1,
-      52,    -1,    -1,    92,    93,    -1,    -1,    -1,    -1,    98,
-      -1,    -1,   101,    -1,    -1,    -1,    -1,    69,    -1,    -1,
-      -1,    -1,    -1,    -1,    76,    77,    78,    79,    80,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,     1,    84,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
       92,    93,    -1,    -1,    14,    -1,    98,    17,    18,   101,
       -1,    21,    -1,    23,    24,    25,    26,    27,    -1,    29,
-      -1,    -1,    -1,    33,    34,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    33,    34,    -1,    -1,    -1,     1,    -1,
+      -1,    -1,    -1,    -1,    44,    -1,    46,    47,    48,    49,
       50,    14,    52,    -1,    17,    18,    -1,    -1,    21,    -1,
       23,    24,    25,    26,    27,    -1,    29,    -1,    -1,    69,
       33,    34,    -1,    -1,    -1,    -1,    76,    77,    78,    79,
-      80,    -1,    -1,    -1,    -1,    -1,    -1,    50,    -1,    52,
+      80,    -1,    -1,    46,    -1,    48,    -1,    50,    -1,    52,
       -1,    -1,    92,    93,    -1,    -1,    -1,    -1,    98,    -1,
       -1,   101,    -1,    -1,    -1,    -1,    69,    -1,    -1,    -1,
       -1,    -1,    -1,    76,    77,    78,    79,    80,    -1,    -1,
-      -1,    -1,    46,    -1,    48,    -1,    -1,    -1,    -1,    92,
-      93,    -1,    -1,    -1,    -1,    98,    -1,    -1,   101,    63,
-      64,    65,    66,    67,    68,    -1,    70,    -1,    -1,    73,
-      74,    75,    -1,    -1,    -1,    -1,    -1,    48,    -1,    -1,
-      -1,    -1,    -1,    54,    -1,    89,    90,    91,    92,    93,
-      94,    95,    63,    64,    65,    66,    67,    68,    -1,    70,
-      -1,    -1,    73,    74,    75,    -1,    -1,    -1,    -1,    -1,
-      48,    -1,    -1,    -1,    -1,    -1,    54,    -1,    89,    90,
-      91,    92,    93,    94,    95,    63,    64,    65,    66,    67,
-      68,    -1,    70,    -1,    -1,    73,    74,    75,    -1,    -1,
-      -1,    -1,    -1,    48,    -1,    -1,    -1,    -1,    -1,    54,
-      -1,    89,    90,    91,    92,    93,    94,    95,    63,    64,
-      65,    66,    67,    68,    -1,    70,    -1,    -1,    73,    74,
-      75,    -1,    -1,    -1,    -1,    -1,    48,    -1,    -1,    -1,
-      -1,    -1,    54,    -1,    89,    90,    91,    92,    93,    94,
-      95,    63,    64,    65,    66,    67,    68,    -1,    70,    -1,
+       1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    92,
+      93,    -1,    -1,    14,    -1,    98,    17,    18,   101,    -1,
+      21,    -1,    23,    24,    25,    26,    27,    -1,    29,    -1,
+      -1,    -1,    33,    34,    -1,    -1,    -1,     1,    -1,    -1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    50,
+      14,    52,    -1,    17,    18,    -1,    20,    21,    -1,    23,
+      24,    25,    26,    27,    -1,    29,    -1,    -1,    69,    33,
+      34,    -1,    -1,    -1,    -1,    76,    77,    78,    79,    80,
+      -1,    -1,    -1,    -1,    -1,    -1,    50,    -1,    52,    -1,
+      -1,    92,    93,    -1,    -1,    -1,    -1,    98,    99,   100,
+     101,    -1,    -1,    -1,    -1,    69,    -1,    -1,    -1,    -1,
+      -1,    -1,    76,    77,    78,    79,    80,    -1,    -1,     1,
+      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    92,    93,
+      -1,    -1,    14,    -1,    98,    17,    18,   101,    -1,    21,
+      -1,    23,    24,    25,    26,    27,    -1,    29,    -1,    -1,
+      -1,    33,    34,    -1,    -1,    -1,    -1,    -1,    48,    -1,
+      -1,    -1,    -1,    -1,    54,    -1,    -1,    -1,    50,    -1,
+      52,    -1,    -1,    63,    64,    65,    66,    67,    68,    -1,
+      70,    -1,    -1,    73,    74,    75,    -1,    69,    -1,    -1,
+      -1,    -1,    -1,    -1,    76,    77,    78,    79,    80,    89,
+      90,    91,    92,    93,    94,    95,    48,    -1,    -1,    -1,
+      92,    93,    54,    -1,    -1,    -1,    98,    -1,    -1,   101,
+      -1,    63,    64,    65,    66,    67,    68,    -1,    70,    -1,
       -1,    73,    74,    75,    -1,    -1,    -1,    -1,    -1,    48,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    89,    90,    91,
+      -1,    -1,    -1,    -1,    -1,    54,    -1,    89,    90,    91,
       92,    93,    94,    95,    63,    64,    65,    66,    67,    68,
       -1,    70,    -1,    -1,    73,    74,    75,    -1,    -1,    -1,
-      -1,    -1,    48,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    48,    -1,    -1,    -1,    -1,    -1,    54,    -1,
       89,    90,    91,    92,    93,    94,    95,    63,    64,    65,
       66,    67,    68,    -1,    70,    -1,    -1,    73,    74,    75,
       -1,    -1,    -1,    -1,    -1,    48,    -1,    -1,    -1,    -1,
@@ -1344,24 +1469,31 @@ static const yytype_int16 yycheck[] =
       -1,    -1,    -1,    -1,    -1,    -1,    89,    90,    91,    92,
       93,    94,    95,    63,    64,    65,    66,    67,    68,    -1,
       70,    -1,    -1,    73,    74,    75,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    54,    -1,    89,
+      -1,    48,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    89,
       90,    91,    92,    93,    94,    95,    63,    64,    65,    66,
-      67,    68,    56,    70,    -1,    -1,    73,    74,    75,    63,
-      64,    65,    66,    67,    68,    -1,    70,    -1,    -1,    73,
-      74,    75,    89,    90,    91,    92,    93,    94,    95,    -1,
-      97,    -1,    -1,    -1,    -1,    89,    90,    91,    92,    93,
-      94,    95,    63,    64,    65,    66,    67,    68,    -1,    70,
-      -1,    -1,    73,    74,    75,    -1,    -1,    -1,    -1,    -1,
-      -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    89,    90,
-      91,    92,    93,    94,    95,    -1,    -1,    -1,    99,    63,
+      67,    68,    -1,    70,    -1,    -1,    73,    74,    75,    -1,
+      -1,    -1,    -1,    -1,    48,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    89,    90,    91,    92,    93,    94,    95,    63,
       64,    65,    66,    67,    68,    -1,    70,    -1,    -1,    73,
-      74,    75,    -1,    -1,    -1,    -1,    -1,    81,    82,    -1,
-      -1,    -1,    -1,    -1,    -1,    89,    90,    91,    92,    93,
-      94,    95,    63,    64,    65,    66,    67,    68,    -1,    70,
-      -1,    -1,    73,    74,    75,    63,    64,    65,    66,    -1,
-      -1,    -1,    70,    -1,    -1,    73,    74,    75,    89,    90,
-      91,    92,    93,    94,    95,    -1,    -1,    -1,    -1,    -1,
-      -1,    89,    90,    91,    92,    93,    94,    95
+      74,    75,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    54,    -1,    89,    90,    91,    92,    93,
+      94,    95,    63,    64,    65,    66,    67,    68,    56,    70,
+      -1,    -1,    73,    74,    75,    63,    64,    65,    66,    67,
+      68,    -1,    70,    -1,    -1,    73,    74,    75,    89,    90,
+      91,    92,    93,    94,    95,    -1,    97,    -1,    -1,    -1,
+      -1,    89,    90,    91,    92,    93,    94,    95,    63,    64,
+      65,    66,    67,    68,    -1,    70,    -1,    -1,    73,    74,
+      75,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+      -1,    -1,    -1,    -1,    89,    90,    91,    92,    93,    94,
+      95,    -1,    -1,    -1,    99,    63,    64,    65,    66,    67,
+      68,    -1,    70,    -1,    -1,    73,    74,    75,    -1,    -1,
+      -1,    -1,    -1,    81,    82,    -1,    -1,    -1,    -1,    -1,
+      -1,    89,    90,    91,    92,    93,    94,    95,    63,    64,
+      65,    66,    67,    68,    -1,    70,    -1,    -1,    73,    74,
+      75,    63,    64,    65,    66,    -1,    -1,    -1,    70,    -1,
+      -1,    73,    74,    75,    89,    90,    91,    92,    93,    94,
+      95,    -1,    -1,    -1,    -1,    -1,    -1,    89,    90,    91,
+      92,    93,    94,    95
 };
 
   /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -1411,12 +1543,12 @@ static const yytype_uint8 yystos[] =
   /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const yytype_uint8 yyr1[] =
 {
-       0,   104,   105,   105,   106,   106,   106,   106,   107,   107,
+       0,   104,   105,   105,   106,   106,   106,   107,   107,   107,
      107,   107,   107,   107,   107,   107,   107,   107,   107,   107,
-     107,   108,   108,   108,   109,   109,   109,   109,   110,   110,
-     110,   110,   110,   110,   110,   110,   110,   110,   111,   112,
-     112,   113,   113,   114,   115,   115,   116,   117,   118,   119,
-     120,   121,   122,   122,   122,   123,   124,   124,   124,   124,
+     108,   108,   108,   109,   109,   109,   109,   110,   110,   110,
+     110,   110,   110,   110,   110,   110,   110,   111,   112,   112,
+     113,   113,   114,   115,   115,   116,   117,   118,   119,   120,
+     121,   122,   122,   122,   123,   124,   124,   124,   124,   124,
      124,   124,   124,   124,   125,   125,   125,   125,   125,   125,
      125,   125,   125,   125,   125,   125,   125,   125,   125,   125,
      125,   125,   125,   125,   125,   125,   125,   125,   125,   125,
@@ -1434,13 +1566,13 @@ static const yytype_uint8 yyr1[] =
   /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN.  */
 static const yytype_int8 yyr2[] =
 {
-       0,     2,     1,     3,     0,     1,     1,     2,     4,     4,
-       6,     4,     4,     4,     4,     4,     4,     5,     5,     8,
-       4,     1,     1,     1,     1,     1,     1,     1,     1,     1,
-       6,    11,    12,     8,     2,     3,     7,     6,     0,     9,
-      12,     0,     2,     6,    11,     7,     2,     3,     1,     1,
-       0,     0,     0,     2,     2,     3,     1,     1,     1,     1,
-       1,     1,     3,     1,     1,     1,     4,     2,     4,     3,
+       0,     2,     1,     3,     0,     1,     1,     4,     4,     6,
+       4,     4,     4,     4,     4,     4,     5,     5,     8,     4,
+       1,     1,     1,     1,     1,     1,     1,     1,     1,     6,
+      11,    12,     8,     2,     3,     7,     6,     0,     9,    12,
+       0,     2,     6,    11,     7,     2,     3,     1,     1,     0,
+       0,     0,     2,     2,     3,     1,     1,     1,     1,     1,
+       1,     3,     1,     2,     1,     1,     4,     2,     4,     3,
        2,     1,     1,     1,     3,     3,     3,     3,     3,     3,
        3,     3,     3,     3,     3,     3,     3,     2,     3,     3,
        3,     3,     2,     2,     4,     4,     4,     6,     4,     6,
@@ -1690,226 +1822,21 @@ yypcontext_expected_tokens (const yypcontext_t *yyctx,
 
 
 
-#ifndef yystrlen
-# if defined __GLIBC__ && defined _STRING_H
-#  define yystrlen(S) (YY_CAST (YYPTRDIFF_T, strlen (S)))
-# else
-/* Return the length of YYSTR.  */
-static YYPTRDIFF_T
-yystrlen (const char *yystr)
-{
-  YYPTRDIFF_T yylen;
-  for (yylen = 0; yystr[yylen]; yylen++)
-    continue;
-  return yylen;
-}
-# endif
-#endif
+/* The kind of the lookahead of this context.  */
+static yysymbol_kind_t
+yypcontext_token (const yypcontext_t *yyctx) YY_ATTRIBUTE_UNUSED;
 
-#ifndef yystpcpy
-# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
-#  define yystpcpy stpcpy
-# else
-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
-   YYDEST.  */
-static char *
-yystpcpy (char *yydest, const char *yysrc)
+static yysymbol_kind_t
+yypcontext_token (const yypcontext_t *yyctx)
 {
-  char *yyd = yydest;
-  const char *yys = yysrc;
-
-  while ((*yyd++ = *yys++) != '\0')
-    continue;
-
-  return yyd - 1;
+  return yyctx->yytoken;
 }
-# endif
-#endif
-
-#ifndef yytnamerr
-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
-   quotes and backslashes, so that it's suitable for yyerror.  The
-   heuristic is that double-quoting is unnecessary unless the string
-   contains an apostrophe, a comma, or backslash (other than
-   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
-   null, do not copy; instead, return the length of what the result
-   would have been.  */
-static YYPTRDIFF_T
-yytnamerr (char *yyres, const char *yystr)
-{
-  if (*yystr == '"')
-    {
-      YYPTRDIFF_T yyn = 0;
-      char const *yyp = yystr;
-      for (;;)
-        switch (*++yyp)
-          {
-          case '\'':
-          case ',':
-            goto do_not_strip_quotes;
-
-          case '\\':
-            if (*++yyp != '\\')
-              goto do_not_strip_quotes;
-            else
-              goto append;
-
-          append:
-          default:
-            if (yyres)
-              yyres[yyn] = *yyp;
-            yyn++;
-            break;
-
-          case '"':
-            if (yyres)
-              yyres[yyn] = '\0';
-            return yyn;
-          }
-    do_not_strip_quotes: ;
-    }
-
-  if (yyres)
-    return yystpcpy (yyres, yystr) - yyres;
-  else
-    return yystrlen (yystr);
-}
-#endif
-
 
-static int
-yy_syntax_error_arguments (const yypcontext_t *yyctx,
-                           yysymbol_kind_t yyarg[], int yyargn)
-{
-  /* Actual size of YYARG. */
-  int yycount = 0;
-  /* There are many possibilities here to consider:
-     - If this state is a consistent state with a default action, then
-       the only way this function was invoked is if the default action
-       is an error action.  In that case, don't check for expected
-       tokens because there are none.
-     - The only way there can be no lookahead present (in yychar) is if
-       this state is a consistent state with a default action.  Thus,
-       detecting the absence of a lookahead is sufficient to determine
-       that there is no unexpected or expected token to report.  In that
-       case, just report a simple "syntax error".
-     - Don't assume there isn't a lookahead just because this state is a
-       consistent state with a default action.  There might have been a
-       previous inconsistent state, consistent state with a non-default
-       action, or user semantic action that manipulated yychar.
-     - Of course, the expected token list depends on states to have
-       correct lookahead information, and it depends on the parser not
-       to perform extra reductions after fetching a lookahead from the
-       scanner and before detecting a syntax error.  Thus, state merging
-       (from LALR or IELR) and default reductions corrupt the expected
-       token list.  However, the list is correct for canonical LR with
-       one exception: it will still contain any token that will not be
-       accepted due to an error action in a later state.
-  */
-  if (yyctx->yytoken != YYSYMBOL_YYEMPTY)
-    {
-      int yyn;
-      if (yyarg)
-        yyarg[yycount] = yyctx->yytoken;
-      ++yycount;
-      yyn = yypcontext_expected_tokens (yyctx,
-                                        yyarg ? yyarg + 1 : yyarg, yyargn - 1);
-      if (yyn == YYENOMEM)
-        return YYENOMEM;
-      else
-        yycount += yyn;
-    }
-  return yycount;
-}
 
-/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
-   about the unexpected token YYTOKEN for the state stack whose top is
-   YYSSP.
 
-   Return 0 if *YYMSG was successfully written.  Return -1 if *YYMSG is
-   not large enough to hold the message.  In that case, also set
-   *YYMSG_ALLOC to the required number of bytes.  Return YYENOMEM if the
-   required number of bytes is too large to store.  */
+/* User defined function to report a syntax error.  */
 static int
-yysyntax_error (YYPTRDIFF_T *yymsg_alloc, char **yymsg,
-                const yypcontext_t *yyctx)
-{
-  enum { YYARGS_MAX = 5 };
-  /* Internationalized format string. */
-  const char *yyformat = YY_NULLPTR;
-  /* Arguments of yyformat: reported tokens (one for the "unexpected",
-     one per "expected"). */
-  yysymbol_kind_t yyarg[YYARGS_MAX];
-  /* Cumulated lengths of YYARG.  */
-  YYPTRDIFF_T yysize = 0;
-
-  /* Actual size of YYARG. */
-  int yycount = yy_syntax_error_arguments (yyctx, yyarg, YYARGS_MAX);
-  if (yycount == YYENOMEM)
-    return YYENOMEM;
-
-  switch (yycount)
-    {
-#define YYCASE_(N, S)                       \
-      case N:                               \
-        yyformat = S;                       \
-        break
-    default: /* Avoid compiler warnings. */
-      YYCASE_(0, YY_("syntax error"));
-      YYCASE_(1, YY_("syntax error, unexpected %s"));
-      YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
-      YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
-      YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
-      YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
-#undef YYCASE_
-    }
-
-  /* Compute error message size.  Don't count the "%s"s, but reserve
-     room for the terminator.  */
-  yysize = yystrlen (yyformat) - 2 * yycount + 1;
-  {
-    int yyi;
-    for (yyi = 0; yyi < yycount; ++yyi)
-      {
-        YYPTRDIFF_T yysize1
-          = yysize + yytnamerr (YY_NULLPTR, yytname[yyarg[yyi]]);
-        if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
-          yysize = yysize1;
-        else
-          return YYENOMEM;
-      }
-  }
-
-  if (*yymsg_alloc < yysize)
-    {
-      *yymsg_alloc = 2 * yysize;
-      if (! (yysize <= *yymsg_alloc
-             && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
-        *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
-      return -1;
-    }
-
-  /* Avoid sprintf, as that infringes on the user's name space.
-     Don't have undefined behavior even if the translation
-     produced a string with the wrong number of "%s"s.  */
-  {
-    char *yyp = *yymsg;
-    int yyi = 0;
-    while ((*yyp = *yyformat) != '\0')
-      if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
-        {
-          yyp += yytnamerr (yyp, yytname[yyarg[yyi++]]);
-          yyformat += 2;
-        }
-      else
-        {
-          ++yyp;
-          ++yyformat;
-        }
-  }
-  return 0;
-}
-
+yyreport_syntax_error (const yypcontext_t *yyctx);
 
 /*-----------------------------------------------.
 | Release the memory associated to this symbol.  |
@@ -1928,81 +1855,81 @@ yydestruct (const char *yymsg,
   switch (yykind)
     {
     case 22: /* BLTIN  */
-#line 146 "engines/director/lingo/lingo-gr.y"
+#line 139 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1934 "engines/director/lingo/lingo-gr.cpp"
+#line 1861 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 23: /* FBLTIN  */
-#line 146 "engines/director/lingo/lingo-gr.y"
+#line 139 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1940 "engines/director/lingo/lingo-gr.cpp"
+#line 1867 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 24: /* RBLTIN  */
-#line 146 "engines/director/lingo/lingo-gr.y"
+#line 139 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1946 "engines/director/lingo/lingo-gr.cpp"
+#line 1873 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 25: /* THEFBLTIN  */
-#line 146 "engines/director/lingo/lingo-gr.y"
+#line 139 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1952 "engines/director/lingo/lingo-gr.cpp"
+#line 1879 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 26: /* ID  */
-#line 146 "engines/director/lingo/lingo-gr.y"
+#line 139 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1958 "engines/director/lingo/lingo-gr.cpp"
+#line 1885 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 27: /* STRING  */
-#line 146 "engines/director/lingo/lingo-gr.y"
+#line 139 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1964 "engines/director/lingo/lingo-gr.cpp"
+#line 1891 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 28: /* HANDLER  */
-#line 146 "engines/director/lingo/lingo-gr.y"
+#line 139 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1970 "engines/director/lingo/lingo-gr.cpp"
+#line 1897 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 29: /* SYMBOL  */
-#line 146 "engines/director/lingo/lingo-gr.y"
+#line 139 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1976 "engines/director/lingo/lingo-gr.cpp"
+#line 1903 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 30: /* ENDCLAUSE  */
-#line 146 "engines/director/lingo/lingo-gr.y"
+#line 139 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1982 "engines/director/lingo/lingo-gr.cpp"
+#line 1909 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 31: /* tPLAYACCEL  */
-#line 146 "engines/director/lingo/lingo-gr.y"
+#line 139 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1988 "engines/director/lingo/lingo-gr.cpp"
+#line 1915 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 32: /* tMETHOD  */
-#line 146 "engines/director/lingo/lingo-gr.y"
+#line 139 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 1994 "engines/director/lingo/lingo-gr.cpp"
+#line 1921 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 33: /* THEOBJECTFIELD  */
-#line 147 "engines/director/lingo/lingo-gr.y"
+#line 140 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).objectfield).os; }
-#line 2000 "engines/director/lingo/lingo-gr.cpp"
+#line 1927 "engines/director/lingo/lingo-gr.cpp"
         break;
 
     case 142: /* on  */
-#line 146 "engines/director/lingo/lingo-gr.y"
+#line 139 "engines/director/lingo/lingo-gr.y"
             { delete ((*yyvaluep).s); }
-#line 2006 "engines/director/lingo/lingo-gr.cpp"
+#line 1933 "engines/director/lingo/lingo-gr.cpp"
         break;
 
       default:
@@ -2063,10 +1990,7 @@ yyparse (void)
      action routines.  */
   YYSTYPE yyval;
 
-  /* Buffer for error messages, and its allocated size.  */
-  char yymsgbuf[128];
-  char *yymsg = yymsgbuf;
-  YYPTRDIFF_T yymsg_alloc = sizeof yymsgbuf;
+
 
 #define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
 
@@ -2284,32 +2208,26 @@ yyreduce:
   switch (yyn)
     {
   case 7:
-#line 157 "engines/director/lingo/lingo-gr.y"
-                                { yyerrok; lex_unput('\n'); }
-#line 2290 "engines/director/lingo/lingo-gr.cpp"
-    break;
-
-  case 8:
-#line 159 "engines/director/lingo/lingo-gr.y"
+#line 151 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[-2].code);
 		delete (yyvsp[0].s); }
-#line 2301 "engines/director/lingo/lingo-gr.cpp"
+#line 2219 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 9:
-#line 165 "engines/director/lingo/lingo-gr.y"
+  case 8:
+#line 157 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[-2].code); }
-#line 2309 "engines/director/lingo/lingo-gr.cpp"
+#line 2227 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 10:
-#line 169 "engines/director/lingo/lingo-gr.y"
+  case 9:
+#line 161 "engines/director/lingo/lingo-gr.y"
                                                                 {
 		if (!(yyvsp[-3].s)->equalsIgnoreCase("menu")) {
 			warning("LEXER: keyword 'menu' expected");
@@ -2321,34 +2239,34 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-4].e)[1]);
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2325 "engines/director/lingo/lingo-gr.cpp"
+#line 2243 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 11:
-#line 180 "engines/director/lingo/lingo-gr.y"
+  case 10:
+#line 172 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->code1(LC::c_after); }
-#line 2331 "engines/director/lingo/lingo-gr.cpp"
+#line 2249 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 12:
-#line 181 "engines/director/lingo/lingo-gr.y"
+  case 11:
+#line 173 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->code1(LC::c_before); }
-#line 2337 "engines/director/lingo/lingo-gr.cpp"
+#line 2255 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 13:
-#line 182 "engines/director/lingo/lingo-gr.y"
+  case 12:
+#line 174 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code);
 		delete (yyvsp[-2].s); }
-#line 2348 "engines/director/lingo/lingo-gr.cpp"
+#line 2266 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 14:
-#line 188 "engines/director/lingo/lingo-gr.y"
+  case 13:
+#line 180 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2356,22 +2274,22 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-2].e)[0]);
 		g_lingo->codeInt((yyvsp[-2].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2360 "engines/director/lingo/lingo-gr.cpp"
+#line 2278 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 15:
-#line 195 "engines/director/lingo/lingo-gr.y"
+  case 14:
+#line 187 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_varpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		g_lingo->code1(LC::c_assign);
 		(yyval.code) = (yyvsp[0].code);
 		delete (yyvsp[-2].s); }
-#line 2371 "engines/director/lingo/lingo-gr.cpp"
+#line 2289 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 16:
-#line 201 "engines/director/lingo/lingo-gr.y"
+  case 15:
+#line 193 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2379,33 +2297,33 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-2].e)[0]);
 		g_lingo->codeInt((yyvsp[-2].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2383 "engines/director/lingo/lingo-gr.cpp"
+#line 2301 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 17:
-#line 208 "engines/director/lingo/lingo-gr.y"
+  case 16:
+#line 200 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_swap);
 		g_lingo->code1(LC::c_theentityassign);
 		g_lingo->codeInt((yyvsp[-3].e)[0]);
 		g_lingo->codeInt((yyvsp[-3].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2394 "engines/director/lingo/lingo-gr.cpp"
+#line 2312 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 18:
-#line 214 "engines/director/lingo/lingo-gr.y"
+  case 17:
+#line 206 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_swap);
 		g_lingo->code1(LC::c_theentityassign);
 		g_lingo->codeInt((yyvsp[-3].e)[0]);
 		g_lingo->codeInt((yyvsp[-3].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2405 "engines/director/lingo/lingo-gr.cpp"
+#line 2323 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 19:
-#line 221 "engines/director/lingo/lingo-gr.y"
+  case 18:
+#line 213 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		if (!(yyvsp[-3].s)->equalsIgnoreCase("menu")) {
 			warning("LEXER: keyword 'menu' expected");
@@ -2417,33 +2335,33 @@ yyreduce:
 		g_lingo->codeInt((yyvsp[-6].e)[0]);
 		g_lingo->codeInt((yyvsp[-6].e)[1]);
 		(yyval.code) = (yyvsp[0].code); }
-#line 2421 "engines/director/lingo/lingo-gr.cpp"
+#line 2339 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 20:
-#line 232 "engines/director/lingo/lingo-gr.y"
+  case 19:
+#line 224 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_objectfieldassign);
 		g_lingo->codeString((yyvsp[-2].objectfield).os->c_str());
 		g_lingo->codeInt((yyvsp[-2].objectfield).oe);
 		delete (yyvsp[-2].objectfield).os;
 		(yyval.code) = (yyvsp[0].code); }
-#line 2432 "engines/director/lingo/lingo-gr.cpp"
+#line 2350 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 30:
-#line 254 "engines/director/lingo/lingo-gr.y"
+  case 29:
+#line 246 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		inst body = 0, end = 0;
 		WRITE_UINT32(&body, (yyvsp[-3].code) - (yyvsp[-5].code));
 		WRITE_UINT32(&end, (yyvsp[-1].code) - (yyvsp[-5].code));
 		(*g_lingo->_currentScript)[(yyvsp[-5].code) + 1] = body;	/* body of loop */
 		(*g_lingo->_currentScript)[(yyvsp[-5].code) + 2] = end; }
-#line 2443 "engines/director/lingo/lingo-gr.cpp"
+#line 2361 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 31:
-#line 265 "engines/director/lingo/lingo-gr.y"
+  case 30:
+#line 257 "engines/director/lingo/lingo-gr.y"
                                                                                                  {
 		inst init = 0, finish = 0, body = 0, end = 0, inc = 0;
 		WRITE_UINT32(&init, (yyvsp[-8].code) - (yyvsp[-10].code));
@@ -2456,11 +2374,11 @@ yyreduce:
 		(*g_lingo->_currentScript)[(yyvsp[-10].code) + 3] = body;		/* body of loop */
 		(*g_lingo->_currentScript)[(yyvsp[-10].code) + 4] = inc;		/* increment */
 		(*g_lingo->_currentScript)[(yyvsp[-10].code) + 5] = end; }
-#line 2460 "engines/director/lingo/lingo-gr.cpp"
+#line 2378 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 32:
-#line 282 "engines/director/lingo/lingo-gr.y"
+  case 31:
+#line 274 "engines/director/lingo/lingo-gr.y"
                                                                                                        {
 		inst init = 0, finish = 0, body = 0, end = 0, inc = 0;
 		WRITE_UINT32(&init, (yyvsp[-9].code) - (yyvsp[-11].code));
@@ -2473,11 +2391,11 @@ yyreduce:
 		(*g_lingo->_currentScript)[(yyvsp[-11].code) + 3] = body;		/* body of loop */
 		(*g_lingo->_currentScript)[(yyvsp[-11].code) + 4] = inc;		/* increment */
 		(*g_lingo->_currentScript)[(yyvsp[-11].code) + 5] = end; }
-#line 2477 "engines/director/lingo/lingo-gr.cpp"
+#line 2395 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 33:
-#line 294 "engines/director/lingo/lingo-gr.y"
+  case 32:
+#line 286 "engines/director/lingo/lingo-gr.y"
                                                                             {
 		inst list = 0, body = 0, end = 0;
 		WRITE_UINT32(&list, (yyvsp[-5].code) - (yyvsp[-7].code));
@@ -2488,54 +2406,54 @@ yyreduce:
 		(*g_lingo->_currentScript)[(yyvsp[-7].code) + 3] = body;		/* body of loop */
 		(*g_lingo->_currentScript)[(yyvsp[-7].code) + 4] = 0;		/* increment */
 		(*g_lingo->_currentScript)[(yyvsp[-7].code) + 5] = end; }
-#line 2492 "engines/director/lingo/lingo-gr.cpp"
+#line 2410 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 34:
-#line 305 "engines/director/lingo/lingo-gr.y"
+  case 33:
+#line 297 "engines/director/lingo/lingo-gr.y"
                         {
 		g_lingo->code1(LC::c_nextRepeat); }
-#line 2499 "engines/director/lingo/lingo-gr.cpp"
+#line 2417 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 35:
-#line 307 "engines/director/lingo/lingo-gr.y"
+  case 34:
+#line 299 "engines/director/lingo/lingo-gr.y"
                                       {
 		inst end = 0;
 		WRITE_UINT32(&end, (yyvsp[0].code) - (yyvsp[-2].code));
 		g_lingo->code1(STOP);
 		(*g_lingo->_currentScript)[(yyvsp[-2].code) + 1] = end; }
-#line 2509 "engines/director/lingo/lingo-gr.cpp"
+#line 2427 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 36:
-#line 312 "engines/director/lingo/lingo-gr.y"
+  case 35:
+#line 304 "engines/director/lingo/lingo-gr.y"
                                                           {
 		inst end;
 		WRITE_UINT32(&end, (yyvsp[-1].code) - (yyvsp[-3].code));
 		(*g_lingo->_currentScript)[(yyvsp[-3].code) + 1] = end; }
-#line 2518 "engines/director/lingo/lingo-gr.cpp"
+#line 2436 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 37:
-#line 316 "engines/director/lingo/lingo-gr.y"
+  case 36:
+#line 308 "engines/director/lingo/lingo-gr.y"
                                                     {
 		inst end;
 		WRITE_UINT32(&end, (yyvsp[0].code) - (yyvsp[-2].code));
 		(*g_lingo->_currentScript)[(yyvsp[-2].code) + 1] = end; }
-#line 2527 "engines/director/lingo/lingo-gr.cpp"
+#line 2445 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 38:
-#line 321 "engines/director/lingo/lingo-gr.y"
+  case 37:
+#line 313 "engines/director/lingo/lingo-gr.y"
                                                         {
 		(yyval.code) = g_lingo->code1(LC::c_tellcode);
 		g_lingo->code1(STOP); }
-#line 2535 "engines/director/lingo/lingo-gr.cpp"
+#line 2453 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 39:
-#line 325 "engines/director/lingo/lingo-gr.y"
+  case 38:
+#line 317 "engines/director/lingo/lingo-gr.y"
                                                                                        {
 		inst then = 0, else1 = 0, end = 0;
 		WRITE_UINT32(&then, (yyvsp[-6].code) - (yyvsp[-8].code));
@@ -2546,11 +2464,11 @@ yyreduce:
 		(*g_lingo->_currentScript)[(yyvsp[-8].code) + 3] = end;	/* end, if cond fails */
 
 		g_lingo->processIf((yyvsp[-8].code), (yyvsp[-1].code) - (yyvsp[-8].code), 0); }
-#line 2550 "engines/director/lingo/lingo-gr.cpp"
+#line 2468 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 40:
-#line 335 "engines/director/lingo/lingo-gr.y"
+  case 39:
+#line 327 "engines/director/lingo/lingo-gr.y"
                                                                                                               {
 		inst then = 0, else1 = 0, end = 0;
 		WRITE_UINT32(&then, (yyvsp[-9].code) - (yyvsp[-11].code));
@@ -2561,22 +2479,22 @@ yyreduce:
 		(*g_lingo->_currentScript)[(yyvsp[-11].code) + 3] = end;	/* end, if cond fails */
 
 		g_lingo->processIf((yyvsp[-11].code), (yyvsp[-1].code) - (yyvsp[-11].code), (yyvsp[-3].code) - (yyvsp[-11].code)); }
-#line 2565 "engines/director/lingo/lingo-gr.cpp"
+#line 2483 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 43:
-#line 349 "engines/director/lingo/lingo-gr.y"
+  case 42:
+#line 341 "engines/director/lingo/lingo-gr.y"
                                                         {
 		inst then = 0;
 		WRITE_UINT32(&then, (yyvsp[-3].code) - (yyvsp[-5].code));
 		(*g_lingo->_currentScript)[(yyvsp[-5].code) + 1] = then;	/* thenpart */
 
 		g_lingo->codeLabel((yyvsp[-5].code)); }
-#line 2576 "engines/director/lingo/lingo-gr.cpp"
+#line 2494 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 44:
-#line 356 "engines/director/lingo/lingo-gr.y"
+  case 43:
+#line 348 "engines/director/lingo/lingo-gr.y"
                                                                                                          {
 		inst then = 0, else1 = 0, end = 0;
 		WRITE_UINT32(&then, (yyvsp[-8].code) - (yyvsp[-10].code));
@@ -2587,11 +2505,11 @@ yyreduce:
 		(*g_lingo->_currentScript)[(yyvsp[-10].code) + 3] = end;	/* end, if cond fails */
 
 		g_lingo->processIf((yyvsp[-10].code), (yyvsp[-1].code) - (yyvsp[-10].code), (yyvsp[-3].code) - (yyvsp[-10].code)); }
-#line 2591 "engines/director/lingo/lingo-gr.cpp"
+#line 2509 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 45:
-#line 366 "engines/director/lingo/lingo-gr.y"
+  case 44:
+#line 358 "engines/director/lingo/lingo-gr.y"
                                                                    {
 		inst then = 0, else1 = 0, end = 0;
 		WRITE_UINT32(&then, (yyvsp[-4].code) - (yyvsp[-6].code));
@@ -2602,119 +2520,119 @@ yyreduce:
 		(*g_lingo->_currentScript)[(yyvsp[-6].code) + 3] = end;	/* end, if cond fails */
 
 		g_lingo->processIf((yyvsp[-6].code), (yyvsp[-1].code) - (yyvsp[-6].code), (yyvsp[-1].code) - (yyvsp[-6].code)); }
-#line 2606 "engines/director/lingo/lingo-gr.cpp"
+#line 2524 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 46:
-#line 377 "engines/director/lingo/lingo-gr.y"
+  case 45:
+#line 369 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.code) = g_lingo->code3(LC::c_repeatwhilecode, STOP, STOP); }
-#line 2612 "engines/director/lingo/lingo-gr.cpp"
+#line 2530 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 47:
-#line 379 "engines/director/lingo/lingo-gr.y"
+  case 46:
+#line 371 "engines/director/lingo/lingo-gr.y"
                                                 {
 		(yyval.code) = g_lingo->code3(LC::c_repeatwithcode, STOP, STOP);
 		g_lingo->code3(STOP, STOP, STOP);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2622 "engines/director/lingo/lingo-gr.cpp"
+#line 2540 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 48:
-#line 385 "engines/director/lingo/lingo-gr.y"
+  case 47:
+#line 377 "engines/director/lingo/lingo-gr.y"
                                                 {
 		(yyval.code) = g_lingo->code1(LC::c_ifcode);
 		g_lingo->code3(STOP, STOP, STOP);
 		g_lingo->code1(0);  // Do not skip end
 		g_lingo->codeLabel(0); }
-#line 2632 "engines/director/lingo/lingo-gr.cpp"
+#line 2550 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 49:
-#line 391 "engines/director/lingo/lingo-gr.y"
+  case 48:
+#line 383 "engines/director/lingo/lingo-gr.y"
                                         {
 		inst skipEnd;
 		WRITE_UINT32(&skipEnd, 1); // We have to skip end to avoid multiple executions
 		(yyval.code) = g_lingo->code1(LC::c_ifcode);
 		g_lingo->code3(STOP, STOP, STOP);
 		g_lingo->code1(skipEnd); }
-#line 2643 "engines/director/lingo/lingo-gr.cpp"
+#line 2561 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 50:
-#line 398 "engines/director/lingo/lingo-gr.y"
+  case 49:
+#line 390 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.code) = g_lingo->_currentScript->size(); }
-#line 2649 "engines/director/lingo/lingo-gr.cpp"
+#line 2567 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 51:
-#line 400 "engines/director/lingo/lingo-gr.y"
+  case 50:
+#line 392 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(STOP); (yyval.code) = g_lingo->_currentScript->size(); }
-#line 2655 "engines/director/lingo/lingo-gr.cpp"
+#line 2573 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 52:
-#line 402 "engines/director/lingo/lingo-gr.y"
+  case 51:
+#line 394 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->_currentScript->size(); }
-#line 2661 "engines/director/lingo/lingo-gr.cpp"
+#line 2579 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 55:
-#line 406 "engines/director/lingo/lingo-gr.y"
+  case 54:
+#line 398 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.code) = g_lingo->code1(LC::c_whencode);
 		g_lingo->code1(STOP);
 		g_lingo->codeString((yyvsp[-1].s)->c_str());
 		delete (yyvsp[-1].s); }
-#line 2671 "engines/director/lingo/lingo-gr.cpp"
+#line 2589 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 56:
-#line 412 "engines/director/lingo/lingo-gr.y"
+  case 55:
+#line 404 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt((yyvsp[0].i)); }
-#line 2679 "engines/director/lingo/lingo-gr.cpp"
+#line 2597 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 57:
-#line 415 "engines/director/lingo/lingo-gr.y"
+  case 56:
+#line 407 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_floatpush);
 		g_lingo->codeFloat((yyvsp[0].f)); }
-#line 2687 "engines/director/lingo/lingo-gr.cpp"
+#line 2605 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 58:
-#line 418 "engines/director/lingo/lingo-gr.y"
+  case 57:
+#line 410 "engines/director/lingo/lingo-gr.y"
                         {											// D3
 		(yyval.code) = g_lingo->code1(LC::c_symbolpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2696 "engines/director/lingo/lingo-gr.cpp"
+#line 2614 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 59:
-#line 422 "engines/director/lingo/lingo-gr.y"
+  case 58:
+#line 414 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.code) = g_lingo->code1(LC::c_stringpush);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2705 "engines/director/lingo/lingo-gr.cpp"
+#line 2623 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 60:
-#line 426 "engines/director/lingo/lingo-gr.y"
+  case 59:
+#line 418 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_eval);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 2714 "engines/director/lingo/lingo-gr.cpp"
+#line 2632 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 61:
-#line 430 "engines/director/lingo/lingo-gr.y"
+  case 60:
+#line 422 "engines/director/lingo/lingo-gr.y"
                         {
 		(yyval.code) = g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(0); // Put dummy id
@@ -2723,532 +2641,547 @@ yyreduce:
 		WRITE_UINT32(&e, (yyvsp[0].e)[0]);
 		WRITE_UINT32(&f, (yyvsp[0].e)[1]);
 		g_lingo->code2(e, f); }
-#line 2727 "engines/director/lingo/lingo-gr.cpp"
+#line 2645 "engines/director/lingo/lingo-gr.cpp"
     break;
 
-  case 62:
-#line 438 "engines/director/lingo/lingo-gr.y"
+  case 61:
+#line 430 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = (yyvsp[-1].code); }
-#line 2733 "engines/director/lingo/lingo-gr.cpp"
+#line 2651 "engines/director/lingo/lingo-gr.cpp"
+    break;
+
+  case 63:
+#line 432 "engines/director/lingo/lingo-gr.y"
+                                {
+		// Director parser till D3 was forgiving for any hanging parentheses
+		if (g_lingo->_ignoreError) {
+			warning("# LINGO: Ignoring trailing paren");
+			g_lingo->_ignoreError = false;
+			lex_unput('\n');	// We ate '\n', so put it back, otherwise lines will be joined
+		} else {
+			yyerrok;
+		}
+	}
+#line 2666 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 64:
-#line 441 "engines/director/lingo/lingo-gr.y"
+#line 443 "engines/director/lingo/lingo-gr.y"
                  { (yyval.code) = (yyvsp[0].code); }
-#line 2739 "engines/director/lingo/lingo-gr.cpp"
+#line 2672 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 66:
-#line 443 "engines/director/lingo/lingo-gr.y"
+#line 445 "engines/director/lingo/lingo-gr.y"
                                  {
 		g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 2747 "engines/director/lingo/lingo-gr.cpp"
+#line 2680 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 67:
-#line 446 "engines/director/lingo/lingo-gr.y"
+#line 448 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->codeFunc((yyvsp[-1].s), (yyvsp[0].narg));
 		delete (yyvsp[-1].s); }
-#line 2755 "engines/director/lingo/lingo-gr.cpp"
+#line 2688 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 68:
-#line 449 "engines/director/lingo/lingo-gr.y"
+#line 451 "engines/director/lingo/lingo-gr.y"
                                 {
 		(yyval.code) = g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 2763 "engines/director/lingo/lingo-gr.cpp"
+#line 2696 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 69:
-#line 452 "engines/director/lingo/lingo-gr.y"
+#line 454 "engines/director/lingo/lingo-gr.y"
                                         {
 		(yyval.code) = g_lingo->codeFunc((yyvsp[-2].s), 1);
 		delete (yyvsp[-2].s); }
-#line 2771 "engines/director/lingo/lingo-gr.cpp"
+#line 2704 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 70:
-#line 455 "engines/director/lingo/lingo-gr.y"
+#line 457 "engines/director/lingo/lingo-gr.y"
                                      {
 		(yyval.code) = g_lingo->code1(LC::c_theentitypush);
 		inst e = 0, f = 0;
 		WRITE_UINT32(&e, (yyvsp[-1].e)[0]);
 		WRITE_UINT32(&f, (yyvsp[-1].e)[1]);
 		g_lingo->code2(e, f); }
-#line 2782 "engines/director/lingo/lingo-gr.cpp"
+#line 2715 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 71:
-#line 461 "engines/director/lingo/lingo-gr.y"
+#line 463 "engines/director/lingo/lingo-gr.y"
                          {
 		g_lingo->code1(LC::c_objectfieldpush);
 		g_lingo->codeString((yyvsp[0].objectfield).os->c_str());
 		g_lingo->codeInt((yyvsp[0].objectfield).oe);
 		delete (yyvsp[0].objectfield).os; }
-#line 2792 "engines/director/lingo/lingo-gr.cpp"
+#line 2725 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 72:
-#line 466 "engines/director/lingo/lingo-gr.y"
+#line 468 "engines/director/lingo/lingo-gr.y"
                        {
 		g_lingo->code1(LC::c_objectrefpush);
 		g_lingo->codeString((yyvsp[0].objectref).obj->c_str());
 		g_lingo->codeString((yyvsp[0].objectref).field->c_str());
 		delete (yyvsp[0].objectref).obj;
 		delete (yyvsp[0].objectref).field; }
-#line 2803 "engines/director/lingo/lingo-gr.cpp"
+#line 2736 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 74:
-#line 473 "engines/director/lingo/lingo-gr.y"
+#line 475 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_add); }
-#line 2809 "engines/director/lingo/lingo-gr.cpp"
+#line 2742 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 75:
-#line 474 "engines/director/lingo/lingo-gr.y"
+#line 476 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_sub); }
-#line 2815 "engines/director/lingo/lingo-gr.cpp"
+#line 2748 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 76:
-#line 475 "engines/director/lingo/lingo-gr.y"
+#line 477 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_mul); }
-#line 2821 "engines/director/lingo/lingo-gr.cpp"
+#line 2754 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 77:
-#line 476 "engines/director/lingo/lingo-gr.y"
+#line 478 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_div); }
-#line 2827 "engines/director/lingo/lingo-gr.cpp"
+#line 2760 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 78:
-#line 477 "engines/director/lingo/lingo-gr.y"
+#line 479 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_mod); }
-#line 2833 "engines/director/lingo/lingo-gr.cpp"
+#line 2766 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 79:
-#line 478 "engines/director/lingo/lingo-gr.y"
+#line 480 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gt); }
-#line 2839 "engines/director/lingo/lingo-gr.cpp"
+#line 2772 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 80:
-#line 479 "engines/director/lingo/lingo-gr.y"
+#line 481 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_lt); }
-#line 2845 "engines/director/lingo/lingo-gr.cpp"
+#line 2778 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 81:
-#line 480 "engines/director/lingo/lingo-gr.y"
+#line 482 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_eq); }
-#line 2851 "engines/director/lingo/lingo-gr.cpp"
+#line 2784 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 82:
-#line 481 "engines/director/lingo/lingo-gr.y"
+#line 483 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_neq); }
-#line 2857 "engines/director/lingo/lingo-gr.cpp"
+#line 2790 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 83:
-#line 482 "engines/director/lingo/lingo-gr.y"
+#line 484 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_ge); }
-#line 2863 "engines/director/lingo/lingo-gr.cpp"
+#line 2796 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 84:
-#line 483 "engines/director/lingo/lingo-gr.y"
+#line 485 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_le); }
-#line 2869 "engines/director/lingo/lingo-gr.cpp"
+#line 2802 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 85:
-#line 484 "engines/director/lingo/lingo-gr.y"
+#line 486 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_and); }
-#line 2875 "engines/director/lingo/lingo-gr.cpp"
+#line 2808 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 86:
-#line 485 "engines/director/lingo/lingo-gr.y"
+#line 487 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_or); }
-#line 2881 "engines/director/lingo/lingo-gr.cpp"
+#line 2814 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 87:
-#line 486 "engines/director/lingo/lingo-gr.y"
+#line 488 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_not); }
-#line 2887 "engines/director/lingo/lingo-gr.cpp"
+#line 2820 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 88:
-#line 487 "engines/director/lingo/lingo-gr.y"
+#line 489 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_ampersand); }
-#line 2893 "engines/director/lingo/lingo-gr.cpp"
+#line 2826 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 89:
-#line 488 "engines/director/lingo/lingo-gr.y"
+#line 490 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_concat); }
-#line 2899 "engines/director/lingo/lingo-gr.cpp"
+#line 2832 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 90:
-#line 489 "engines/director/lingo/lingo-gr.y"
+#line 491 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_contains); }
-#line 2905 "engines/director/lingo/lingo-gr.cpp"
+#line 2838 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 91:
-#line 490 "engines/director/lingo/lingo-gr.y"
+#line 492 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_starts); }
-#line 2911 "engines/director/lingo/lingo-gr.cpp"
+#line 2844 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 92:
-#line 491 "engines/director/lingo/lingo-gr.y"
+#line 493 "engines/director/lingo/lingo-gr.y"
                                     { (yyval.code) = (yyvsp[0].code); }
-#line 2917 "engines/director/lingo/lingo-gr.cpp"
+#line 2850 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 93:
-#line 492 "engines/director/lingo/lingo-gr.y"
+#line 494 "engines/director/lingo/lingo-gr.y"
                                     { (yyval.code) = (yyvsp[0].code); g_lingo->code1(LC::c_negate); }
-#line 2923 "engines/director/lingo/lingo-gr.cpp"
+#line 2856 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 94:
-#line 493 "engines/director/lingo/lingo-gr.y"
+#line 495 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_intersects); }
-#line 2929 "engines/director/lingo/lingo-gr.cpp"
+#line 2862 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 95:
-#line 494 "engines/director/lingo/lingo-gr.y"
+#line 496 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_within); }
-#line 2935 "engines/director/lingo/lingo-gr.cpp"
+#line 2868 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 96:
-#line 496 "engines/director/lingo/lingo-gr.y"
+#line 498 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_charOf); }
-#line 2941 "engines/director/lingo/lingo-gr.cpp"
+#line 2874 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 97:
-#line 497 "engines/director/lingo/lingo-gr.y"
+#line 499 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_charToOf); }
-#line 2947 "engines/director/lingo/lingo-gr.cpp"
+#line 2880 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 98:
-#line 498 "engines/director/lingo/lingo-gr.y"
+#line 500 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_itemOf); }
-#line 2953 "engines/director/lingo/lingo-gr.cpp"
+#line 2886 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 99:
-#line 499 "engines/director/lingo/lingo-gr.y"
+#line 501 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_itemToOf); }
-#line 2959 "engines/director/lingo/lingo-gr.cpp"
+#line 2892 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 100:
-#line 500 "engines/director/lingo/lingo-gr.y"
+#line 502 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_lineOf); }
-#line 2965 "engines/director/lingo/lingo-gr.cpp"
+#line 2898 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 101:
-#line 501 "engines/director/lingo/lingo-gr.y"
+#line 503 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_lineToOf); }
-#line 2971 "engines/director/lingo/lingo-gr.cpp"
+#line 2904 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 102:
-#line 502 "engines/director/lingo/lingo-gr.y"
+#line 504 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_wordOf); }
-#line 2977 "engines/director/lingo/lingo-gr.cpp"
+#line 2910 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 103:
-#line 503 "engines/director/lingo/lingo-gr.y"
+#line 505 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_wordToOf); }
-#line 2983 "engines/director/lingo/lingo-gr.cpp"
+#line 2916 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 104:
-#line 505 "engines/director/lingo/lingo-gr.y"
+#line 507 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->codeFunc((yyvsp[-1].s), 1);
 		delete (yyvsp[-1].s); }
-#line 2991 "engines/director/lingo/lingo-gr.cpp"
+#line 2924 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 106:
-#line 510 "engines/director/lingo/lingo-gr.y"
+#line 512 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_printtop); }
-#line 2997 "engines/director/lingo/lingo-gr.cpp"
+#line 2930 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 109:
-#line 513 "engines/director/lingo/lingo-gr.y"
+#line 515 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code1(LC::c_exitRepeat); }
-#line 3003 "engines/director/lingo/lingo-gr.cpp"
+#line 2936 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 110:
-#line 514 "engines/director/lingo/lingo-gr.y"
+#line 516 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_procret); }
-#line 3009 "engines/director/lingo/lingo-gr.cpp"
+#line 2942 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 111:
-#line 515 "engines/director/lingo/lingo-gr.y"
+#line 517 "engines/director/lingo/lingo-gr.y"
                   { g_lingo->_indef = kStateInArgs; }
-#line 3015 "engines/director/lingo/lingo-gr.cpp"
+#line 2948 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 112:
-#line 515 "engines/director/lingo/lingo-gr.y"
+#line 517 "engines/director/lingo/lingo-gr.y"
                                                                  { g_lingo->_indef = kStateNone; }
-#line 3021 "engines/director/lingo/lingo-gr.cpp"
+#line 2954 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 113:
-#line 516 "engines/director/lingo/lingo-gr.y"
+#line 518 "engines/director/lingo/lingo-gr.y"
                     { g_lingo->_indef = kStateInArgs; }
-#line 3027 "engines/director/lingo/lingo-gr.cpp"
+#line 2960 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 114:
-#line 516 "engines/director/lingo/lingo-gr.y"
+#line 518 "engines/director/lingo/lingo-gr.y"
                                                                      { g_lingo->_indef = kStateNone; }
-#line 3033 "engines/director/lingo/lingo-gr.cpp"
+#line 2966 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 116:
-#line 518 "engines/director/lingo/lingo-gr.y"
+#line 520 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->codeFunc((yyvsp[-3].s), (yyvsp[-1].narg));
 		delete (yyvsp[-3].s); }
-#line 3041 "engines/director/lingo/lingo-gr.cpp"
+#line 2974 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 117:
-#line 521 "engines/director/lingo/lingo-gr.y"
+#line 523 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->codeFunc((yyvsp[-1].s), (yyvsp[0].narg));
 		delete (yyvsp[-1].s); }
-#line 3049 "engines/director/lingo/lingo-gr.cpp"
+#line 2982 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 118:
-#line 524 "engines/director/lingo/lingo-gr.y"
+#line 526 "engines/director/lingo/lingo-gr.y"
                                 { g_lingo->code1(LC::c_open); }
-#line 3055 "engines/director/lingo/lingo-gr.cpp"
+#line 2988 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 119:
-#line 525 "engines/director/lingo/lingo-gr.y"
+#line 527 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->code2(LC::c_voidpush, LC::c_open); }
-#line 3061 "engines/director/lingo/lingo-gr.cpp"
+#line 2994 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 120:
-#line 527 "engines/director/lingo/lingo-gr.y"
+#line 529 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_global);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 3070 "engines/director/lingo/lingo-gr.cpp"
+#line 3003 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 121:
-#line 531 "engines/director/lingo/lingo-gr.y"
+#line 533 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_global);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 3079 "engines/director/lingo/lingo-gr.cpp"
+#line 3012 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 122:
-#line 536 "engines/director/lingo/lingo-gr.y"
+#line 538 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_property);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 3088 "engines/director/lingo/lingo-gr.cpp"
+#line 3021 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 123:
-#line 540 "engines/director/lingo/lingo-gr.y"
+#line 542 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_property);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 3097 "engines/director/lingo/lingo-gr.cpp"
+#line 3030 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 124:
-#line 545 "engines/director/lingo/lingo-gr.y"
+#line 547 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_instance);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 3106 "engines/director/lingo/lingo-gr.cpp"
+#line 3039 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 125:
-#line 549 "engines/director/lingo/lingo-gr.y"
+#line 551 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_instance);
 		g_lingo->codeString((yyvsp[0].s)->c_str());
 		delete (yyvsp[0].s); }
-#line 3115 "engines/director/lingo/lingo-gr.cpp"
+#line 3048 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 126:
-#line 561 "engines/director/lingo/lingo-gr.y"
+#line 563 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gotoloop); }
-#line 3121 "engines/director/lingo/lingo-gr.cpp"
+#line 3054 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 127:
-#line 562 "engines/director/lingo/lingo-gr.y"
+#line 564 "engines/director/lingo/lingo-gr.y"
                                                         { g_lingo->code1(LC::c_gotonext); }
-#line 3127 "engines/director/lingo/lingo-gr.cpp"
+#line 3060 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 128:
-#line 563 "engines/director/lingo/lingo-gr.y"
+#line 565 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->code1(LC::c_gotoprevious); }
-#line 3133 "engines/director/lingo/lingo-gr.cpp"
+#line 3066 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 129:
-#line 564 "engines/director/lingo/lingo-gr.y"
+#line 566 "engines/director/lingo/lingo-gr.y"
                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(1);
 		g_lingo->code1(LC::c_goto); }
-#line 3142 "engines/director/lingo/lingo-gr.cpp"
+#line 3075 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 130:
-#line 568 "engines/director/lingo/lingo-gr.y"
+#line 570 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(3);
 		g_lingo->code1(LC::c_goto); }
-#line 3151 "engines/director/lingo/lingo-gr.cpp"
+#line 3084 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 131:
-#line 572 "engines/director/lingo/lingo-gr.y"
+#line 574 "engines/director/lingo/lingo-gr.y"
                                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(2);
 		g_lingo->code1(LC::c_goto); }
-#line 3160 "engines/director/lingo/lingo-gr.cpp"
+#line 3093 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 134:
-#line 580 "engines/director/lingo/lingo-gr.y"
+#line 582 "engines/director/lingo/lingo-gr.y"
                                         { // "play #done" is also caught by this
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(1);
 		g_lingo->code1(LC::c_play); }
-#line 3169 "engines/director/lingo/lingo-gr.cpp"
+#line 3102 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 135:
-#line 584 "engines/director/lingo/lingo-gr.y"
+#line 586 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(3);
 		g_lingo->code1(LC::c_play); }
-#line 3178 "engines/director/lingo/lingo-gr.cpp"
+#line 3111 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 136:
-#line 588 "engines/director/lingo/lingo-gr.y"
+#line 590 "engines/director/lingo/lingo-gr.y"
                                                         {
 		g_lingo->code1(LC::c_intpush);
 		g_lingo->codeInt(2);
 		g_lingo->code1(LC::c_play); }
-#line 3187 "engines/director/lingo/lingo-gr.cpp"
+#line 3120 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 137:
-#line 592 "engines/director/lingo/lingo-gr.y"
+#line 594 "engines/director/lingo/lingo-gr.y"
                      { g_lingo->codeSetImmediate(true); }
-#line 3193 "engines/director/lingo/lingo-gr.cpp"
+#line 3126 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 138:
-#line 592 "engines/director/lingo/lingo-gr.y"
+#line 594 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		g_lingo->codeSetImmediate(false);
 		g_lingo->codeFunc((yyvsp[-2].s), (yyvsp[0].narg));
 		delete (yyvsp[-2].s); }
-#line 3202 "engines/director/lingo/lingo-gr.cpp"
+#line 3135 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 139:
-#line 622 "engines/director/lingo/lingo-gr.y"
+#line 624 "engines/director/lingo/lingo-gr.y"
              { g_lingo->_indef = kStateInArgs; }
-#line 3208 "engines/director/lingo/lingo-gr.cpp"
+#line 3141 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 140:
-#line 622 "engines/director/lingo/lingo-gr.y"
+#line 624 "engines/director/lingo/lingo-gr.y"
                                                     { g_lingo->_currentFactory.clear(); }
-#line 3214 "engines/director/lingo/lingo-gr.cpp"
+#line 3147 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 141:
-#line 623 "engines/director/lingo/lingo-gr.y"
+#line 625 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		g_lingo->code1(LC::c_procret);
 		g_lingo->define(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg));
 		g_lingo->clearArgStack();
 		g_lingo->_indef = kStateNone;
 		delete (yyvsp[-6].s); }
-#line 3225 "engines/director/lingo/lingo-gr.cpp"
+#line 3158 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 142:
-#line 629 "engines/director/lingo/lingo-gr.y"
+#line 631 "engines/director/lingo/lingo-gr.y"
                         { g_lingo->codeFactory(*(yyvsp[0].s)); delete (yyvsp[0].s); }
-#line 3231 "engines/director/lingo/lingo-gr.cpp"
+#line 3164 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 143:
-#line 630 "engines/director/lingo/lingo-gr.y"
+#line 632 "engines/director/lingo/lingo-gr.y"
                   { g_lingo->_indef = kStateInArgs; }
-#line 3237 "engines/director/lingo/lingo-gr.cpp"
+#line 3170 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 144:
-#line 631 "engines/director/lingo/lingo-gr.y"
+#line 633 "engines/director/lingo/lingo-gr.y"
                                                                         {
 		g_lingo->code1(LC::c_procret);
 		g_lingo->define(*(yyvsp[-6].s), (yyvsp[-4].code), (yyvsp[-3].narg) + 1, &g_lingo->_currentFactory);
 		g_lingo->clearArgStack();
 		g_lingo->_indef = kStateNone;
 		delete (yyvsp[-6].s); }
-#line 3248 "engines/director/lingo/lingo-gr.cpp"
+#line 3181 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 145:
-#line 637 "engines/director/lingo/lingo-gr.y"
+#line 639 "engines/director/lingo/lingo-gr.y"
                                                                      {	// D3
 		g_lingo->code1(LC::c_procret);
 		g_lingo->define(*(yyvsp[-7].s), (yyvsp[-6].code), (yyvsp[-5].narg));
@@ -3259,11 +3192,11 @@ yyreduce:
 		checkEnd((yyvsp[-1].s), (yyvsp[-7].s)->c_str(), false);
 		delete (yyvsp[-7].s);
 		delete (yyvsp[-1].s); }
-#line 3263 "engines/director/lingo/lingo-gr.cpp"
+#line 3196 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 146:
-#line 647 "engines/director/lingo/lingo-gr.y"
+#line 649 "engines/director/lingo/lingo-gr.y"
                                                  {	// D4. No 'end' clause
 		g_lingo->code1(LC::c_procret);
 		g_lingo->define(*(yyvsp[-5].s), (yyvsp[-4].code), (yyvsp[-3].narg));
@@ -3271,59 +3204,59 @@ yyreduce:
 		g_lingo->clearArgStack();
 		g_lingo->_ignoreMe = false;
 		delete (yyvsp[-5].s); }
-#line 3275 "engines/director/lingo/lingo-gr.cpp"
+#line 3208 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 147:
-#line 655 "engines/director/lingo/lingo-gr.y"
+#line 657 "engines/director/lingo/lingo-gr.y"
          { g_lingo->_indef = kStateInArgs; }
-#line 3281 "engines/director/lingo/lingo-gr.cpp"
+#line 3214 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 148:
-#line 655 "engines/director/lingo/lingo-gr.y"
+#line 657 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.s) = (yyvsp[0].s); g_lingo->_currentFactory.clear(); g_lingo->_ignoreMe = true; }
-#line 3287 "engines/director/lingo/lingo-gr.cpp"
+#line 3220 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 149:
-#line 657 "engines/director/lingo/lingo-gr.y"
+#line 659 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.narg) = 0; }
-#line 3293 "engines/director/lingo/lingo-gr.cpp"
+#line 3226 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 150:
-#line 658 "engines/director/lingo/lingo-gr.y"
+#line 660 "engines/director/lingo/lingo-gr.y"
                                                 { g_lingo->codeArg((yyvsp[0].s)); (yyval.narg) = 1; delete (yyvsp[0].s); }
-#line 3299 "engines/director/lingo/lingo-gr.cpp"
+#line 3232 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 151:
-#line 659 "engines/director/lingo/lingo-gr.y"
+#line 661 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->codeArg((yyvsp[0].s)); (yyval.narg) = (yyvsp[-2].narg) + 1; delete (yyvsp[0].s); }
-#line 3305 "engines/director/lingo/lingo-gr.cpp"
+#line 3238 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 153:
-#line 662 "engines/director/lingo/lingo-gr.y"
+#line 664 "engines/director/lingo/lingo-gr.y"
                                                 { delete (yyvsp[0].s); }
-#line 3311 "engines/director/lingo/lingo-gr.cpp"
+#line 3244 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 154:
-#line 663 "engines/director/lingo/lingo-gr.y"
+#line 665 "engines/director/lingo/lingo-gr.y"
                                         { delete (yyvsp[0].s); }
-#line 3317 "engines/director/lingo/lingo-gr.cpp"
+#line 3250 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 155:
-#line 665 "engines/director/lingo/lingo-gr.y"
+#line 667 "engines/director/lingo/lingo-gr.y"
                                         { g_lingo->codeArgStore(); g_lingo->_indef = kStateInDef; }
-#line 3323 "engines/director/lingo/lingo-gr.cpp"
+#line 3256 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 156:
-#line 667 "engines/director/lingo/lingo-gr.y"
+#line 669 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code1(LC::c_call);
 		g_lingo->codeString((yyvsp[-1].s)->c_str());
@@ -3331,113 +3264,113 @@ yyreduce:
 		WRITE_UINT32(&numpar, (yyvsp[0].narg));
 		g_lingo->code1(numpar);
 		delete (yyvsp[-1].s); }
-#line 3335 "engines/director/lingo/lingo-gr.cpp"
+#line 3268 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 157:
-#line 675 "engines/director/lingo/lingo-gr.y"
+#line 677 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.narg) = 0; }
-#line 3341 "engines/director/lingo/lingo-gr.cpp"
+#line 3274 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 158:
-#line 676 "engines/director/lingo/lingo-gr.y"
+#line 678 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.narg) = 1; }
-#line 3347 "engines/director/lingo/lingo-gr.cpp"
+#line 3280 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 159:
-#line 677 "engines/director/lingo/lingo-gr.y"
+#line 679 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3353 "engines/director/lingo/lingo-gr.cpp"
+#line 3286 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 160:
-#line 679 "engines/director/lingo/lingo-gr.y"
+#line 681 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 1; }
-#line 3359 "engines/director/lingo/lingo-gr.cpp"
+#line 3292 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 161:
-#line 680 "engines/director/lingo/lingo-gr.y"
+#line 682 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3365 "engines/director/lingo/lingo-gr.cpp"
+#line 3298 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 162:
-#line 682 "engines/director/lingo/lingo-gr.y"
+#line 684 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.code) = (yyvsp[-1].code); }
-#line 3371 "engines/director/lingo/lingo-gr.cpp"
+#line 3304 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 163:
-#line 684 "engines/director/lingo/lingo-gr.y"
+#line 686 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.code) = g_lingo->code2(LC::c_arraypush, 0); }
-#line 3377 "engines/director/lingo/lingo-gr.cpp"
+#line 3310 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 164:
-#line 685 "engines/director/lingo/lingo-gr.y"
+#line 687 "engines/director/lingo/lingo-gr.y"
                                                 { (yyval.code) = g_lingo->code2(LC::c_proparraypush, 0); }
-#line 3383 "engines/director/lingo/lingo-gr.cpp"
+#line 3316 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 165:
-#line 686 "engines/director/lingo/lingo-gr.y"
+#line 688 "engines/director/lingo/lingo-gr.y"
                      { (yyval.code) = g_lingo->code1(LC::c_arraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3389 "engines/director/lingo/lingo-gr.cpp"
+#line 3322 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 166:
-#line 687 "engines/director/lingo/lingo-gr.y"
+#line 689 "engines/director/lingo/lingo-gr.y"
                          { (yyval.code) = g_lingo->code1(LC::c_proparraypush); (yyval.code) = g_lingo->codeInt((yyvsp[0].narg)); }
-#line 3395 "engines/director/lingo/lingo-gr.cpp"
+#line 3328 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 167:
-#line 689 "engines/director/lingo/lingo-gr.y"
+#line 691 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 1; }
-#line 3401 "engines/director/lingo/lingo-gr.cpp"
+#line 3334 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 168:
-#line 690 "engines/director/lingo/lingo-gr.y"
+#line 692 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3407 "engines/director/lingo/lingo-gr.cpp"
+#line 3340 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 169:
-#line 692 "engines/director/lingo/lingo-gr.y"
+#line 694 "engines/director/lingo/lingo-gr.y"
                                         { (yyval.narg) = 1; }
-#line 3413 "engines/director/lingo/lingo-gr.cpp"
+#line 3346 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 170:
-#line 693 "engines/director/lingo/lingo-gr.y"
+#line 695 "engines/director/lingo/lingo-gr.y"
                                 { (yyval.narg) = (yyvsp[-2].narg) + 1; }
-#line 3419 "engines/director/lingo/lingo-gr.cpp"
+#line 3352 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 171:
-#line 695 "engines/director/lingo/lingo-gr.y"
+#line 697 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code1(LC::c_symbolpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		delete (yyvsp[-2].s); }
-#line 3428 "engines/director/lingo/lingo-gr.cpp"
+#line 3361 "engines/director/lingo/lingo-gr.cpp"
     break;
 
   case 172:
-#line 699 "engines/director/lingo/lingo-gr.y"
+#line 701 "engines/director/lingo/lingo-gr.y"
                                 {
 		g_lingo->code1(LC::c_stringpush);
 		g_lingo->codeString((yyvsp[-2].s)->c_str());
 		delete (yyvsp[-2].s); }
-#line 3437 "engines/director/lingo/lingo-gr.cpp"
+#line 3370 "engines/director/lingo/lingo-gr.cpp"
     break;
 
 
-#line 3441 "engines/director/lingo/lingo-gr.cpp"
+#line 3374 "engines/director/lingo/lingo-gr.cpp"
 
       default: break;
     }
@@ -3487,32 +3420,7 @@ yyerrlab:
       {
         yypcontext_t yyctx
           = {yyssp, yytoken};
-        char const *yymsgp = YY_("syntax error");
-        int yysyntax_error_status;
-        yysyntax_error_status = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx);
-        if (yysyntax_error_status == 0)
-          yymsgp = yymsg;
-        else if (yysyntax_error_status == -1)
-          {
-            if (yymsg != yymsgbuf)
-              YYSTACK_FREE (yymsg);
-            yymsg = YY_CAST (char *,
-                             YYSTACK_ALLOC (YY_CAST (YYSIZE_T, yymsg_alloc)));
-            if (yymsg)
-              {
-                yysyntax_error_status
-                  = yysyntax_error (&yymsg_alloc, &yymsg, &yyctx);
-                yymsgp = yymsg;
-              }
-            else
-              {
-                yymsg = yymsgbuf;
-                yymsg_alloc = sizeof yymsgbuf;
-                yysyntax_error_status = YYENOMEM;
-              }
-          }
-        yyerror (yymsgp);
-        if (yysyntax_error_status == YYENOMEM)
+        if (yyreport_syntax_error (&yyctx) == 2)
           goto yyexhaustedlab;
       }
     }
@@ -3657,10 +3565,41 @@ yyreturn:
   if (yyss != yyssa)
     YYSTACK_FREE (yyss);
 #endif
-  if (yymsg != yymsgbuf)
-    YYSTACK_FREE (yymsg);
+
   return yyresult;
 }
 
-#line 705 "engines/director/lingo/lingo-gr.y"
+#line 707 "engines/director/lingo/lingo-gr.y"
+
+
+int yyreport_syntax_error(const yypcontext_t *ctx) {
+	int res = 0;
+
+	if (lex_check_parens()) {
+		g_lingo->_ignoreError = true;
+		return 0;
+	}
+
+	Common::String msg = "syntax error, ";
 
+	// Report the unexpected token.
+	yysymbol_kind_t lookahead = yypcontext_token(ctx);
+	if (lookahead != YYSYMBOL_YYEMPTY)
+		msg += Common::String::format("unexpected %s", yysymbol_name(lookahead));
+
+	// Report the tokens expected at this point.
+	enum { TOKENMAX = 10 };
+	yysymbol_kind_t expected[TOKENMAX];
+
+	int n = yypcontext_expected_tokens(ctx, expected, TOKENMAX);
+	if (n < 0)
+		// Forward errors to yyparse.
+		res = n;
+	else
+		for (int i = 0; i < n; ++i)
+			msg += Common::String::format("%s %s", i == 0 ? ": expected" : " or", yysymbol_name(expected[i]));
+
+	yyerror(msg.c_str());
+
+	return res;
+}
diff --git a/engines/director/lingo/lingo-gr.h b/engines/director/lingo/lingo-gr.h
index e80fe512e9..faf65d30be 100644
--- a/engines/director/lingo/lingo-gr.h
+++ b/engines/director/lingo/lingo-gr.h
@@ -148,7 +148,7 @@ extern int yydebug;
 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
 union YYSTYPE
 {
-#line 96 "engines/director/lingo/lingo-gr.y"
+#line 89 "engines/director/lingo/lingo-gr.y"
 
 	Common::String *s;
 	int i;
diff --git a/engines/director/lingo/lingo-gr.y b/engines/director/lingo/lingo-gr.y
index 90e79051ed..7986a128c0 100644
--- a/engines/director/lingo/lingo-gr.y
+++ b/engines/director/lingo/lingo-gr.y
@@ -43,10 +43,10 @@
 // ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
 // THIS SOFTWARE.
 
-%require "3.5"
+%require "3.6"
 %defines "engines/director/lingo/lingo-gr.h"
 %output "engines/director/lingo/lingo-gr.cpp"
-%define parse.error verbose
+%define parse.error custom
 %define parse.trace
 
 // %glr-parser
@@ -69,15 +69,8 @@ extern void lex_unput(int c);
 extern bool lex_check_parens();
 
 using namespace Director;
-void yyerror(const char *s) {
-	// Director parser till D3 was forgiving for any hanging parentheses
-	if (g_director->getVersion() <= 4) {
-		if (lex_check_parens()) {
-			warning("# LINGO: Ignoring trailing parens");
-			return;
-		}
-	}
 
+void yyerror(const char *s) {
 	g_lingo->_hadError = true;
 	warning("######################  LINGO: %s at line %d col %d", s, g_lingo->_linenumber, g_lingo->_colnumber);
 }
@@ -154,7 +147,6 @@ program: programline
 programline: /* empty */
 	| defn
 	| stmt
-	| error	'\n'		{ yyerrok; lex_unput('\n'); }
 
 asgn: tPUT expr tINTO ID 		{
 		g_lingo->code1(LC::c_varpush);
@@ -437,6 +429,16 @@ simpleexpr: INT		{
 		g_lingo->code2(e, f); }
 	| '(' expr[arg] ')'			{ $$ = $arg; }
 	| list
+	| error	'\n'		{
+		// Director parser till D3 was forgiving for any hanging parentheses
+		if (g_lingo->_ignoreError) {
+			warning("# LINGO: Ignoring trailing paren");
+			g_lingo->_ignoreError = false;
+			lex_unput('\n');	// We ate '\n', so put it back, otherwise lines will be joined
+		} else {
+			yyerrok;
+		}
+	}
 
 expr: simpleexpr { $$ = $simpleexpr; }
 	| reference
@@ -703,3 +705,35 @@ proppair: SYMBOL ':' simpleexpr {
 
 
 %%
+
+int yyreport_syntax_error(const yypcontext_t *ctx) {
+	int res = 0;
+
+	if (lex_check_parens()) {
+		g_lingo->_ignoreError = true;
+		return 0;
+	}
+
+	Common::String msg = "syntax error, ";
+
+	// Report the unexpected token.
+	yysymbol_kind_t lookahead = yypcontext_token(ctx);
+	if (lookahead != YYSYMBOL_YYEMPTY)
+		msg += Common::String::format("unexpected %s", yysymbol_name(lookahead));
+
+	// Report the tokens expected at this point.
+	enum { TOKENMAX = 10 };
+	yysymbol_kind_t expected[TOKENMAX];
+
+	int n = yypcontext_expected_tokens(ctx, expected, TOKENMAX);
+	if (n < 0)
+		// Forward errors to yyparse.
+		res = n;
+	else
+		for (int i = 0; i < n; ++i)
+			msg += Common::String::format("%s %s", i == 0 ? ": expected" : " or", yysymbol_name(expected[i]));
+
+	yyerror(msg.c_str());
+
+	return res;
+}
diff --git a/engines/director/lingo/lingo-lex.cpp b/engines/director/lingo/lingo-lex.cpp
index aa39bec27b..3e228b489e 100644
--- a/engines/director/lingo/lingo-lex.cpp
+++ b/engines/director/lingo/lingo-lex.cpp
@@ -801,6 +801,8 @@ static void count() {
 		debug("LEXER: Read '%s' at %d:%d", yytext, g_lingo->_linenumber, g_lingo->_colnumber);
 
 	char *p = yytext;
+	g_lingo->_lasttoken = yytext;
+	g_lingo->_lastbytenumber = g_lingo->_bytenumber;
 
 	while (*p && *p != '\n' && *p != '\r') {
 		p++;
@@ -828,7 +830,7 @@ static int checkImmediate(int token) {
 	return token;
 }
 
-#line 832 "engines/director/lingo/lingo-lex.cpp"
+#line 834 "engines/director/lingo/lingo-lex.cpp"
 
 #define INITIAL 0
 
@@ -1013,10 +1015,10 @@ YY_DECL
 	register char *yy_cp, *yy_bp;
 	register int yy_act;
     
-#line 90 "engines/director/lingo/lingo-lex.l"
+#line 92 "engines/director/lingo/lingo-lex.l"
 
 
-#line 1020 "engines/director/lingo/lingo-lex.cpp"
+#line 1022 "engines/director/lingo/lingo-lex.cpp"
 
 	if ( !(yy_init) )
 		{
@@ -1099,77 +1101,77 @@ do_action:	/* This label is used only to access EOF actions. */
 case 1:
 /* rule 1 can match eol */
 YY_RULE_SETUP
-#line 92 "engines/director/lingo/lingo-lex.l"
+#line 94 "engines/director/lingo/lingo-lex.l"
 { count(); }
 	YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 93 "engines/director/lingo/lingo-lex.l"
+#line 95 "engines/director/lingo/lingo-lex.l"
 
 	YY_BREAK
 case 3:
 YY_RULE_SETUP
-#line 94 "engines/director/lingo/lingo-lex.l"
+#line 96 "engines/director/lingo/lingo-lex.l"
 { count(); }
 	YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 95 "engines/director/lingo/lingo-lex.l"
+#line 97 "engines/director/lingo/lingo-lex.l"
 { count(); return ' '; }
 	YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 97 "engines/director/lingo/lingo-lex.l"
+#line 99 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.s = new Common::String(yytext + 1); return SYMBOL; }	// D3, skip '#'
 	YY_BREAK
 case 6:
 YY_RULE_SETUP
-#line 99 "engines/director/lingo/lingo-lex.l"
+#line 101 "engines/director/lingo/lingo-lex.l"
 { count(); return tAFTER; }		// D3
 	YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 100 "engines/director/lingo/lingo-lex.l"
+#line 102 "engines/director/lingo/lingo-lex.l"
 { count(); return tAND; }
 	YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 101 "engines/director/lingo/lingo-lex.l"
+#line 103 "engines/director/lingo/lingo-lex.l"
 { count(); return tBEFORE; }	// D3
 	YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 102 "engines/director/lingo/lingo-lex.l"
+#line 104 "engines/director/lingo/lingo-lex.l"
 { count(); return tCHAR; }		// D3
 	YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 103 "engines/director/lingo/lingo-lex.l"
+#line 105 "engines/director/lingo/lingo-lex.l"
 { count(); return tCONTAINS; }
 	YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 104 "engines/director/lingo/lingo-lex.l"
+#line 106 "engines/director/lingo/lingo-lex.l"
 { count(); return tDOWN; }
 	YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 105 "engines/director/lingo/lingo-lex.l"
+#line 107 "engines/director/lingo/lingo-lex.l"
 { count(); return tIF; }
 	YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 106 "engines/director/lingo/lingo-lex.l"
+#line 108 "engines/director/lingo/lingo-lex.l"
 { count(); return tELSIF; }
 	YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 107 "engines/director/lingo/lingo-lex.l"
+#line 109 "engines/director/lingo/lingo-lex.l"
 { count(); return tELSE; }
 	YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 108 "engines/director/lingo/lingo-lex.l"
+#line 110 "engines/director/lingo/lingo-lex.l"
 {
 		count();
 
@@ -1191,72 +1193,72 @@ YY_RULE_SETUP
 	YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 126 "engines/director/lingo/lingo-lex.l"
+#line 128 "engines/director/lingo/lingo-lex.l"
 { count(); return tFACTORY; }
 	YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 127 "engines/director/lingo/lingo-lex.l"
+#line 129 "engines/director/lingo/lingo-lex.l"
 { count(); return tEXIT; }
 	YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 128 "engines/director/lingo/lingo-lex.l"
+#line 130 "engines/director/lingo/lingo-lex.l"
 { count(); return tGLOBAL; }
 	YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 129 "engines/director/lingo/lingo-lex.l"
+#line 131 "engines/director/lingo/lingo-lex.l"
 { count(); return tGO; }
 	YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 130 "engines/director/lingo/lingo-lex.l"
+#line 132 "engines/director/lingo/lingo-lex.l"
 { count(); return tGO; }
 	YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 131 "engines/director/lingo/lingo-lex.l"
+#line 133 "engines/director/lingo/lingo-lex.l"
 { count(); return tINSTANCE; }
 	YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 132 "engines/director/lingo/lingo-lex.l"
+#line 134 "engines/director/lingo/lingo-lex.l"
 { count(); return tINTERSECTS; }
 	YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 133 "engines/director/lingo/lingo-lex.l"
+#line 135 "engines/director/lingo/lingo-lex.l"
 { count(); return tINTO; }
 	YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 134 "engines/director/lingo/lingo-lex.l"
+#line 136 "engines/director/lingo/lingo-lex.l"
 { count(); return tIN; }
 	YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 135 "engines/director/lingo/lingo-lex.l"
+#line 137 "engines/director/lingo/lingo-lex.l"
 { count(); return tITEM; }
 	YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 136 "engines/director/lingo/lingo-lex.l"
+#line 138 "engines/director/lingo/lingo-lex.l"
 { count(); return tLINE; }
 	YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 137 "engines/director/lingo/lingo-lex.l"
+#line 139 "engines/director/lingo/lingo-lex.l"
 { count(); return checkImmediate(tLOOP); }
 	YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 138 "engines/director/lingo/lingo-lex.l"
+#line 140 "engines/director/lingo/lingo-lex.l"
 { count(); return tMACRO; }
 	YY_BREAK
 case 29:
 YY_RULE_SETUP
-#line 139 "engines/director/lingo/lingo-lex.l"
+#line 141 "engines/director/lingo/lingo-lex.l"
 {
 		count();
 
@@ -1271,97 +1273,97 @@ YY_RULE_SETUP
 	YY_BREAK
 case 30:
 YY_RULE_SETUP
-#line 150 "engines/director/lingo/lingo-lex.l"
+#line 152 "engines/director/lingo/lingo-lex.l"
 { count(); return tMOD; }
 	YY_BREAK
 case 31:
 YY_RULE_SETUP
-#line 151 "engines/director/lingo/lingo-lex.l"
+#line 153 "engines/director/lingo/lingo-lex.l"
 { count(); return tMOVIE; }
 	YY_BREAK
 case 32:
 YY_RULE_SETUP
-#line 152 "engines/director/lingo/lingo-lex.l"
+#line 154 "engines/director/lingo/lingo-lex.l"
 { count(); return tNEXT; }
 	YY_BREAK
 case 33:
 YY_RULE_SETUP
-#line 153 "engines/director/lingo/lingo-lex.l"
+#line 155 "engines/director/lingo/lingo-lex.l"
 { count(); return tNOT; }
 	YY_BREAK
 case 34:
 YY_RULE_SETUP
-#line 154 "engines/director/lingo/lingo-lex.l"
+#line 156 "engines/director/lingo/lingo-lex.l"
 { count(); return tOF; }
 	YY_BREAK
 case 35:
 YY_RULE_SETUP
-#line 155 "engines/director/lingo/lingo-lex.l"
+#line 157 "engines/director/lingo/lingo-lex.l"
 { count(); return tON; }		// D3
 	YY_BREAK
 case 36:
 YY_RULE_SETUP
-#line 156 "engines/director/lingo/lingo-lex.l"
+#line 158 "engines/director/lingo/lingo-lex.l"
 { count(); return tOPEN; }
 	YY_BREAK
 case 37:
 YY_RULE_SETUP
-#line 157 "engines/director/lingo/lingo-lex.l"
+#line 159 "engines/director/lingo/lingo-lex.l"
 { count(); return tOR; }
 	YY_BREAK
 case 38:
 YY_RULE_SETUP
-#line 158 "engines/director/lingo/lingo-lex.l"
+#line 160 "engines/director/lingo/lingo-lex.l"
 { count(); return tPLAY; }
 	YY_BREAK
 case 39:
 YY_RULE_SETUP
-#line 159 "engines/director/lingo/lingo-lex.l"
+#line 161 "engines/director/lingo/lingo-lex.l"
 { count(); return tPLAY; }
 	YY_BREAK
 case 40:
 YY_RULE_SETUP
-#line 160 "engines/director/lingo/lingo-lex.l"
+#line 162 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.s = new Common::String(yytext); return tPLAYACCEL; }
 	YY_BREAK
 case 41:
 YY_RULE_SETUP
-#line 161 "engines/director/lingo/lingo-lex.l"
+#line 163 "engines/director/lingo/lingo-lex.l"
 { count(); return tPREVIOUS; }
 	YY_BREAK
 case 42:
 YY_RULE_SETUP
-#line 162 "engines/director/lingo/lingo-lex.l"
+#line 164 "engines/director/lingo/lingo-lex.l"
 { count(); return tPROPERTY; }	// D4
 	YY_BREAK
 case 43:
 YY_RULE_SETUP
-#line 163 "engines/director/lingo/lingo-lex.l"
+#line 165 "engines/director/lingo/lingo-lex.l"
 { count(); return tPUT; }
 	YY_BREAK
 case 44:
 YY_RULE_SETUP
-#line 164 "engines/director/lingo/lingo-lex.l"
+#line 166 "engines/director/lingo/lingo-lex.l"
 { count(); return checkImmediate(tREPEAT); }
 	YY_BREAK
 case 45:
 YY_RULE_SETUP
-#line 165 "engines/director/lingo/lingo-lex.l"
+#line 167 "engines/director/lingo/lingo-lex.l"
 { count(); return tSET; }
 	YY_BREAK
 case 46:
 YY_RULE_SETUP
-#line 166 "engines/director/lingo/lingo-lex.l"
+#line 168 "engines/director/lingo/lingo-lex.l"
 { count(); return tSTARTS; }
 	YY_BREAK
 case 47:
 YY_RULE_SETUP
-#line 167 "engines/director/lingo/lingo-lex.l"
+#line 169 "engines/director/lingo/lingo-lex.l"
 { count(); return tTELL; }
 	YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 168 "engines/director/lingo/lingo-lex.l"
+#line 170 "engines/director/lingo/lingo-lex.l"
 {
 		count();
 
@@ -1400,7 +1402,7 @@ YY_RULE_SETUP
 	YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 203 "engines/director/lingo/lingo-lex.l"
+#line 205 "engines/director/lingo/lingo-lex.l"
 {
 		count();
 
@@ -1426,7 +1428,7 @@ YY_RULE_SETUP
 	YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 225 "engines/director/lingo/lingo-lex.l"
+#line 227 "engines/director/lingo/lingo-lex.l"
 {
 		count();
 
@@ -1493,7 +1495,7 @@ YY_RULE_SETUP
 	YY_BREAK
 case 51:
 YY_RULE_SETUP
-#line 288 "engines/director/lingo/lingo-lex.l"
+#line 290 "engines/director/lingo/lingo-lex.l"
 {
 		count();
 
@@ -1531,7 +1533,7 @@ YY_RULE_SETUP
 	YY_BREAK
 case 52:
 YY_RULE_SETUP
-#line 322 "engines/director/lingo/lingo-lex.l"
+#line 324 "engines/director/lingo/lingo-lex.l"
 {
 		count();
 
@@ -1562,72 +1564,72 @@ YY_RULE_SETUP
 	YY_BREAK
 case 53:
 YY_RULE_SETUP
-#line 349 "engines/director/lingo/lingo-lex.l"
+#line 351 "engines/director/lingo/lingo-lex.l"
 { count(); return tTHEN; }
 	YY_BREAK
 case 54:
 YY_RULE_SETUP
-#line 350 "engines/director/lingo/lingo-lex.l"
+#line 352 "engines/director/lingo/lingo-lex.l"
 { count(); return tTO; }
 	YY_BREAK
 case 55:
 YY_RULE_SETUP
-#line 351 "engines/director/lingo/lingo-lex.l"
+#line 353 "engines/director/lingo/lingo-lex.l"
 { count(); return tSPRITE; }
 	YY_BREAK
 case 56:
 YY_RULE_SETUP
-#line 352 "engines/director/lingo/lingo-lex.l"
+#line 354 "engines/director/lingo/lingo-lex.l"
 { count(); return tWITH; }
 	YY_BREAK
 case 57:
 YY_RULE_SETUP
-#line 353 "engines/director/lingo/lingo-lex.l"
+#line 355 "engines/director/lingo/lingo-lex.l"
 { count(); return tWITHIN; }
 	YY_BREAK
 case 58:
 YY_RULE_SETUP
-#line 354 "engines/director/lingo/lingo-lex.l"
+#line 356 "engines/director/lingo/lingo-lex.l"
 { count(); return tWHEN; }
 	YY_BREAK
 case 59:
 YY_RULE_SETUP
-#line 355 "engines/director/lingo/lingo-lex.l"
+#line 357 "engines/director/lingo/lingo-lex.l"
 { count(); return tWHILE; }
 	YY_BREAK
 case 60:
 YY_RULE_SETUP
-#line 356 "engines/director/lingo/lingo-lex.l"
+#line 358 "engines/director/lingo/lingo-lex.l"
 { count(); return tWORD; }
 	YY_BREAK
 case 61:
 YY_RULE_SETUP
-#line 358 "engines/director/lingo/lingo-lex.l"
+#line 360 "engines/director/lingo/lingo-lex.l"
 { count(); return tNEQ; }
 	YY_BREAK
 case 62:
 YY_RULE_SETUP
-#line 359 "engines/director/lingo/lingo-lex.l"
+#line 361 "engines/director/lingo/lingo-lex.l"
 { count(); return tGE; }
 	YY_BREAK
 case 63:
 YY_RULE_SETUP
-#line 360 "engines/director/lingo/lingo-lex.l"
+#line 362 "engines/director/lingo/lingo-lex.l"
 { count(); return tLE; }
 	YY_BREAK
 case 64:
 YY_RULE_SETUP
-#line 361 "engines/director/lingo/lingo-lex.l"
+#line 363 "engines/director/lingo/lingo-lex.l"
 { count(); return tCONCAT; }
 	YY_BREAK
 case 65:
 YY_RULE_SETUP
-#line 362 "engines/director/lingo/lingo-lex.l"
+#line 364 "engines/director/lingo/lingo-lex.l"
 { count(); return tEQ; }
 	YY_BREAK
 case 66:
 YY_RULE_SETUP
-#line 364 "engines/director/lingo/lingo-lex.l"
+#line 366 "engines/director/lingo/lingo-lex.l"
 {
 		count();
 		yylval.s = new Common::String(yytext);
@@ -1665,41 +1667,41 @@ YY_RULE_SETUP
 	YY_BREAK
 case 67:
 YY_RULE_SETUP
-#line 398 "engines/director/lingo/lingo-lex.l"
+#line 400 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.f = atof(yytext); return FLOAT; }
 	YY_BREAK
 case 68:
 YY_RULE_SETUP
-#line 399 "engines/director/lingo/lingo-lex.l"
+#line 401 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.i = strtol(yytext, NULL, 10); return INT; }
 	YY_BREAK
 case 69:
 YY_RULE_SETUP
-#line 400 "engines/director/lingo/lingo-lex.l"
+#line 402 "engines/director/lingo/lingo-lex.l"
 { count(); return *yytext; }
 	YY_BREAK
 case 70:
 /* rule 70 can match eol */
 YY_RULE_SETUP
-#line 401 "engines/director/lingo/lingo-lex.l"
+#line 403 "engines/director/lingo/lingo-lex.l"
 { count(); return '\n'; }
 	YY_BREAK
 case 71:
 YY_RULE_SETUP
-#line 402 "engines/director/lingo/lingo-lex.l"
+#line 404 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.s = new Common::String(&yytext[1]); yylval.s->deleteLastChar(); return STRING; }
 	YY_BREAK
 case 72:
 YY_RULE_SETUP
-#line 403 "engines/director/lingo/lingo-lex.l"
+#line 405 "engines/director/lingo/lingo-lex.l"
 { count(); }
 	YY_BREAK
 case 73:
 YY_RULE_SETUP
-#line 405 "engines/director/lingo/lingo-lex.l"
+#line 407 "engines/director/lingo/lingo-lex.l"
 ECHO;
 	YY_BREAK
-#line 1703 "engines/director/lingo/lingo-lex.cpp"
+#line 1705 "engines/director/lingo/lingo-lex.cpp"
 case YY_STATE_EOF(INITIAL):
 	yyterminate();
 
@@ -2696,7 +2698,7 @@ void yyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 405 "engines/director/lingo/lingo-lex.l"
+#line 407 "engines/director/lingo/lingo-lex.l"
 
 
 
@@ -2711,23 +2713,24 @@ void lex_unput(int c) {
 static const char *inputbuffer;
 
 bool lex_check_parens() {
-	if (!g_lingo->_bytenumber)
+	// D2 and D3 were forgiving for trailing braces, so
+	// set a = 1)))()))))))  --   is a valid Lingo!
+	if (g_director->getVersion() > 3)
 		return false;
 
-	const char *ptr = &inputbuffer[g_lingo->_bytenumber - 1];
-	bool sawparen = false;
+	if (!g_lingo->_lasttoken.equals(")"))
+		return false;
 
-	while (*ptr && *ptr != '\n') {
-		if (*ptr == ')' || *ptr == '(')
-			sawparen = true;
+	const char *ptr = &inputbuffer[g_lingo->_lastbytenumber];
 
+	while (*ptr && *ptr != '\n') {
 		if (*ptr != ')' && *ptr != '(' && *ptr != ' ' && *ptr != '\xC2')
 			return false;
 
 		ptr++;
 	}
 
-	return sawparen;
+	return true;
 }
 
 namespace Director {
diff --git a/engines/director/lingo/lingo-lex.l b/engines/director/lingo/lingo-lex.l
index 53487a2606..5be2ad1798 100644
--- a/engines/director/lingo/lingo-lex.l
+++ b/engines/director/lingo/lingo-lex.l
@@ -50,6 +50,8 @@ static void count() {
 		debug("LEXER: Read '%s' at %d:%d", yytext, g_lingo->_linenumber, g_lingo->_colnumber);
 
 	char *p = yytext;
+	g_lingo->_lasttoken = yytext;
+	g_lingo->_lastbytenumber = g_lingo->_bytenumber;
 
 	while (*p && *p != '\n' && *p != '\r') {
 		p++;
@@ -415,23 +417,24 @@ void lex_unput(int c) {
 static const char *inputbuffer;
 
 bool lex_check_parens() {
-	if (!g_lingo->_bytenumber)
+	// D2 and D3 were forgiving for trailing braces, so
+	// set a = 1)))()))))))  --   is a valid Lingo!
+	if (g_director->getVersion() > 3)
 		return false;
 
-	const char *ptr = &inputbuffer[g_lingo->_bytenumber - 1];
-	bool sawparen = false;
+	if (!g_lingo->_lasttoken.equals(")"))
+		return false;
 
-	while (*ptr && *ptr != '\n') {
-		if (*ptr == ')' || *ptr == '(')
-			sawparen = true;
+	const char *ptr = &inputbuffer[g_lingo->_lastbytenumber];
 
+	while (*ptr && *ptr != '\n') {
 		if (*ptr != ')' && *ptr != '(' && *ptr != ' ' && *ptr != '\xC2')
 			return false;
 
 		ptr++;
 	}
 
-	return sawparen;
+	return true;
 }
 
 namespace Director {
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 490e404f85..385d6e4f00 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -150,7 +150,8 @@ Lingo::Lingo(DirectorEngine *vm) : _vm(vm) {
 	_ignoreMe = false;
 	_immediateMode = false;
 
-	_linenumber = _colnumber = _bytenumber = 0;
+	_linenumber = _colnumber = _bytenumber = _lastbytenumber = _errorbytenumber = 0;
+	_ignoreError = false;
 
 	_hadError = false;
 
diff --git a/engines/director/lingo/lingo.h b/engines/director/lingo/lingo.h
index 047491334f..75389695a9 100644
--- a/engines/director/lingo/lingo.h
+++ b/engines/director/lingo/lingo.h
@@ -416,6 +416,11 @@ public:
 	int _linenumber;
 	int _colnumber;
 	int _bytenumber;
+	Common::String _lasttoken;
+	int _lastbytenumber;
+	Common::String _errortoken;
+	int _errorbytenumber;
+	bool _ignoreError;
 
 	Common::String _floatPrecisionFormat;
 




More information about the Scummvm-git-logs mailing list