DIRECTOR: LINGO: Switch to GLR parser. Improvements

This commit is contained in:
Eugene Sandulenko 2019-12-05 18:32:18 +01:00
parent 57f979c705
commit 89353fb427
3 changed files with 4617 additions and 3057 deletions

File diff suppressed because it is too large Load Diff

View File

@ -1,14 +1,13 @@
/* A Bison parser, made by GNU Bison 2.3. */
/* A Bison parser, made by GNU Bison 3.4.2. */
/* Skeleton interface for Bison's Yacc-like parsers in C
/* Skeleton interface for Bison GLR parsers in C
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
Copyright (C) 2002-2015, 2018-2019 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -16,9 +15,7 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA. */
along with this program. If not, see <http://www.gnu.org/licenses/>. */
/* As a special exception, you may create a larger work that contains
part or all of the Bison parser skeleton and distribute that work
@ -33,203 +30,120 @@
This special exception was added by the Free Software Foundation in
version 2.2 of Bison. */
/* Tokens. */
#ifndef YY_YY_ENGINES_DIRECTOR_LINGO_LINGO_GR_HPP_INCLUDED
# define YY_YY_ENGINES_DIRECTOR_LINGO_LINGO_GR_HPP_INCLUDED
/* Debug traces. */
#ifndef YYDEBUG
# define YYDEBUG 1
#endif
#if YYDEBUG
extern int yydebug;
#endif
/* Token type. */
#ifndef YYTOKENTYPE
# define YYTOKENTYPE
/* Put the tokens into the symbol table, so that GDB and other debuggers
know about them. */
enum yytokentype {
UNARY = 258,
CASTREF = 259,
VOID = 260,
VAR = 261,
POINT = 262,
RECT = 263,
ARRAY = 264,
OBJECT = 265,
REFERENCE = 266,
INT = 267,
ARGC = 268,
ARGCNORET = 269,
THEENTITY = 270,
THEENTITYWITHID = 271,
FLOAT = 272,
BLTIN = 273,
BLTINNOARGS = 274,
BLTINNOARGSORONE = 275,
BLTINONEARG = 276,
BLTINARGLIST = 277,
TWOWORDBUILTIN = 278,
FBLTIN = 279,
FBLTINNOARGS = 280,
FBLTINONEARG = 281,
FBLTINARGLIST = 282,
RBLTIN = 283,
RBLTINONEARG = 284,
ID = 285,
STRING = 286,
HANDLER = 287,
SYMBOL = 288,
ENDCLAUSE = 289,
tPLAYACCEL = 290,
tDOWN = 291,
tELSE = 292,
tNLELSIF = 293,
tEXIT = 294,
tFRAME = 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,
tTHENNL = 310,
tTO = 311,
tWHEN = 312,
tWITH = 313,
tWHILE = 314,
tNLELSE = 315,
tFACTORY = 316,
tMETHOD = 317,
tOPEN = 318,
tPLAY = 319,
tDONE = 320,
tINSTANCE = 321,
tGE = 322,
tLE = 323,
tGT = 324,
tLT = 325,
tEQ = 326,
tNEQ = 327,
tAND = 328,
tOR = 329,
tNOT = 330,
tMOD = 331,
tAFTER = 332,
tBEFORE = 333,
tCONCAT = 334,
tCONTAINS = 335,
tSTARTS = 336,
tCHAR = 337,
tITEM = 338,
tLINE = 339,
tWORD = 340,
tSPRITE = 341,
tINTERSECTS = 342,
tWITHIN = 343,
tTELL = 344,
tPROPERTY = 345,
tON = 346,
tME = 347
};
enum yytokentype
{
UNARY = 258,
CASTREF = 259,
VOID = 260,
VAR = 261,
POINT = 262,
RECT = 263,
ARRAY = 264,
OBJECT = 265,
REFERENCE = 266,
INT = 267,
ARGC = 268,
ARGCNORET = 269,
THEENTITY = 270,
THEENTITYWITHID = 271,
FLOAT = 272,
BLTIN = 273,
BLTINNOARGS = 274,
BLTINNOARGSORONE = 275,
BLTINONEARG = 276,
BLTINARGLIST = 277,
TWOWORDBUILTIN = 278,
FBLTIN = 279,
FBLTINNOARGS = 280,
FBLTINONEARG = 281,
FBLTINARGLIST = 282,
RBLTIN = 283,
RBLTINONEARG = 284,
ID = 285,
STRING = 286,
HANDLER = 287,
SYMBOL = 288,
ENDCLAUSE = 289,
tPLAYACCEL = 290,
tDOWN = 291,
tELSE = 292,
tNLELSIF = 293,
tEXIT = 294,
tFRAME = 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,
tTHENNL = 310,
tTO = 311,
tWHEN = 312,
tWITH = 313,
tWHILE = 314,
tNLELSE = 315,
tFACTORY = 316,
tMETHOD = 317,
tOPEN = 318,
tPLAY = 319,
tDONE = 320,
tINSTANCE = 321,
tGE = 322,
tLE = 323,
tGT = 324,
tLT = 325,
tEQ = 326,
tNEQ = 327,
tAND = 328,
tOR = 329,
tNOT = 330,
tMOD = 331,
tAFTER = 332,
tBEFORE = 333,
tCONCAT = 334,
tCONTAINS = 335,
tSTARTS = 336,
tCHAR = 337,
tITEM = 338,
tLINE = 339,
tWORD = 340,
tSPRITE = 341,
tINTERSECTS = 342,
tWITHIN = 343,
tTELL = 344,
tPROPERTY = 345,
tON = 346,
tME = 347
};
#endif
/* Tokens. */
#define UNARY 258
#define CASTREF 259
#define VOID 260
#define VAR 261
#define POINT 262
#define RECT 263
#define ARRAY 264
#define OBJECT 265
#define REFERENCE 266
#define INT 267
#define ARGC 268
#define ARGCNORET 269
#define THEENTITY 270
#define THEENTITYWITHID 271
#define FLOAT 272
#define BLTIN 273
#define BLTINNOARGS 274
#define BLTINNOARGSORONE 275
#define BLTINONEARG 276
#define BLTINARGLIST 277
#define TWOWORDBUILTIN 278
#define FBLTIN 279
#define FBLTINNOARGS 280
#define FBLTINONEARG 281
#define FBLTINARGLIST 282
#define RBLTIN 283
#define RBLTINONEARG 284
#define ID 285
#define STRING 286
#define HANDLER 287
#define SYMBOL 288
#define ENDCLAUSE 289
#define tPLAYACCEL 290
#define tDOWN 291
#define tELSE 292
#define tNLELSIF 293
#define tEXIT 294
#define tFRAME 295
#define tGLOBAL 296
#define tGO 297
#define tIF 298
#define tINTO 299
#define tLOOP 300
#define tMACRO 301
#define tMOVIE 302
#define tNEXT 303
#define tOF 304
#define tPREVIOUS 305
#define tPUT 306
#define tREPEAT 307
#define tSET 308
#define tTHEN 309
#define tTHENNL 310
#define tTO 311
#define tWHEN 312
#define tWITH 313
#define tWHILE 314
#define tNLELSE 315
#define tFACTORY 316
#define tMETHOD 317
#define tOPEN 318
#define tPLAY 319
#define tDONE 320
#define tINSTANCE 321
#define tGE 322
#define tLE 323
#define tGT 324
#define tLT 325
#define tEQ 326
#define tNEQ 327
#define tAND 328
#define tOR 329
#define tNOT 330
#define tMOD 331
#define tAFTER 332
#define tBEFORE 333
#define tCONCAT 334
#define tCONTAINS 335
#define tSTARTS 336
#define tCHAR 337
#define tITEM 338
#define tLINE 339
#define tWORD 340
#define tSPRITE 341
#define tINTERSECTS 342
#define tWITHIN 343
#define tTELL 344
#define tPROPERTY 345
#define tON 346
#define tME 347
/* Value type. */
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
typedef union YYSTYPE
#line 79 "engines/director/lingo/lingo-gr.y"
union YYSTYPE
{
#line 80 "engines/director/lingo/lingo-gr.y"
Common::String *s;
int i;
double f;
@ -237,14 +151,18 @@ typedef union YYSTYPE
int code;
int narg; /* number of arguments */
Common::Array<double> *arr;
}
/* Line 1529 of yacc.c. */
#line 243 "engines/director/lingo/lingo-gr.hpp"
YYSTYPE;
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
#line 156 "engines/director/lingo/lingo-gr.hpp"
};
typedef union YYSTYPE YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1
# define YYSTYPE_IS_DECLARED 1
#endif
extern YYSTYPE yylval;
int yyparse (void);
#endif /* !YY_YY_ENGINES_DIRECTOR_LINGO_LINGO_GR_HPP_INCLUDED */

View File

@ -45,6 +45,7 @@
%debug
%glr-parser
%{
#define FORBIDDEN_SYMBOL_ALLOW_ALL
@ -247,17 +248,7 @@ stmt: stmtoneliner
}
;
ifstmt: if expr tTHEN begin stmtoneliner end '\n' {
inst then = 0, else1 = 0, end = 0;
WRITE_UINT32(&then, $4 - $1);
WRITE_UINT32(&else1, 0);
WRITE_UINT32(&end, $6 - $1);
(*g_lingo->_currentScript)[$1 + 1] = then; /* thenpart */
(*g_lingo->_currentScript)[$1 + 2] = else1; /* elsepart */
(*g_lingo->_currentScript)[$1 + 3] = end; /* end, if cond fails */
g_lingo->processIf(0, 0); }
| if expr tTHEN begin stmtoneliner end elseifstmtlist end endifstmt end {
ifstmt: if expr tTHEN begin stmtoneliner end elseifstmtlist end endifstmt end {
inst then = 0, else1 = 0, end = 0;
WRITE_UINT32(&then, $4 - $1);
WRITE_UINT32(&else1, $6 - $1);
@ -267,14 +258,14 @@ ifstmt: if expr tTHEN begin stmtoneliner end '\n' {
(*g_lingo->_currentScript)[$1 + 3] = end; /* end, if cond fails */
g_lingo->processIf(0, $10 - $1); }
| if expr tTHENNL stmtlist end ENDCLAUSE {
inst then = 0, end = 0;
| if expr tTHEN begin stmtoneliner end {
inst then = 0, else1 = 0, end = 0;
WRITE_UINT32(&then, $4 - $1);
WRITE_UINT32(&end, $5 - $1);
WRITE_UINT32(&else1, 0);
WRITE_UINT32(&end, $6 - $1);
(*g_lingo->_currentScript)[$1 + 1] = then; /* thenpart */
(*g_lingo->_currentScript)[$1 + 3] = end; /* end, if cond fails */
checkEnd($6, "if", true);
(*g_lingo->_currentScript)[$1 + 2] = else1; /* elsepart */
(*g_lingo->_currentScript)[$1 + 3] = end; /* end, if cond fails */
g_lingo->processIf(0, 0); }
| if expr tTHENNL stmtlist end elseifstmtlist end endifstmt end {
@ -286,6 +277,16 @@ ifstmt: if expr tTHEN begin stmtoneliner end '\n' {
(*g_lingo->_currentScript)[$1 + 2] = else1; /* elsepart */
(*g_lingo->_currentScript)[$1 + 3] = end; /* end, if cond fails */
g_lingo->processIf(0, 0); }
| if expr tTHENNL stmtlist end ENDCLAUSE {
inst then = 0, end = 0;
WRITE_UINT32(&then, $4 - $1);
WRITE_UINT32(&end, $5 - $1);
(*g_lingo->_currentScript)[$1 + 1] = then; /* thenpart */
(*g_lingo->_currentScript)[$1 + 3] = end; /* end, if cond fails */
checkEnd($6, "if", true);
g_lingo->processIf(0, 0); }
;
@ -307,7 +308,8 @@ elseifstmt: elseif expr tTHEN begin stmtoneliner end {
g_lingo->codeLabel($1); }
;
endifstmt: elseif expr tTHEN begin stmtoneliner end tELSE stmtoneliner end {
endifstmt: ENDCLAUSE
| elseif expr tTHEN begin stmtoneliner end tELSE stmtoneliner end {
inst then = 0;
WRITE_UINT32(&then, $4 - $1);
(*g_lingo->_currentScript)[$1 + 1] = then; /* thenpart */
@ -401,7 +403,6 @@ expr: simpleexpr { $$ = $1; }
g_lingo->codeFunc($1, 1);
delete $1; }
| FBLTINARGLIST nonemptyarglist { g_lingo->codeFunc($1, $2); }
| FBLTINARGLIST '(' nonemptyarglist ')' { g_lingo->codeFunc($1, $3); }
| ID '(' arglist ')' {
$$ = g_lingo->codeFunc($1, $3);
delete $1; }
@ -482,7 +483,6 @@ proc: tPUT expr { g_lingo->code1(g_lingo->c_printtop); }
g_lingo->codeFunc($1, 1);
delete $1; }
| BLTINARGLIST nonemptyarglist { g_lingo->codeFunc($1, $2); }
| BLTINARGLIST '(' nonemptyarglist ')' { g_lingo->codeFunc($1, $3); }
| tME '(' ID ')' { g_lingo->codeMe($3, 0); }
| tME '(' ID ',' arglist ')' { g_lingo->codeMe($3, $5); }
| tOPEN expr tWITH expr { g_lingo->code1(g_lingo->c_open); }