[Scummvm-git-logs] scummvm master -> 215f077a8cc9e43ba65296be337cc2dc1b71f652

sev- sev at scummvm.org
Thu Jun 11 23:05:24 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:
215f077a8c DIRECTOR: LINGO: Narrowed down 'the <builtin> of <expr>' to D3-


Commit: 215f077a8cc9e43ba65296be337cc2dc1b71f652
    https://github.com/scummvm/scummvm/commit/215f077a8cc9e43ba65296be337cc2dc1b71f652
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2020-06-12T01:05:13+02:00

Commit Message:
DIRECTOR: LINGO: Narrowed down 'the <builtin> of <expr>' to D3-

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


diff --git a/engines/director/lingo/lingo-lex.cpp b/engines/director/lingo/lingo-lex.cpp
index a7cad39f3a..d3e785e2d2 100644
--- a/engines/director/lingo/lingo-lex.cpp
+++ b/engines/director/lingo/lingo-lex.cpp
@@ -1440,19 +1440,6 @@ YY_RULE_SETUP
 				return THEENTITYWITHID;
 			else
 				return THEENTITY;
-		} else if (g_lingo->_builtins.contains(field)) {
-			if (g_lingo->_builtins[field].type == FBLTIN &&
-					g_lingo->_builtins[field].nargs == 1 && g_lingo->_builtins[field].maxArgs == 1) {
-				yylval.s = new Common::String(field);
-				Common::String rest(ptr);
-
-				for (int i = rest.size() - 1; i >= 0; i--)
-					unput(rest[i]);
-
-				unput(' '); unput('f'); unput('o');
-
-				return THEFBLTIN;
-			}
 		} else {
 			if (g_director->getVersion() >= 4) {
 				Common::String key = Common::String::format("%d%s", g_lingo->_objectEntityId, field.c_str());
@@ -1468,6 +1455,24 @@ YY_RULE_SETUP
 				yylval.objectfield.oe = g_lingo->_theEntityFields[key]->field;
 
 				return THEOBJECTFIELD;
+			} else if (g_lingo->_builtins.contains(field)) { // Let's hope they don't do it in D4+
+				if (g_lingo->_builtins[field].type == FBLTIN &&
+						g_lingo->_builtins[field].nargs == 1 && g_lingo->_builtins[field].maxArgs == 1) {
+					yylval.s = new Common::String(field);
+					Common::String rest(ptr);
+
+					// It is the dreaded 'the <builtin> of <expr>'
+					// with 'expr' starting with ID, which leads to clash
+					//
+					// put 'of ID' back.
+
+					for (int i = rest.size() - 1; i >= 0; i--)
+						unput(rest[i]);
+
+					unput(' '); unput('f'); unput('o');
+
+					return THEFBLTIN;
+				}
 			}
 		}
 
@@ -1476,7 +1481,7 @@ YY_RULE_SETUP
 	YY_BREAK
 case 48:
 YY_RULE_SETUP
-#line 326 "engines/director/lingo/lingo-lex.l"
+#line 331 "engines/director/lingo/lingo-lex.l"
 {
 		count();
 
@@ -1514,7 +1519,7 @@ YY_RULE_SETUP
 	YY_BREAK
 case 49:
 YY_RULE_SETUP
-#line 360 "engines/director/lingo/lingo-lex.l"
+#line 365 "engines/director/lingo/lingo-lex.l"
 {
 		count();
 
@@ -1545,72 +1550,72 @@ YY_RULE_SETUP
 	YY_BREAK
 case 50:
 YY_RULE_SETUP
-#line 387 "engines/director/lingo/lingo-lex.l"
+#line 392 "engines/director/lingo/lingo-lex.l"
 { count(); return tTHEN; }
 	YY_BREAK
 case 51:
 YY_RULE_SETUP
-#line 388 "engines/director/lingo/lingo-lex.l"
+#line 393 "engines/director/lingo/lingo-lex.l"
 { count(); return varCheck(tTO, "to"); }
 	YY_BREAK
 case 52:
 YY_RULE_SETUP
-#line 389 "engines/director/lingo/lingo-lex.l"
+#line 394 "engines/director/lingo/lingo-lex.l"
 { count(); return varCheck(tSPRITE, "sprite"); }
 	YY_BREAK
 case 53:
 YY_RULE_SETUP
-#line 390 "engines/director/lingo/lingo-lex.l"
+#line 395 "engines/director/lingo/lingo-lex.l"
 { count(); return varCheck(tWITH, "with"); }
 	YY_BREAK
 case 54:
 YY_RULE_SETUP
-#line 391 "engines/director/lingo/lingo-lex.l"
+#line 396 "engines/director/lingo/lingo-lex.l"
 { count(); return varCheck(tWITHIN, "within"); }
 	YY_BREAK
 case 55:
 YY_RULE_SETUP
-#line 392 "engines/director/lingo/lingo-lex.l"
+#line 397 "engines/director/lingo/lingo-lex.l"
 { count(); return varCheck(tWHEN, "when"); }
 	YY_BREAK
 case 56:
 YY_RULE_SETUP
-#line 393 "engines/director/lingo/lingo-lex.l"
+#line 398 "engines/director/lingo/lingo-lex.l"
 { count(); return varCheck(tWHILE, "while"); }
 	YY_BREAK
 case 57:
 YY_RULE_SETUP
-#line 394 "engines/director/lingo/lingo-lex.l"
+#line 399 "engines/director/lingo/lingo-lex.l"
 { count(); return varCheck(tWORD, "word"); }
 	YY_BREAK
 case 58:
 YY_RULE_SETUP
-#line 396 "engines/director/lingo/lingo-lex.l"
+#line 401 "engines/director/lingo/lingo-lex.l"
 { count(); return tNEQ; }
 	YY_BREAK
 case 59:
 YY_RULE_SETUP
-#line 397 "engines/director/lingo/lingo-lex.l"
+#line 402 "engines/director/lingo/lingo-lex.l"
 { count(); return tGE; }
 	YY_BREAK
 case 60:
 YY_RULE_SETUP
-#line 398 "engines/director/lingo/lingo-lex.l"
+#line 403 "engines/director/lingo/lingo-lex.l"
 { count(); return tLE; }
 	YY_BREAK
 case 61:
 YY_RULE_SETUP
-#line 399 "engines/director/lingo/lingo-lex.l"
+#line 404 "engines/director/lingo/lingo-lex.l"
 { count(); return tCONCAT; }
 	YY_BREAK
 case 62:
 YY_RULE_SETUP
-#line 400 "engines/director/lingo/lingo-lex.l"
+#line 405 "engines/director/lingo/lingo-lex.l"
 { count(); return tEQ; }
 	YY_BREAK
 case 63:
 YY_RULE_SETUP
-#line 402 "engines/director/lingo/lingo-lex.l"
+#line 407 "engines/director/lingo/lingo-lex.l"
 {
 		count();
 		yylval.s = new Common::String(yytext);
@@ -1650,41 +1655,41 @@ YY_RULE_SETUP
 	YY_BREAK
 case 64:
 YY_RULE_SETUP
-#line 438 "engines/director/lingo/lingo-lex.l"
+#line 443 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.f = atof(yytext); return FLOAT; }
 	YY_BREAK
 case 65:
 YY_RULE_SETUP
-#line 439 "engines/director/lingo/lingo-lex.l"
+#line 444 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.i = strtol(yytext, NULL, 10); return INT; }
 	YY_BREAK
 case 66:
 YY_RULE_SETUP
-#line 440 "engines/director/lingo/lingo-lex.l"
+#line 445 "engines/director/lingo/lingo-lex.l"
 { count(); return *yytext; }
 	YY_BREAK
 case 67:
 /* rule 67 can match eol */
 YY_RULE_SETUP
-#line 441 "engines/director/lingo/lingo-lex.l"
+#line 446 "engines/director/lingo/lingo-lex.l"
 { count(); return '\n'; }
 	YY_BREAK
 case 68:
 YY_RULE_SETUP
-#line 442 "engines/director/lingo/lingo-lex.l"
+#line 447 "engines/director/lingo/lingo-lex.l"
 { count(); yylval.s = cleanupString(&yytext[1]); yylval.s->deleteLastChar(); return STRING; }
 	YY_BREAK
 case 69:
 YY_RULE_SETUP
-#line 443 "engines/director/lingo/lingo-lex.l"
+#line 448 "engines/director/lingo/lingo-lex.l"
 { count(); }
 	YY_BREAK
 case 70:
 YY_RULE_SETUP
-#line 445 "engines/director/lingo/lingo-lex.l"
+#line 450 "engines/director/lingo/lingo-lex.l"
 ECHO;
 	YY_BREAK
-#line 1687 "engines/director/lingo/lingo-lex.cpp"
+#line 1692 "engines/director/lingo/lingo-lex.cpp"
 case YY_STATE_EOF(INITIAL):
 	yyterminate();
 
@@ -2693,7 +2698,7 @@ void yyfree (void * ptr )
 
 #define YYTABLES_NAME "yytables"
 
-#line 445 "engines/director/lingo/lingo-lex.l"
+#line 450 "engines/director/lingo/lingo-lex.l"
 
 
 extern int yydebug;
diff --git a/engines/director/lingo/lingo-lex.l b/engines/director/lingo/lingo-lex.l
index 3b273aa7e2..fc318ed70f 100644
--- a/engines/director/lingo/lingo-lex.l
+++ b/engines/director/lingo/lingo-lex.l
@@ -290,19 +290,6 @@ the{spc}+[[:alpha:]]+{spc}+of{spc}+{identifier}	{
 				return THEENTITYWITHID;
 			else
 				return THEENTITY;
-		} else if (g_lingo->_builtins.contains(field)) {
-			if (g_lingo->_builtins[field].type == FBLTIN &&
-					g_lingo->_builtins[field].nargs == 1 && g_lingo->_builtins[field].maxArgs == 1) {
-				yylval.s = new Common::String(field);
-				Common::String rest(ptr);
-
-				for (int i = rest.size() - 1; i >= 0; i--)
-					unput(rest[i]);
-
-				unput(' '); unput('f'); unput('o');
-
-				return THEFBLTIN;
-			}
 		} else {
 			if (g_director->getVersion() >= 4) {
 				Common::String key = Common::String::format("%d%s", g_lingo->_objectEntityId, field.c_str());
@@ -318,6 +305,24 @@ the{spc}+[[:alpha:]]+{spc}+of{spc}+{identifier}	{
 				yylval.objectfield.oe = g_lingo->_theEntityFields[key]->field;
 
 				return THEOBJECTFIELD;
+			} else if (g_lingo->_builtins.contains(field)) { // Let's hope they don't do it in D4+
+				if (g_lingo->_builtins[field].type == FBLTIN &&
+						g_lingo->_builtins[field].nargs == 1 && g_lingo->_builtins[field].maxArgs == 1) {
+					yylval.s = new Common::String(field);
+					Common::String rest(ptr);
+
+					// It is the dreaded 'the <builtin> of <expr>'
+					// with 'expr' starting with ID, which leads to clash
+					//
+					// put 'of ID' back.
+
+					for (int i = rest.size() - 1; i >= 0; i--)
+						unput(rest[i]);
+
+					unput(' '); unput('f'); unput('o');
+
+					return THEFBLTIN;
+				}
 			}
 		}
 




More information about the Scummvm-git-logs mailing list