mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-15 08:39:45 +00:00
DIRECTOR: LINGO: Simplified grammar
This commit is contained in:
parent
f9ea2ec28a
commit
06280dd403
File diff suppressed because it is too large
Load Diff
@ -65,78 +65,70 @@ extern int yydebug;
|
||||
THEENTITYWITHID = 271,
|
||||
FLOAT = 272,
|
||||
BLTIN = 273,
|
||||
BLTINNOARGS = 274,
|
||||
BLTINNOARGSORONE = 275,
|
||||
BLTINONEARG = 276,
|
||||
BLTINARGLIST = 277,
|
||||
FBLTIN = 278,
|
||||
FBLTINNOARGS = 279,
|
||||
FBLTINONEARG = 280,
|
||||
FBLTINARGLIST = 281,
|
||||
RBLTIN = 282,
|
||||
RBLTINONEARG = 283,
|
||||
ID = 284,
|
||||
STRING = 285,
|
||||
HANDLER = 286,
|
||||
SYMBOL = 287,
|
||||
ENDCLAUSE = 288,
|
||||
tPLAYACCEL = 289,
|
||||
tMETHOD = 290,
|
||||
THEOBJECTFIELD = 291,
|
||||
tDOWN = 292,
|
||||
tELSE = 293,
|
||||
tELSIF = 294,
|
||||
tEXIT = 295,
|
||||
tGLOBAL = 296,
|
||||
tGO = 297,
|
||||
tIF = 298,
|
||||
tINTO = 299,
|
||||
tLOOP = 300,
|
||||
tMACRO = 301,
|
||||
tMOVIE = 302,
|
||||
tNEXT = 303,
|
||||
tOF = 304,
|
||||
tPREVIOUS = 305,
|
||||
tPUT = 306,
|
||||
tREPEAT = 307,
|
||||
tSET = 308,
|
||||
tTHEN = 309,
|
||||
tTO = 310,
|
||||
tWHEN = 311,
|
||||
tWITH = 312,
|
||||
tWHILE = 313,
|
||||
tNLELSE = 314,
|
||||
tFACTORY = 315,
|
||||
tOPEN = 316,
|
||||
tPLAY = 317,
|
||||
tDONE = 318,
|
||||
tINSTANCE = 319,
|
||||
tGE = 320,
|
||||
tLE = 321,
|
||||
tEQ = 322,
|
||||
tNEQ = 323,
|
||||
tAND = 324,
|
||||
tOR = 325,
|
||||
tNOT = 326,
|
||||
tMOD = 327,
|
||||
tAFTER = 328,
|
||||
tBEFORE = 329,
|
||||
tCONCAT = 330,
|
||||
tCONTAINS = 331,
|
||||
tSTARTS = 332,
|
||||
tCHAR = 333,
|
||||
tITEM = 334,
|
||||
tLINE = 335,
|
||||
tWORD = 336,
|
||||
tSPRITE = 337,
|
||||
tINTERSECTS = 338,
|
||||
tWITHIN = 339,
|
||||
tTELL = 340,
|
||||
tPROPERTY = 341,
|
||||
tON = 342,
|
||||
tENDIF = 343,
|
||||
tENDREPEAT = 344,
|
||||
tENDTELL = 345
|
||||
FBLTIN = 274,
|
||||
RBLTIN = 275,
|
||||
ID = 276,
|
||||
STRING = 277,
|
||||
HANDLER = 278,
|
||||
SYMBOL = 279,
|
||||
ENDCLAUSE = 280,
|
||||
tPLAYACCEL = 281,
|
||||
tMETHOD = 282,
|
||||
THEOBJECTFIELD = 283,
|
||||
tDOWN = 284,
|
||||
tELSE = 285,
|
||||
tELSIF = 286,
|
||||
tEXIT = 287,
|
||||
tGLOBAL = 288,
|
||||
tGO = 289,
|
||||
tIF = 290,
|
||||
tINTO = 291,
|
||||
tLOOP = 292,
|
||||
tMACRO = 293,
|
||||
tMOVIE = 294,
|
||||
tNEXT = 295,
|
||||
tOF = 296,
|
||||
tPREVIOUS = 297,
|
||||
tPUT = 298,
|
||||
tREPEAT = 299,
|
||||
tSET = 300,
|
||||
tTHEN = 301,
|
||||
tTO = 302,
|
||||
tWHEN = 303,
|
||||
tWITH = 304,
|
||||
tWHILE = 305,
|
||||
tNLELSE = 306,
|
||||
tFACTORY = 307,
|
||||
tOPEN = 308,
|
||||
tPLAY = 309,
|
||||
tDONE = 310,
|
||||
tINSTANCE = 311,
|
||||
tGE = 312,
|
||||
tLE = 313,
|
||||
tEQ = 314,
|
||||
tNEQ = 315,
|
||||
tAND = 316,
|
||||
tOR = 317,
|
||||
tNOT = 318,
|
||||
tMOD = 319,
|
||||
tAFTER = 320,
|
||||
tBEFORE = 321,
|
||||
tCONCAT = 322,
|
||||
tCONTAINS = 323,
|
||||
tSTARTS = 324,
|
||||
tCHAR = 325,
|
||||
tITEM = 326,
|
||||
tLINE = 327,
|
||||
tWORD = 328,
|
||||
tSPRITE = 329,
|
||||
tINTERSECTS = 330,
|
||||
tWITHIN = 331,
|
||||
tTELL = 332,
|
||||
tPROPERTY = 333,
|
||||
tON = 334,
|
||||
tENDIF = 335,
|
||||
tENDREPEAT = 336,
|
||||
tENDTELL = 337
|
||||
};
|
||||
#endif
|
||||
|
||||
@ -159,7 +151,7 @@ union YYSTYPE
|
||||
int e;
|
||||
} objectfield;
|
||||
|
||||
#line 163 "engines/director/lingo/lingo-gr.h"
|
||||
#line 155 "engines/director/lingo/lingo-gr.h"
|
||||
|
||||
};
|
||||
typedef union YYSTYPE YYSTYPE;
|
||||
|
@ -103,8 +103,7 @@ void checkEnd(Common::String *token, const char *expect, bool required) {
|
||||
%token<i> INT ARGC ARGCNORET
|
||||
%token<e> THEENTITY THEENTITYWITHID
|
||||
%token<f> FLOAT
|
||||
%token<s> BLTIN BLTINNOARGS BLTINNOARGSORONE BLTINONEARG BLTINARGLIST
|
||||
%token<s> FBLTIN FBLTINNOARGS FBLTINONEARG FBLTINARGLIST RBLTIN RBLTINONEARG
|
||||
%token<s> BLTIN FBLTIN RBLTIN
|
||||
%token<s> ID STRING HANDLER SYMBOL
|
||||
%token<s> ENDCLAUSE tPLAYACCEL tMETHOD
|
||||
%token<objectfield> THEOBJECTFIELD
|
||||
@ -395,14 +394,9 @@ simpleexpr: INT {
|
||||
|
||||
expr: simpleexpr { $$ = $simpleexpr; }
|
||||
| reference
|
||||
| FBLTINNOARGS {
|
||||
g_lingo->codeFunc($FBLTINNOARGS, 0);
|
||||
delete $FBLTINNOARGS; }
|
||||
| FBLTINONEARG expr {
|
||||
g_lingo->codeFunc($FBLTINONEARG, 1);
|
||||
delete $FBLTINONEARG; }
|
||||
| FBLTINARGLIST arglist { g_lingo->codeFunc($FBLTINARGLIST, $arglist);
|
||||
delete $FBLTINARGLIST; }
|
||||
| FBLTIN arglist {
|
||||
g_lingo->codeFunc($FBLTIN, $arglist);
|
||||
delete $FBLTIN; }
|
||||
| ID '(' arglist ')' {
|
||||
$$ = g_lingo->codeFunc($ID, $arglist);
|
||||
delete $ID; }
|
||||
@ -459,9 +453,9 @@ expr: simpleexpr { $$ = $simpleexpr; }
|
||||
| tWORD expr tTO expr tOF expr { g_lingo->code1(LC::c_wordToOf); }
|
||||
;
|
||||
|
||||
reference: RBLTINONEARG simpleexpr {
|
||||
g_lingo->codeFunc($RBLTINONEARG, 1);
|
||||
delete $RBLTINONEARG; }
|
||||
reference: RBLTIN simpleexpr {
|
||||
g_lingo->codeFunc($RBLTIN, 1);
|
||||
delete $RBLTIN; }
|
||||
;
|
||||
|
||||
proc: tPUT expr { g_lingo->code1(LC::c_printtop); }
|
||||
@ -472,21 +466,9 @@ proc: tPUT expr { g_lingo->code1(LC::c_printtop); }
|
||||
| tGLOBAL globallist
|
||||
| tPROPERTY propertylist
|
||||
| tINSTANCE instancelist
|
||||
| BLTINNOARGS {
|
||||
g_lingo->codeFunc($BLTINNOARGS, 0);
|
||||
delete $BLTINNOARGS; }
|
||||
| BLTINONEARG expr {
|
||||
g_lingo->codeFunc($BLTINONEARG, 1);
|
||||
delete $BLTINONEARG; }
|
||||
| BLTINNOARGSORONE expr {
|
||||
g_lingo->codeFunc($BLTINNOARGSORONE, 1);
|
||||
delete $BLTINNOARGSORONE; }
|
||||
| BLTINNOARGSORONE {
|
||||
g_lingo->code1(LC::c_voidpush);
|
||||
g_lingo->codeFunc($BLTINNOARGSORONE, 1);
|
||||
delete $BLTINNOARGSORONE; }
|
||||
| BLTINARGLIST arglist { g_lingo->codeFunc($BLTINARGLIST, $arglist);
|
||||
delete $BLTINARGLIST; }
|
||||
| BLTIN arglist {
|
||||
g_lingo->codeFunc($BLTIN, $arglist);
|
||||
delete $BLTIN; }
|
||||
| tOPEN expr tWITH expr { g_lingo->code1(LC::c_open); }
|
||||
| tOPEN expr { g_lingo->code2(LC::c_voidpush, LC::c_open); }
|
||||
;
|
||||
|
@ -1372,7 +1372,7 @@ YY_RULE_SETUP
|
||||
|
||||
yylval.s = new Common::String("value");
|
||||
|
||||
return FBLTINONEARG;
|
||||
return FBLTIN;
|
||||
}
|
||||
YY_BREAK
|
||||
case 51:
|
||||
@ -1397,7 +1397,7 @@ YY_RULE_SETUP
|
||||
yylval.s = new Common::String(Common::String::format("numberOf%s", field.c_str()));
|
||||
|
||||
if (g_lingo->_builtins.contains(*yylval.s))
|
||||
return FBLTINONEARG;
|
||||
return FBLTIN;
|
||||
else
|
||||
error("LEXER: Unhandled chunk expression '%s'", yylval.s->c_str());
|
||||
}
|
||||
@ -1608,23 +1608,10 @@ YY_RULE_SETUP
|
||||
if (g_lingo->_builtins[yytext]->nargs != 1 || g_lingo->_builtins[yytext]->maxArgs != 1)
|
||||
error("Incorrectly set RBLTIN %s", yytext);
|
||||
|
||||
return RBLTINONEARG;
|
||||
}
|
||||
if (g_lingo->_builtins[yytext]->nargs == 0) {
|
||||
if (g_lingo->_builtins[yytext]->maxArgs == 0)
|
||||
return type == BLTIN ? BLTINNOARGS : FBLTINNOARGS;
|
||||
else if (g_lingo->_builtins[yytext]->maxArgs == 1)
|
||||
return BLTINNOARGSORONE;
|
||||
else
|
||||
return type == BLTIN ? BLTINARGLIST : FBLTINARGLIST;
|
||||
} else if (g_lingo->_builtins[yytext]->nargs == 1 &&
|
||||
g_lingo->_builtins[yytext]->maxArgs == 1) {
|
||||
return type == BLTIN ? BLTINONEARG : FBLTINONEARG;
|
||||
} else if (g_lingo->_builtins[yytext]->nargs == -1) {
|
||||
return type == BLTIN ? BLTINARGLIST : FBLTINARGLIST;
|
||||
} else {
|
||||
return type == BLTIN ? BLTINARGLIST : FBLTINARGLIST;
|
||||
return RBLTIN;
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1633,41 +1620,41 @@ YY_RULE_SETUP
|
||||
YY_BREAK
|
||||
case 69:
|
||||
YY_RULE_SETUP
|
||||
#line 367 "engines/director/lingo/lingo-lex.l"
|
||||
#line 354 "engines/director/lingo/lingo-lex.l"
|
||||
{ count(); yylval.f = atof(yytext); return FLOAT; }
|
||||
YY_BREAK
|
||||
case 70:
|
||||
YY_RULE_SETUP
|
||||
#line 368 "engines/director/lingo/lingo-lex.l"
|
||||
#line 355 "engines/director/lingo/lingo-lex.l"
|
||||
{ count(); yylval.i = strtol(yytext, NULL, 10); return INT; }
|
||||
YY_BREAK
|
||||
case 71:
|
||||
YY_RULE_SETUP
|
||||
#line 369 "engines/director/lingo/lingo-lex.l"
|
||||
#line 356 "engines/director/lingo/lingo-lex.l"
|
||||
{ count(); return *yytext; }
|
||||
YY_BREAK
|
||||
case 72:
|
||||
/* rule 72 can match eol */
|
||||
YY_RULE_SETUP
|
||||
#line 370 "engines/director/lingo/lingo-lex.l"
|
||||
#line 357 "engines/director/lingo/lingo-lex.l"
|
||||
{ count(); return '\n'; }
|
||||
YY_BREAK
|
||||
case 73:
|
||||
YY_RULE_SETUP
|
||||
#line 371 "engines/director/lingo/lingo-lex.l"
|
||||
#line 358 "engines/director/lingo/lingo-lex.l"
|
||||
{ count(); yylval.s = new Common::String(&yytext[1]); yylval.s->deleteLastChar(); return STRING; }
|
||||
YY_BREAK
|
||||
case 74:
|
||||
YY_RULE_SETUP
|
||||
#line 372 "engines/director/lingo/lingo-lex.l"
|
||||
#line 359 "engines/director/lingo/lingo-lex.l"
|
||||
{ count(); }
|
||||
YY_BREAK
|
||||
case 75:
|
||||
YY_RULE_SETUP
|
||||
#line 374 "engines/director/lingo/lingo-lex.l"
|
||||
#line 361 "engines/director/lingo/lingo-lex.l"
|
||||
ECHO;
|
||||
YY_BREAK
|
||||
#line 1671 "engines/director/lingo/lingo-lex.cpp"
|
||||
#line 1658 "engines/director/lingo/lingo-lex.cpp"
|
||||
case YY_STATE_EOF(INITIAL):
|
||||
yyterminate();
|
||||
|
||||
@ -2627,7 +2614,7 @@ void yyfree (void * ptr )
|
||||
|
||||
#define YYTABLES_NAME "yytables"
|
||||
|
||||
#line 374 "engines/director/lingo/lingo-lex.l"
|
||||
#line 361 "engines/director/lingo/lingo-lex.l"
|
||||
|
||||
|
||||
|
||||
|
@ -176,7 +176,7 @@ whitespace [\t ]
|
||||
|
||||
yylval.s = new Common::String("value");
|
||||
|
||||
return FBLTINONEARG;
|
||||
return FBLTIN;
|
||||
}
|
||||
(?i:the[ \t]+number[\t ]+of[\t ]+[[:alpha:]]+[\t ](in|of)) {
|
||||
count();
|
||||
@ -197,7 +197,7 @@ whitespace [\t ]
|
||||
yylval.s = new Common::String(Common::String::format("numberOf%s", field.c_str()));
|
||||
|
||||
if (g_lingo->_builtins.contains(*yylval.s))
|
||||
return FBLTINONEARG;
|
||||
return FBLTIN;
|
||||
else
|
||||
error("LEXER: Unhandled chunk expression '%s'", yylval.s->c_str());
|
||||
}
|
||||
@ -342,23 +342,10 @@ whitespace [\t ]
|
||||
if (g_lingo->_builtins[yytext]->nargs != 1 || g_lingo->_builtins[yytext]->maxArgs != 1)
|
||||
error("Incorrectly set RBLTIN %s", yytext);
|
||||
|
||||
return RBLTINONEARG;
|
||||
}
|
||||
if (g_lingo->_builtins[yytext]->nargs == 0) {
|
||||
if (g_lingo->_builtins[yytext]->maxArgs == 0)
|
||||
return type == BLTIN ? BLTINNOARGS : FBLTINNOARGS;
|
||||
else if (g_lingo->_builtins[yytext]->maxArgs == 1)
|
||||
return BLTINNOARGSORONE;
|
||||
else
|
||||
return type == BLTIN ? BLTINARGLIST : FBLTINARGLIST;
|
||||
} else if (g_lingo->_builtins[yytext]->nargs == 1 &&
|
||||
g_lingo->_builtins[yytext]->maxArgs == 1) {
|
||||
return type == BLTIN ? BLTINONEARG : FBLTINONEARG;
|
||||
} else if (g_lingo->_builtins[yytext]->nargs == -1) {
|
||||
return type == BLTIN ? BLTINARGLIST : FBLTINARGLIST;
|
||||
} else {
|
||||
return type == BLTIN ? BLTINARGLIST : FBLTINARGLIST;
|
||||
return RBLTIN;
|
||||
}
|
||||
|
||||
return type;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user