mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-15 22:28:10 +00:00
DIRECTOR: LINGO: Match local arguments during parsing
This commit is contained in:
parent
bd1c0add82
commit
e972d5109f
@ -317,6 +317,14 @@ int Lingo::codeArray(int arraySize) {
|
|||||||
return _currentScript->size();
|
return _currentScript->size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Lingo::isInArgStack(Common::String *s) {
|
||||||
|
for (int i = 0; i < _argstack.size(); i++)
|
||||||
|
if (_argstack[i]->equalsIgnoreCase(*s))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void Lingo::codeArg(Common::String *s) {
|
void Lingo::codeArg(Common::String *s) {
|
||||||
_argstack.push_back(s);
|
_argstack.push_back(s);
|
||||||
}
|
}
|
||||||
|
@ -1538,6 +1538,15 @@ YY_RULE_SETUP
|
|||||||
if (g_lingo->_ignoreMe && yylval.s->equalsIgnoreCase("me"))
|
if (g_lingo->_ignoreMe && yylval.s->equalsIgnoreCase("me"))
|
||||||
return ID;
|
return ID;
|
||||||
|
|
||||||
|
// When we are defining arguments, allow any string
|
||||||
|
if (g_lingo->_indef == kStateInArgs)
|
||||||
|
return ID;
|
||||||
|
|
||||||
|
// First of all, match against argument list
|
||||||
|
if (g_lingo->_indef == kStateInDef)
|
||||||
|
if (g_lingo->isInArgStack(yylval.s))
|
||||||
|
return ID;
|
||||||
|
|
||||||
if (g_lingo->_twoWordBuiltins.contains(yytext))
|
if (g_lingo->_twoWordBuiltins.contains(yytext))
|
||||||
return TWOWORDBUILTIN;
|
return TWOWORDBUILTIN;
|
||||||
|
|
||||||
@ -1579,41 +1588,41 @@ YY_RULE_SETUP
|
|||||||
YY_BREAK
|
YY_BREAK
|
||||||
case 68:
|
case 68:
|
||||||
YY_RULE_SETUP
|
YY_RULE_SETUP
|
||||||
#line 336 "engines/director/lingo/lingo-lex.l"
|
#line 345 "engines/director/lingo/lingo-lex.l"
|
||||||
{ count(); yylval.f = atof(yytext); return FLOAT; }
|
{ count(); yylval.f = atof(yytext); return FLOAT; }
|
||||||
YY_BREAK
|
YY_BREAK
|
||||||
case 69:
|
case 69:
|
||||||
YY_RULE_SETUP
|
YY_RULE_SETUP
|
||||||
#line 337 "engines/director/lingo/lingo-lex.l"
|
#line 346 "engines/director/lingo/lingo-lex.l"
|
||||||
{ count(); yylval.i = strtol(yytext, NULL, 10); return INT; }
|
{ count(); yylval.i = strtol(yytext, NULL, 10); return INT; }
|
||||||
YY_BREAK
|
YY_BREAK
|
||||||
case 70:
|
case 70:
|
||||||
YY_RULE_SETUP
|
YY_RULE_SETUP
|
||||||
#line 338 "engines/director/lingo/lingo-lex.l"
|
#line 347 "engines/director/lingo/lingo-lex.l"
|
||||||
{ count(); return *yytext; }
|
{ count(); return *yytext; }
|
||||||
YY_BREAK
|
YY_BREAK
|
||||||
case 71:
|
case 71:
|
||||||
/* rule 71 can match eol */
|
/* rule 71 can match eol */
|
||||||
YY_RULE_SETUP
|
YY_RULE_SETUP
|
||||||
#line 339 "engines/director/lingo/lingo-lex.l"
|
#line 348 "engines/director/lingo/lingo-lex.l"
|
||||||
{ count(); return '\n'; }
|
{ count(); return '\n'; }
|
||||||
YY_BREAK
|
YY_BREAK
|
||||||
case 72:
|
case 72:
|
||||||
YY_RULE_SETUP
|
YY_RULE_SETUP
|
||||||
#line 340 "engines/director/lingo/lingo-lex.l"
|
#line 349 "engines/director/lingo/lingo-lex.l"
|
||||||
{ count(); yylval.s = new Common::String(&yytext[1]); yylval.s->deleteLastChar(); return STRING; }
|
{ count(); yylval.s = new Common::String(&yytext[1]); yylval.s->deleteLastChar(); return STRING; }
|
||||||
YY_BREAK
|
YY_BREAK
|
||||||
case 73:
|
case 73:
|
||||||
YY_RULE_SETUP
|
YY_RULE_SETUP
|
||||||
#line 341 "engines/director/lingo/lingo-lex.l"
|
#line 350 "engines/director/lingo/lingo-lex.l"
|
||||||
{ count(); }
|
{ count(); }
|
||||||
YY_BREAK
|
YY_BREAK
|
||||||
case 74:
|
case 74:
|
||||||
YY_RULE_SETUP
|
YY_RULE_SETUP
|
||||||
#line 343 "engines/director/lingo/lingo-lex.l"
|
#line 352 "engines/director/lingo/lingo-lex.l"
|
||||||
ECHO;
|
ECHO;
|
||||||
YY_BREAK
|
YY_BREAK
|
||||||
#line 1617 "engines/director/lingo/lingo-lex.cpp"
|
#line 1626 "engines/director/lingo/lingo-lex.cpp"
|
||||||
case YY_STATE_EOF(INITIAL):
|
case YY_STATE_EOF(INITIAL):
|
||||||
yyterminate();
|
yyterminate();
|
||||||
|
|
||||||
@ -2573,7 +2582,7 @@ void yyfree (void * ptr )
|
|||||||
|
|
||||||
#define YYTABLES_NAME "yytables"
|
#define YYTABLES_NAME "yytables"
|
||||||
|
|
||||||
#line 343 "engines/director/lingo/lingo-lex.l"
|
#line 352 "engines/director/lingo/lingo-lex.l"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -295,6 +295,15 @@ whitespace [\t ]
|
|||||||
if (g_lingo->_ignoreMe && yylval.s->equalsIgnoreCase("me"))
|
if (g_lingo->_ignoreMe && yylval.s->equalsIgnoreCase("me"))
|
||||||
return ID;
|
return ID;
|
||||||
|
|
||||||
|
// When we are defining arguments, allow any string
|
||||||
|
if (g_lingo->_indef == kStateInArgs)
|
||||||
|
return ID;
|
||||||
|
|
||||||
|
// First of all, match against argument list
|
||||||
|
if (g_lingo->_indef == kStateInDef)
|
||||||
|
if (g_lingo->isInArgStack(yylval.s))
|
||||||
|
return ID;
|
||||||
|
|
||||||
if (g_lingo->_twoWordBuiltins.contains(yytext))
|
if (g_lingo->_twoWordBuiltins.contains(yytext))
|
||||||
return TWOWORDBUILTIN;
|
return TWOWORDBUILTIN;
|
||||||
|
|
||||||
|
@ -559,6 +559,9 @@ public:
|
|||||||
Datum getTheSprite(Datum &id, int field);
|
Datum getTheSprite(Datum &id, int field);
|
||||||
Datum getTheCast(Datum &id, int field);
|
Datum getTheCast(Datum &id, int field);
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool isInArgStack(Common::String *s);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ScriptType _currentScriptType;
|
ScriptType _currentScriptType;
|
||||||
uint16 _currentEntityId;
|
uint16 _currentEntityId;
|
||||||
|
Loading…
Reference in New Issue
Block a user