DIRECTOR: LINGO: Simplified grammar

This commit is contained in:
Eugene Sandulenko 2020-01-14 18:19:55 +01:00
parent f9ea2ec28a
commit 06280dd403
5 changed files with 1080 additions and 1241 deletions

File diff suppressed because it is too large Load Diff

View File

@ -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;

View File

@ -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); }
;

View File

@ -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"

View File

@ -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;
}
}