1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* 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
* 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
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* 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.
*
*/
%debug
%{
#define FORBIDDEN_SYMBOL_ALLOW_ALL
#include "common/hash-str.h"
#include "director/lingo/lingo.h"
#include "director/lingo/lingo-gr.h"
extern int yylex();
extern int yyparse();
void yyerror(char *s) { warning("%s", s); }
using namespace Director;
%}
%union {
Common::String *s;
int i;
float f;
int code;
}
%token UNARY UNDEF
%token<i> INT
%token<f> FLOAT
%token<s> VAR STRING
%token tFRAME tGO tINTO tLOOP tMCI tMCIWAIT tMOVIE tNEXT tOF tPREVIOUS tPUT tSET tTO
%type<code> assign expr
%type<s> gotoframe gotomovie
%right '='
%left '+' '-'
%left '*' '/' '%'
%right UNARY
%%
program: programline '\n' program
| programline
;
programline:
| func
| assign { g_lingo->code1(g_lingo->func_xpop); }
| statement
| expr { g_lingo->code1(g_lingo->func_printtop); }
| error { yyerrok; }
| /* empty */
;
assign: tPUT expr tINTO VAR { g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString($4->c_str()); g_lingo->code1(g_lingo->func_assign); $$ = $2; delete $4; }
| tSET VAR '=' expr { g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString($2->c_str()); g_lingo->code1(g_lingo->func_assign); $$ = $4; delete $2; }
| tSET VAR tTO expr { g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString($2->c_str()); g_lingo->code1(g_lingo->func_assign); $$ = $4; delete $2; }
;
statement: expr { g_lingo->code1(g_lingo->func_xpop); }
;
expr: INT { g_lingo->code1(g_lingo->func_constpush); inst i; WRITE_LE_UINT32(&i, $1); $$ = g_lingo->code1(i); };
| VAR { g_lingo->code1(g_lingo->func_varpush); g_lingo->codeString($1->c_str()); $$ = g_lingo->code1(g_lingo->func_eval); delete $1; }
| expr '+' expr { g_lingo->code1(g_lingo->func_add); }
| expr '-' expr { g_lingo->code1(g_lingo->func_sub); }
| expr '*' expr { g_lingo->code1(g_lingo->func_mul); }
| expr '/' expr { g_lingo->code1(g_lingo->func_div); }
| '+' expr %prec UNARY { $$ = $2; }
| '-' expr %prec UNARY { $$ = $2; g_lingo->code1(g_lingo->func_negate); }
| '(' expr ')' { $$ = $2; }
;
func: tMCI STRING { g_lingo->code1(g_lingo->func_mci); g_lingo->codeString($2->c_str()); delete $2; }
| tMCIWAIT VAR { g_lingo->code1(g_lingo->func_mciwait); g_lingo->codeString($2->c_str()); delete $2; }
| gotofunc
;
// go {to} {frame} whichFrame {of movie whichMovie}
// go {to} {frame "Open23" of} movie whichMovie
// go loop
// go next
// go previous
// go to {frame} whichFrame {of movie whichMovie}
// go to {frame whichFrame of} movie whichMovie
gotofunc: tGO tLOOP { g_lingo->code1(g_lingo->func_gotoloop); }
| tGO tNEXT { g_lingo->code1(g_lingo->func_gotonext); }
| tGO tPREVIOUS { g_lingo->code1(g_lingo->func_gotoprevious); }
| tGO gotoframe { g_lingo->code1(g_lingo->func_goto); g_lingo->codeString($2->c_str()); g_lingo->codeString(""); delete $2; }
| tGO gotoframe gotomovie { g_lingo->code1(g_lingo->func_goto); g_lingo->codeString($2->c_str()); g_lingo->codeString($3->c_str()); delete $2; delete $3; }
| tGO gotomovie { g_lingo->code1(g_lingo->func_goto); g_lingo->codeString(""); g_lingo->codeString($2->c_str()); delete $2; }
;
gotoframe: tTO tFRAME STRING { $$ = $3; }
| tFRAME STRING { $$ = $2; }
| tTO STRING { $$ = $2; }
| STRING { $$ = $1; }
;
gotomovie: tOF tMOVIE STRING { $$ = $3; }
| tMOVIE STRING { $$ = $2; }
| tTO tMOVIE STRING { $$ = $3; }
;
%%
|