parser.cxx

Sat, 25 Aug 2012 04:19:22 +0300

author
Teemu Piippo <crimsondusk64@gmail.com>
date
Sat, 25 Aug 2012 04:19:22 +0300
changeset 59
891b9e6ee139
parent 58
bc9317d1b9c9
child 61
11451e7a2fe6
permissions
-rw-r--r--

Added support for continue-statements

0
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1 /*
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
2 * botc source code
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
3 * Copyright (C) 2012 Santeri `Dusk` Piippo
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
4 * All rights reserved.
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
5 *
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
8 *
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright notice,
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
10 * this list of conditions and the following disclaimer.
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
12 * this list of conditions and the following disclaimer in the documentation
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
13 * and/or other materials provided with the distribution.
3
08cab2b67dce oh blerb.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 2
diff changeset
14 * 3. Neither the name of the developer nor the names of its contributors may
08cab2b67dce oh blerb.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 2
diff changeset
15 * be used to endorse or promote products derived from this software without
08cab2b67dce oh blerb.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 2
diff changeset
16 * specific prior written permission.
0
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
17 * 4. Redistributions in any form must be accompanied by information on how to
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
18 * obtain complete source code for the software and any accompanying
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
19 * software that uses the software. The source code must either be included
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
20 * in the distribution or be available for no more than the cost of
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
21 * distribution plus a nominal fee, and must be freely redistributable
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
22 * under reasonable conditions. For an executable file, complete source
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
23 * code means the source code for all modules it contains. It does not
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
24 * include source code for modules or files that typically accompany the
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
25 * major components of the operating system on which the executable file
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
26 * runs.
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
27 *
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
29 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
30 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
31 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
32 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
33 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
34 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
35 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
36 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
37 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
38 * POSSIBILITY OF SUCH DAMAGE.
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
39 */
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
40
1
f0c61c204bc8 Added support for #include directives, added basic header and statistics printing.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 0
diff changeset
41 #define __PARSER_CXX__
f0c61c204bc8 Added support for #include directives, added basic header and statistics printing.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 0
diff changeset
42
0
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
43 #include <stdio.h>
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
44 #include <stdlib.h>
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
45 #include "common.h"
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
46 #include "str.h"
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
47 #include "objwriter.h"
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
48 #include "scriptreader.h"
2
bb2c45522eb6 Added event definitions
Teemu Piippo <crimsondusk64@gmail.com>
parents: 1
diff changeset
49 #include "events.h"
8
c8bfa7e6ae1b Commands are now read properly.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 7
diff changeset
50 #include "commands.h"
20
d7b13805d1e0 Added string table and support for string parameters in commands.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 19
diff changeset
51 #include "stringtable.h"
22
b48e10ca8832 Added rudimentary global var support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 21
diff changeset
52 #include "variables.h"
0
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
53
1
f0c61c204bc8 Added support for #include directives, added basic header and statistics printing.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 0
diff changeset
54 #define MUST_TOPLEVEL if (g_CurMode != MODE_TOPLEVEL) \
37
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
55 ParserError ("%s-statements may only be defined at top level!", token.chars());
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
56
41
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
57 #define MUST_NOT_TOPLEVEL if (g_CurMode == MODE_TOPLEVEL) \
37
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
58 ParserError ("%s-statements may not be defined at top level!", token.chars());
0
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
59
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
60 #define SCOPE(n) scopestack[g_ScopeCursor - n]
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
61
1
f0c61c204bc8 Added support for #include directives, added basic header and statistics printing.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 0
diff changeset
62 int g_NumStates = 0;
f0c61c204bc8 Added support for #include directives, added basic header and statistics printing.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 0
diff changeset
63 int g_NumEvents = 0;
f0c61c204bc8 Added support for #include directives, added basic header and statistics printing.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 0
diff changeset
64 int g_CurMode = MODE_TOPLEVEL;
f0c61c204bc8 Added support for #include directives, added basic header and statistics printing.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 0
diff changeset
65 str g_CurState = "";
16
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
66 bool g_stateSpawnDefined = false;
26
54eaea6dc27c Mainloop and onenter definitions are now written into separate buffers first and only written to file after state ends. Why? Zandronum seems to demand that mainloop definitions MUST be written right after any onenter one. This way, mainloop and onenter definitions can be written without this restriction in the script. Also now I have a cool uchar-buffer class :)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 25
diff changeset
67 bool g_GotMainLoop = false;
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
68 unsigned int g_ScopeCursor = 0;
40
9e4f785501db Committed the other changes done during a failed attempt of else
Teemu Piippo <crimsondusk64@gmail.com>
parents: 39
diff changeset
69 DataBuffer* g_IfExpression = NULL;
57
96f60ca748a0 Fixed: else was alloed even without if strictly preceding it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 56
diff changeset
70 bool g_CanElse = false;
1
f0c61c204bc8 Added support for #include directives, added basic header and statistics printing.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 0
diff changeset
71
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
72 // ============================================================================
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
73 // Main parser code. Begins read of the script file, checks the syntax of it
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
74 // and writes the data to the object file via ObjWriter - which also takes care
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
75 // of necessary buffering so stuff is written in the correct order.
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
76 void ScriptReader::ParseBotScript (ObjWriter* w) {
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
77 // Zero the entire block stack first
59
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
78 for (int i = 0; i < MAX_SCOPE; i++)
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
79 ZERO(scopestack[i]);
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
80
0
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
81 while (Next()) {
57
96f60ca748a0 Fixed: else was alloed even without if strictly preceding it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 56
diff changeset
82 // Check if else is potentically valid
96f60ca748a0 Fixed: else was alloed even without if strictly preceding it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 56
diff changeset
83 if (!token.compare ("else") && !g_CanElse)
96f60ca748a0 Fixed: else was alloed even without if strictly preceding it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 56
diff changeset
84 ParserError ("else without preceding if");
96f60ca748a0 Fixed: else was alloed even without if strictly preceding it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 56
diff changeset
85 if (token.compare ("else") != 0)
96f60ca748a0 Fixed: else was alloed even without if strictly preceding it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 56
diff changeset
86 g_CanElse = false;
96f60ca748a0 Fixed: else was alloed even without if strictly preceding it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 56
diff changeset
87
43
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
88 // ============================================================
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
89 if (!token.compare ("state")) {
0
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
90 MUST_TOPLEVEL
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
91
12
1bdbfcca2fc6 MustString now behaves more like its siblings - sets token to result rather than returning it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 9
diff changeset
92 MustString ();
0
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
93
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
94 // State name must be a word.
12
1bdbfcca2fc6 MustString now behaves more like its siblings - sets token to result rather than returning it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 9
diff changeset
95 if (token.first (" ") != token.len())
1bdbfcca2fc6 MustString now behaves more like its siblings - sets token to result rather than returning it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 9
diff changeset
96 ParserError ("state name must be a single word! got `%s`", token.chars());
16
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
97 str statename = token;
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
98
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
99 // stateSpawn is special - it *must* be defined. If we
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
100 // encountered it, then mark down that we have it.
33
fd35f6cb5f28 Added a preprocessor with proper #include support. Macro support via #define is planned too. God, was it a B-I-T-C-H to get working right, though..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 31
diff changeset
101 if (!token.icompare ("statespawn"))
16
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
102 g_stateSpawnDefined = true;
0
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
103
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
104 // Must end in a colon
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
105 MustNext (":");
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
106
26
54eaea6dc27c Mainloop and onenter definitions are now written into separate buffers first and only written to file after state ends. Why? Zandronum seems to demand that mainloop definitions MUST be written right after any onenter one. This way, mainloop and onenter definitions can be written without this restriction in the script. Also now I have a cool uchar-buffer class :)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 25
diff changeset
107 // Write the previous state's onenter and
54eaea6dc27c Mainloop and onenter definitions are now written into separate buffers first and only written to file after state ends. Why? Zandronum seems to demand that mainloop definitions MUST be written right after any onenter one. This way, mainloop and onenter definitions can be written without this restriction in the script. Also now I have a cool uchar-buffer class :)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 25
diff changeset
108 // mainloop buffers to file now
54eaea6dc27c Mainloop and onenter definitions are now written into separate buffers first and only written to file after state ends. Why? Zandronum seems to demand that mainloop definitions MUST be written right after any onenter one. This way, mainloop and onenter definitions can be written without this restriction in the script. Also now I have a cool uchar-buffer class :)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 25
diff changeset
109 if (g_CurState.len())
54eaea6dc27c Mainloop and onenter definitions are now written into separate buffers first and only written to file after state ends. Why? Zandronum seems to demand that mainloop definitions MUST be written right after any onenter one. This way, mainloop and onenter definitions can be written without this restriction in the script. Also now I have a cool uchar-buffer class :)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 25
diff changeset
110 w->WriteBuffers();
16
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
111
1
f0c61c204bc8 Added support for #include directives, added basic header and statistics printing.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 0
diff changeset
112 w->Write (DH_STATENAME);
16
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
113 w->WriteString (statename);
1
f0c61c204bc8 Added support for #include directives, added basic header and statistics printing.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 0
diff changeset
114 w->Write (DH_STATEIDX);
f0c61c204bc8 Added support for #include directives, added basic header and statistics printing.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 0
diff changeset
115 w->Write (g_NumStates);
f0c61c204bc8 Added support for #include directives, added basic header and statistics printing.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 0
diff changeset
116
f0c61c204bc8 Added support for #include directives, added basic header and statistics printing.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 0
diff changeset
117 g_NumStates++;
12
1bdbfcca2fc6 MustString now behaves more like its siblings - sets token to result rather than returning it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 9
diff changeset
118 g_CurState = token;
26
54eaea6dc27c Mainloop and onenter definitions are now written into separate buffers first and only written to file after state ends. Why? Zandronum seems to demand that mainloop definitions MUST be written right after any onenter one. This way, mainloop and onenter definitions can be written without this restriction in the script. Also now I have a cool uchar-buffer class :)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 25
diff changeset
119 g_GotMainLoop = false;
24
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
120 continue;
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
121 }
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
122
43
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
123 // ============================================================
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
124 if (!token.compare ("event")) {
0
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
125 MUST_TOPLEVEL
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
126
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
127 // Event definition
12
1bdbfcca2fc6 MustString now behaves more like its siblings - sets token to result rather than returning it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 9
diff changeset
128 MustString ();
0
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
129
12
1bdbfcca2fc6 MustString now behaves more like its siblings - sets token to result rather than returning it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 9
diff changeset
130 EventDef* e = FindEventByName (token);
2
bb2c45522eb6 Added event definitions
Teemu Piippo <crimsondusk64@gmail.com>
parents: 1
diff changeset
131 if (!e)
12
1bdbfcca2fc6 MustString now behaves more like its siblings - sets token to result rather than returning it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 9
diff changeset
132 ParserError ("bad event! got `%s`\n", token.chars());
0
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
133
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
134 MustNext ("{");
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
135
1
f0c61c204bc8 Added support for #include directives, added basic header and statistics printing.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 0
diff changeset
136 g_CurMode = MODE_EVENT;
0
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
137
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
138 w->Write (DH_EVENT);
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
139 w->Write<word> (e->number);
1
f0c61c204bc8 Added support for #include directives, added basic header and statistics printing.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 0
diff changeset
140 g_NumEvents++;
24
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
141 continue;
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
142 }
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
143
43
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
144 // ============================================================
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
145 if (!token.compare ("mainloop")) {
16
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
146 MUST_TOPLEVEL
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
147 MustNext ("{");
26
54eaea6dc27c Mainloop and onenter definitions are now written into separate buffers first and only written to file after state ends. Why? Zandronum seems to demand that mainloop definitions MUST be written right after any onenter one. This way, mainloop and onenter definitions can be written without this restriction in the script. Also now I have a cool uchar-buffer class :)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 25
diff changeset
148
54eaea6dc27c Mainloop and onenter definitions are now written into separate buffers first and only written to file after state ends. Why? Zandronum seems to demand that mainloop definitions MUST be written right after any onenter one. This way, mainloop and onenter definitions can be written without this restriction in the script. Also now I have a cool uchar-buffer class :)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 25
diff changeset
149 // Mode must be set before dataheader is written here!
16
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
150 g_CurMode = MODE_MAINLOOP;
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
151 w->Write (DH_MAINLOOP);
24
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
152 continue;
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
153 }
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
154
43
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
155 // ============================================================
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
156 if (!token.compare ("onenter") || !token.compare ("onexit")) {
16
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
157 MUST_TOPLEVEL
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
158 bool onenter = !token.compare ("onenter");
26
54eaea6dc27c Mainloop and onenter definitions are now written into separate buffers first and only written to file after state ends. Why? Zandronum seems to demand that mainloop definitions MUST be written right after any onenter one. This way, mainloop and onenter definitions can be written without this restriction in the script. Also now I have a cool uchar-buffer class :)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 25
diff changeset
159 MustNext ("{");
16
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
160
26
54eaea6dc27c Mainloop and onenter definitions are now written into separate buffers first and only written to file after state ends. Why? Zandronum seems to demand that mainloop definitions MUST be written right after any onenter one. This way, mainloop and onenter definitions can be written without this restriction in the script. Also now I have a cool uchar-buffer class :)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 25
diff changeset
161 // Mode must be set before dataheader is written here,
54eaea6dc27c Mainloop and onenter definitions are now written into separate buffers first and only written to file after state ends. Why? Zandronum seems to demand that mainloop definitions MUST be written right after any onenter one. This way, mainloop and onenter definitions can be written without this restriction in the script. Also now I have a cool uchar-buffer class :)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 25
diff changeset
162 // because onenter goes to a separate buffer.
16
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
163 g_CurMode = onenter ? MODE_ONENTER : MODE_ONEXIT;
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
164 w->Write (onenter ? DH_ONENTER : DH_ONEXIT);
24
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
165 continue;
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
166 }
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
167
43
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
168 // ============================================================
24
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
169 if (!token.compare ("var")) {
22
b48e10ca8832 Added rudimentary global var support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 21
diff changeset
170 // For now, only globals are supported
b48e10ca8832 Added rudimentary global var support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 21
diff changeset
171 if (g_CurMode != MODE_TOPLEVEL || g_CurState.len())
b48e10ca8832 Added rudimentary global var support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 21
diff changeset
172 ParserError ("variables must only be global for now");
b48e10ca8832 Added rudimentary global var support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 21
diff changeset
173
24
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
174 MustNext ();
22
b48e10ca8832 Added rudimentary global var support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 21
diff changeset
175
24
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
176 // Var name must not be a number
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
177 if (token.isnumber())
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
178 ParserError ("variable name must not be a number");
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
179
22
b48e10ca8832 Added rudimentary global var support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 21
diff changeset
180 str varname = token;
24
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
181 ScriptVar* var = DeclareGlobalVariable (this, varname);
22
b48e10ca8832 Added rudimentary global var support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 21
diff changeset
182
b48e10ca8832 Added rudimentary global var support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 21
diff changeset
183 if (!var)
b48e10ca8832 Added rudimentary global var support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 21
diff changeset
184 ParserError ("declaring %s variable %s failed",
b48e10ca8832 Added rudimentary global var support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 21
diff changeset
185 g_CurState.len() ? "state" : "global", varname.chars());
b48e10ca8832 Added rudimentary global var support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 21
diff changeset
186
b48e10ca8832 Added rudimentary global var support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 21
diff changeset
187 MustNext (";");
24
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
188 continue;
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
189 }
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
190
43
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
191 // ============================================================
37
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
192 // Goto
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
193 if (!token.compare ("goto")) {
41
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
194 MUST_NOT_TOPLEVEL
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
195
37
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
196 // Get the name of the label
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
197 MustNext ();
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
198
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
199 // Find the mark this goto statement points to
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
200 // TODO: This should define the mark instead of bombing
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
201 // out if the mark isn't found!
45
e1d3b7ea975c Removed mark types as they served absolutely zero purpose
Teemu Piippo <crimsondusk64@gmail.com>
parents: 44
diff changeset
202 unsigned int m = w->FindMark (token);
37
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
203 if (m == MAX_MARKS)
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
204 ParserError ("unknown label `%s`!", token.chars());
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
205
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
206 // Add a reference to the mark.
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
207 w->Write<word> (DH_GOTO);
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
208 w->AddReference (m);
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
209 MustNext (";");
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
210 continue;
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
211 }
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
212
43
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
213 // ============================================================
38
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
214 // If
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
215 if (!token.compare ("if")) {
41
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
216 MUST_NOT_TOPLEVEL
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
217 PushScope ();
41
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
218
38
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
219 // Condition
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
220 MustNext ("(");
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
221
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
222 // Read the expression and write it.
38
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
223 MustNext ();
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
224 DataBuffer* c = ParseExpression (TYPE_INT);
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
225 w->WriteBuffer (c);
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
226
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
227 MustNext (")");
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
228 MustNext ("{");
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
229
41
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
230 // Add a mark - to here temporarily - and add a reference to it.
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
231 // Upon a closing brace, the mark will be adjusted.
45
e1d3b7ea975c Removed mark types as they served absolutely zero purpose
Teemu Piippo <crimsondusk64@gmail.com>
parents: 44
diff changeset
232 unsigned int marknum = w->AddMark ("");
41
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
233
38
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
234 // Use DH_IFNOTGOTO - if the expression is not true, we goto the mark
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
235 // we just defined - and this mark will be at the end of the scope block.
41
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
236 w->Write<word> (DH_IFNOTGOTO);
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
237 w->AddReference (marknum);
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
238
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
239 // Store it
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
240 SCOPE(0).mark1 = marknum;
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
241 SCOPE(0).type = SCOPETYPE_IF;
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
242 continue;
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
243 }
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
244
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
245 if (!token.compare ("else")) {
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
246 MUST_NOT_TOPLEVEL
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
247 MustNext ("{");
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
248
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
249 // Don't use PushScope that will reset the scope.
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
250 g_ScopeCursor++;
59
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
251 if (g_ScopeCursor >= MAX_SCOPE)
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
252 ParserError ("too deep scope");
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
253
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
254 if (SCOPE(0).type != SCOPETYPE_IF)
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
255 ParserError ("else without preceding if");
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
256
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
257 // Write down to jump to the end of the else statement
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
258 // Otherwise we have fall-throughs
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
259 SCOPE(0).mark2 = w->AddMark ("");
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
260
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
261 // Instruction to jump to the end after if block is complete
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
262 w->Write (DH_GOTO);
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
263 w->AddReference (SCOPE(0).mark2);
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
264
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
265 // Move the ifnot mark here and set type to else
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
266 w->MoveMark (SCOPE(0).mark1);
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
267 SCOPE(0).type = SCOPETYPE_ELSE;
41
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
268 continue;
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
269 }
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
270
43
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
271 // ============================================================
41
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
272 // While
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
273 if (!token.compare ("while")) {
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
274 MUST_NOT_TOPLEVEL
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
275 PushScope ();
41
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
276
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
277 // While loops need two marks - one at the start of the loop and one at the
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
278 // end. The condition is checked at the very start of the loop, if it fails,
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
279 // we use goto to skip to the end of the loop. At the end, we loop back to
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
280 // the beginning with a go-to statement.
45
e1d3b7ea975c Removed mark types as they served absolutely zero purpose
Teemu Piippo <crimsondusk64@gmail.com>
parents: 44
diff changeset
281 unsigned int mark1 = w->AddMark (""); // start
e1d3b7ea975c Removed mark types as they served absolutely zero purpose
Teemu Piippo <crimsondusk64@gmail.com>
parents: 44
diff changeset
282 unsigned int mark2 = w->AddMark (""); // end
41
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
283
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
284 // Condition
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
285 MustNext ("(");
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
286 MustNext ();
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
287 DataBuffer* expr = ParseExpression (TYPE_INT);
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
288 MustNext (")");
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
289 MustNext ("{");
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
290
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
291 // Write condition
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
292 w->WriteBuffer (expr);
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
293
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
294 // Instruction to go to the end if it fails
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
295 w->Write<word> (DH_IFNOTGOTO);
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
296 w->AddReference (mark2);
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
297
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
298 // Store the needed stuff
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
299 SCOPE(0).mark1 = mark1;
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
300 SCOPE(0).mark2 = mark2;
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
301 SCOPE(0).type = SCOPETYPE_WHILE;
38
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
302 continue;
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
303 }
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
304
43
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
305 // ============================================================
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
306 // For loop
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
307 if (!token.compare ("for")) {
43
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
308 MUST_NOT_TOPLEVEL
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
309 PushScope ();
43
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
310
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
311 // Initializer
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
312 MustNext ("(");
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
313 MustNext ();
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
314 DataBuffer* init = ParseStatement (w);
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
315 MustNext (";");
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
316
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
317 // Condition
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
318 MustNext ();
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
319 DataBuffer* cond = ParseExpression (TYPE_INT);
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
320 MustNext (";");
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
321
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
322 // Incrementor
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
323 MustNext ();
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
324 DataBuffer* incr = ParseStatement (w);
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
325 MustNext (")");
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
326 MustNext ("{");
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
327
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
328 // First, write out the initializer
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
329 w->WriteBuffer (init);
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
330
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
331 // Init two marks
45
e1d3b7ea975c Removed mark types as they served absolutely zero purpose
Teemu Piippo <crimsondusk64@gmail.com>
parents: 44
diff changeset
332 int mark1 = w->AddMark ("");
e1d3b7ea975c Removed mark types as they served absolutely zero purpose
Teemu Piippo <crimsondusk64@gmail.com>
parents: 44
diff changeset
333 int mark2 = w->AddMark ("");
43
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
334
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
335 // Add the condition
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
336 w->WriteBuffer (cond);
47
d84d82213137 some cleanup
Teemu Piippo <crimsondusk64@gmail.com>
parents: 46
diff changeset
337 w->Write<word> (DH_IFNOTGOTO);
43
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
338 w->AddReference (mark2);
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
339
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
340 // Store the marks and incrementor
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
341 SCOPE(0).mark1 = mark1;
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
342 SCOPE(0).mark2 = mark2;
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
343 SCOPE(0).buffer1 = incr;
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
344 SCOPE(0).type = SCOPETYPE_FOR;
43
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
345 continue;
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
346 }
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
347
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
348 // ============================================================
44
6bbaebc472b5 Added do-while loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 43
diff changeset
349 // Do/while loop
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
350 if (!token.compare ("do")) {
44
6bbaebc472b5 Added do-while loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 43
diff changeset
351 MUST_NOT_TOPLEVEL
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
352 PushScope ();
44
6bbaebc472b5 Added do-while loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 43
diff changeset
353 MustNext ("{");
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
354 SCOPE(0).mark1 = w->AddMark ("");
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
355 SCOPE(0).type = SCOPETYPE_DO;
44
6bbaebc472b5 Added do-while loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 43
diff changeset
356 continue;
6bbaebc472b5 Added do-while loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 43
diff changeset
357 }
6bbaebc472b5 Added do-while loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 43
diff changeset
358
6bbaebc472b5 Added do-while loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 43
diff changeset
359 // ============================================================
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
360 // Switch
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
361 if (!token.compare ("switch")) {
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
362 /* This goes a bit tricky. switch is structured in the
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
363 * bytecode followingly:
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
364 * (expression)
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
365 * case a: goto casemark1
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
366 * case b: goto casemark2
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
367 * case c: goto casemark3
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
368 * goto mark1 // jump to end if no matches
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
369 * casemark1: ...
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
370 * casemark2: ...
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
371 * casemark3: ...
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
372 * mark1: // end mark
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
373 */
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
374
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
375 MUST_NOT_TOPLEVEL
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
376 PushScope ();
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
377 MustNext ("(");
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
378 MustNext ();
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
379 w->WriteBuffer (ParseExpression (TYPE_INT));
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
380 MustNext (")");
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
381 MustNext ("{");
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
382 SCOPE(0).type = SCOPETYPE_SWITCH;
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
383 SCOPE(0).mark1 = w->AddMark (""); // end mark
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
384 SCOPE(0).buffer1 = NULL; // default header
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
385 continue;
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
386 }
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
387
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
388 // ============================================================
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
389 if (!token.compare ("case")) {
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
390 // case is only allowed inside switch
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
391 if (SCOPE(0).type != SCOPETYPE_SWITCH)
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
392 ParserError ("case label outside switch");
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
393
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
394 // Get the literal (Zandronum does not support expressions here)
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
395 MustNumber ();
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
396 int num = atoi (token.chars ());
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
397 MustNext (":");
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
398
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
399 for (int i = 0; i < MAX_CASE; i++)
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
400 if (SCOPE(0).casenumbers[i] == num)
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
401 ParserError ("multiple case %d labels in one switch", num);
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
402
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
403 // Write down the expression and case-go-to. This builds
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
404 // the case tree. The closing event will write the actual
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
405 // blocks and move the marks appropriately.
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
406 // AddSwitchCase will add the reference to the mark
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
407 // for the case block that this heralds, and takes care
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
408 // of buffering setup and stuff like that.
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
409 // NULL the switch buffer for the case-go-to statement,
49
8e2f7a031410 rename ObjWriter::RecordBuffer to SwitchBuffer, as it is designed specifically for switch and will break if used genericly
Teemu Piippo <crimsondusk64@gmail.com>
parents: 48
diff changeset
410 // we want it all under the switch, not into the case-buffers.
8e2f7a031410 rename ObjWriter::RecordBuffer to SwitchBuffer, as it is designed specifically for switch and will break if used genericly
Teemu Piippo <crimsondusk64@gmail.com>
parents: 48
diff changeset
411 w->SwitchBuffer = NULL;
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
412 w->Write<word> (DH_CASEGOTO);
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
413 w->Write<word> (num);
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
414 AddSwitchCase (w, NULL);
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
415 SCOPE(0).casenumbers[SCOPE(0).casecursor] = num;
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
416 continue;
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
417 }
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
418
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
419 if (!token.compare ("default")) {
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
420 if (SCOPE(0).type != SCOPETYPE_SWITCH)
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
421 ParserError ("default label outside switch");
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
422
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
423 if (SCOPE(0).buffer1)
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
424 ParserError ("multiple default labels in one switch");
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
425
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
426 MustNext (":");
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
427
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
428 // The default header is buffered into buffer1, since
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
429 // it has to be the last of the case headers
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
430 //
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
431 // Since the expression is pushed into the switch
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
432 // and is only popped when case succeeds, we have
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
433 // to pop it with DH_DROP manually if we end up in
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
434 // a default.
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
435 DataBuffer* b = new DataBuffer;
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
436 SCOPE(0).buffer1 = b;
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
437 b->Write<word> (DH_DROP);
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
438 b->Write<word> (DH_GOTO);
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
439 AddSwitchCase (w, b);
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
440 continue;
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
441 }
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
442
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
443 // ============================================================
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
444 // Break statement.
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
445 if (!token.compare ("break")) {
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
446 if (!g_ScopeCursor)
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
447 ParserError ("unexpected `break`");
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
448
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
449 w->Write<word> (DH_GOTO);
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
450
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
451 // switch and if use mark1 for the closing point,
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
452 // for and while use mark2.
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
453 switch (SCOPE(0).type) {
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
454 case SCOPETYPE_IF:
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
455 case SCOPETYPE_SWITCH:
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
456 w->AddReference (SCOPE(0).mark1);
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
457 break;
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
458 case SCOPETYPE_FOR:
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
459 case SCOPETYPE_WHILE:
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
460 w->AddReference (SCOPE(0).mark2);
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
461 break;
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
462 default:
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
463 ParserError ("unexpected `break`");
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
464 break;
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
465 }
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
466
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
467 MustNext (";");
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
468 continue;
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
469 }
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
470
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
471 // ============================================================
59
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
472 // Continue
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
473 if (!token.compare ("continue")) {
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
474 MustNext (";");
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
475
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
476 int curs;
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
477 bool found = false;
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
478
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
479 // Drop through the scope until we find a loop block
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
480 for (curs = g_ScopeCursor; curs > 0 && !found; curs--) {
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
481 switch (scopestack[curs].type) {
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
482 case SCOPETYPE_FOR:
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
483 case SCOPETYPE_WHILE:
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
484 case SCOPETYPE_DO:
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
485 w->Write<word> (DH_GOTO);
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
486 w->AddReference (scopestack[curs].mark1);
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
487 found = true;
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
488 break;
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
489 }
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
490 }
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
491
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
492 // No loop blocks
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
493 if (!found)
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
494 ParserError ("`continue`-statement not inside a loop");
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
495
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
496 continue;
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
497 }
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
498
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
499 // ============================================================
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
500 // Label
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
501 if (!PeekNext().compare (":")) {
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
502 MUST_NOT_TOPLEVEL
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
503
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
504 if (IsKeyword (token))
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
505 ParserError ("label name `%s` conflicts with keyword\n", token.chars());
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
506 if (FindCommand (token))
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
507 ParserError ("label name `%s` conflicts with command name\n", token.chars());
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
508 if (FindGlobalVariable (token))
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
509 ParserError ("label name `%s` conflicts with variable\n", token.chars());
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
510
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
511 w->AddMark (token);
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
512 MustNext (":");
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
513 continue;
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
514 }
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
515
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
516 // ============================================================
24
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
517 if (!token.compare ("}")) {
38
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
518 // Closing brace
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
519
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
520 // If we're in the block stack, we're descending down from it now
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
521 if (g_ScopeCursor > 0) {
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
522 switch (SCOPE(0).type) {
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
523 case SCOPETYPE_IF:
41
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
524 // Adjust the closing mark.
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
525 w->MoveMark (SCOPE(0).mark1);
57
96f60ca748a0 Fixed: else was alloed even without if strictly preceding it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 56
diff changeset
526
96f60ca748a0 Fixed: else was alloed even without if strictly preceding it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 56
diff changeset
527 // We're returning from if, thus else can be next
96f60ca748a0 Fixed: else was alloed even without if strictly preceding it
Teemu Piippo <crimsondusk64@gmail.com>
parents: 56
diff changeset
528 g_CanElse = true;
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
529 break;
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
530 case SCOPETYPE_ELSE:
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
531 // else instead uses mark1 for itself (so if expression
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
532 // fails, jump to else), mark2 means end of else
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
533 w->MoveMark (SCOPE(0).mark2);
41
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
534 break;
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
535 case SCOPETYPE_FOR:
43
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
536 // Write the incrementor at the end of the loop block
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
537 w->WriteBuffer (SCOPE(0).buffer1);
43
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
538 // fall-thru
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
539 case SCOPETYPE_WHILE:
41
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
540 // Write down the instruction to go back to the start of the loop
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
541 w->Write (DH_GOTO);
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
542 w->AddReference (SCOPE(0).mark1);
41
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
543
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
544 // Move the closing mark here since we're at the end of the while loop
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
545 w->MoveMark (SCOPE(0).mark2);
44
6bbaebc472b5 Added do-while loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 43
diff changeset
546 break;
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
547 case SCOPETYPE_DO: {
44
6bbaebc472b5 Added do-while loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 43
diff changeset
548 MustNext ("while");
6bbaebc472b5 Added do-while loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 43
diff changeset
549 MustNext ("(");
6bbaebc472b5 Added do-while loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 43
diff changeset
550 MustNext ();
6bbaebc472b5 Added do-while loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 43
diff changeset
551 DataBuffer* expr = ParseExpression (TYPE_INT);
6bbaebc472b5 Added do-while loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 43
diff changeset
552 MustNext (")");
6bbaebc472b5 Added do-while loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 43
diff changeset
553 MustNext (";");
6bbaebc472b5 Added do-while loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 43
diff changeset
554
6bbaebc472b5 Added do-while loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 43
diff changeset
555 // If the condition runs true, go back to the start.
6bbaebc472b5 Added do-while loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 43
diff changeset
556 w->WriteBuffer (expr);
6bbaebc472b5 Added do-while loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 43
diff changeset
557 w->Write<long> (DH_IFGOTO);
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
558 w->AddReference (SCOPE(0).mark1);
44
6bbaebc472b5 Added do-while loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 43
diff changeset
559 break;
41
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
560 }
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
561 case SCOPETYPE_SWITCH: {
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
562 // Switch closes. Move down to the record buffer of
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
563 // the lower block.
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
564 if (SCOPE(1).casecursor != -1)
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
565 w->SwitchBuffer = SCOPE(1).casebuffers[SCOPE(1).casecursor];
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
566 else
49
8e2f7a031410 rename ObjWriter::RecordBuffer to SwitchBuffer, as it is designed specifically for switch and will break if used genericly
Teemu Piippo <crimsondusk64@gmail.com>
parents: 48
diff changeset
567 w->SwitchBuffer = NULL;
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
568
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
569 // If there was a default in the switch, write its header down now.
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
570 // If not, write instruction to jump to the end of switch after
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
571 // the headers (thus won't fall-through if no case matched)
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
572 if (SCOPE(0).buffer1)
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
573 w->WriteBuffer (SCOPE(0).buffer1);
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
574 else {
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
575 w->Write<word> (DH_DROP);
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
576 w->Write<word> (DH_GOTO);
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
577 w->AddReference (SCOPE(0).mark1);
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
578 }
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
579
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
580 // Go through all of the buffers we
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
581 // recorded down and write them.
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
582 for (unsigned int u = 0; u < MAX_CASE; u++) {
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
583 if (!SCOPE(0).casebuffers[u])
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
584 continue;
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
585
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
586 w->MoveMark (SCOPE(0).casemarks[u]);
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
587 w->WriteBuffer (SCOPE(0).casebuffers[u]);
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
588 }
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
589
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
590 // Move the closing mark here
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
591 w->MoveMark (SCOPE(0).mark1);
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
592 }
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
593 }
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
594
41
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
595 // Descend down the stack
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
596 g_ScopeCursor--;
37
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
597 continue;
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
598 }
c349dca807f9 Added mark/reference system to be able to refer to positions in the buffered bytecode. Labels and go-to support.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 36
diff changeset
599
16
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
600 int dataheader = (g_CurMode == MODE_EVENT) ? DH_ENDEVENT :
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
601 (g_CurMode == MODE_MAINLOOP) ? DH_ENDMAINLOOP :
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
602 (g_CurMode == MODE_ONENTER) ? DH_ENDONENTER :
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
603 (g_CurMode == MODE_ONEXIT) ? DH_ENDONEXIT : -1;
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
604
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
605 if (dataheader == -1)
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
606 ParserError ("unexpected `}`");
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
607
26
54eaea6dc27c Mainloop and onenter definitions are now written into separate buffers first and only written to file after state ends. Why? Zandronum seems to demand that mainloop definitions MUST be written right after any onenter one. This way, mainloop and onenter definitions can be written without this restriction in the script. Also now I have a cool uchar-buffer class :)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 25
diff changeset
608 // Data header must be written before mode is changed because
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
609 // onenter and mainloop go into special buffers, and we want
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
610 // the closing data headers into said buffers too.
16
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
611 w->Write (dataheader);
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
612 g_CurMode = MODE_TOPLEVEL;
18
dbcc3b784234 New rule: a semicolon is now required after events, mainloop, onexit and onenter definitions.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 17
diff changeset
613
31
ad027ea58097 Lifted the ';'-after-events rule, though it can still be present. C++ allows it for functions, so this feels like the best solution regarding consistency.. I'm not even sure am I going overboard with this kind of stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 28
diff changeset
614 if (!PeekNext().compare (";"))
ad027ea58097 Lifted the ';'-after-events rule, though it can still be present. C++ allows it for functions, so this feels like the best solution regarding consistency.. I'm not even sure am I going overboard with this kind of stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 28
diff changeset
615 MustNext (";");
24
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
616 continue;
0
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
617 }
24
7dcc8419dbdb Variables can now be assigned values, unfortunately not at top level.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 22
diff changeset
618
43
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
619 // ============================================================
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
620 // If nothing else, parse it as a statement (which is either
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
621 // assignment or expression)
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
622 DataBuffer* b = ParseStatement (w);
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
623 w->WriteBuffer (b);
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
624 MustNext (";");
0
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
625 }
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
626
1
f0c61c204bc8 Added support for #include directives, added basic header and statistics printing.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 0
diff changeset
627 if (g_CurMode != MODE_TOPLEVEL)
17
b4fcc69e426a Events and commands are now treated properly case-insensitively.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 16
diff changeset
628 ParserError ("script did not end at top level; did you forget a `}`?");
16
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
629
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
630 // stateSpawn must be defined!
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
631 if (!g_stateSpawnDefined)
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
632 ParserError ("script must have a state named `stateSpawn`!");
0
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
633
26
54eaea6dc27c Mainloop and onenter definitions are now written into separate buffers first and only written to file after state ends. Why? Zandronum seems to demand that mainloop definitions MUST be written right after any onenter one. This way, mainloop and onenter definitions can be written without this restriction in the script. Also now I have a cool uchar-buffer class :)
Teemu Piippo <crimsondusk64@gmail.com>
parents: 25
diff changeset
634 // Dump the last state's onenter and mainloop
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
635 w->WriteBuffers ();
19
66993500719f Commands w/ arguments are now written correctly.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 18
diff changeset
636
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
637 // String table
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
638 w->WriteStringTable ();
0
8dce9696d62d Initial commit
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
639 }
15
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
640
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
641 // ============================================================================
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
642 // Parses a command call
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
643 DataBuffer* ScriptReader::ParseCommand (CommandDef* comm) {
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
644 DataBuffer* r = new DataBuffer(64);
16
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
645 if (g_CurMode == MODE_TOPLEVEL)
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
646 ParserError ("command call at top level");
16
393359908179 Added mainloop/onenter/onexit support, fixed state writing.. this thing can compile the script for the `jumping arghbot` now!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 15
diff changeset
647
15
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
648 MustNext ("(");
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
649 MustNext ();
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
650
15
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
651 int curarg = 0;
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
652 while (1) {
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
653 if (!token.compare (")")) {
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
654 if (curarg < comm->numargs - 1)
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
655 ParserError ("too few arguments passed to %s\n", comm->name.chars());
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
656 break;
15
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
657 curarg++;
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
658 }
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
659
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
660 if (curarg >= comm->maxargs)
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
661 ParserError ("too many arguments passed to %s\n", comm->name.chars());
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
662
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
663 r->Merge (ParseExpression (comm->argtypes[curarg]));
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
664 MustNext ();
15
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
665
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
666 if (curarg < comm->numargs - 1) {
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
667 MustThis (",");
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
668 MustNext ();
15
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
669 } else if (curarg < comm->maxargs - 1) {
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
670 // Can continue, but can terminate as well.
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
671 if (!token.compare (")")) {
15
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
672 curarg++;
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
673 break;
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
674 } else {
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
675 MustThis (",");
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
676 MustNext ();
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
677 }
15
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
678 }
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
679
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
680 curarg++;
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
681 }
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
682
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
683 // If the script skipped any optional arguments, fill in defaults.
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
684 while (curarg < comm->maxargs) {
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
685 r->Write<word> (DH_PUSHNUMBER);
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
686 r->Write<word> (comm->defvals[curarg]);
15
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
687 curarg++;
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
688 }
19
66993500719f Commands w/ arguments are now written correctly.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 18
diff changeset
689
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
690 r->Write<word> (DH_COMMAND);
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
691 r->Write<word> (comm->number);
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
692 r->Write<word> (comm->maxargs);
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
693
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
694 return r;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
695 }
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
696
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
697 // ============================================================================
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
698 // Is the given operator an assignment operator?
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
699 static bool IsAssignmentOperator (int oper) {
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
700 switch (oper) {
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
701 case OPER_ASSIGNADD:
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
702 case OPER_ASSIGNSUB:
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
703 case OPER_ASSIGNMUL:
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
704 case OPER_ASSIGNDIV:
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
705 case OPER_ASSIGNMOD:
51
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
706 case OPER_ASSIGNLEFTSHIFT:
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
707 case OPER_ASSIGNRIGHTSHIFT:
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
708 case OPER_ASSIGN:
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
709 return true;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
710 }
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
711 return false;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
712 }
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
713
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
714 // ============================================================================
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
715 // Finds an operator's corresponding dataheader
52
f2596a239ea1 Added ! operator support. It's not really an operator since it's just checked at the beginning of the expression value but eh.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 51
diff changeset
716 static word DataHeaderByOperator (ScriptVar* var, int oper) {
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
717 if (IsAssignmentOperator (oper)) {
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
718 if (!var)
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
719 error ("operator %d requires left operand to be a variable\n", oper);
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
720
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
721 // TODO: At the moment, vars only are global
51
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
722 // OPER_ASSIGNLEFTSHIFT and OPER_ASSIGNRIGHTSHIFT do not
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
723 // have data headers, instead they are expanded out in
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
724 // the operator parser
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
725 switch (oper) {
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
726 case OPER_ASSIGNADD: return DH_ADDGLOBALVAR;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
727 case OPER_ASSIGNSUB: return DH_SUBGLOBALVAR;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
728 case OPER_ASSIGNMUL: return DH_MULGLOBALVAR;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
729 case OPER_ASSIGNDIV: return DH_DIVGLOBALVAR;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
730 case OPER_ASSIGNMOD: return DH_MODGLOBALVAR;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
731 case OPER_ASSIGN: return DH_ASSIGNGLOBALVAR;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
732 default: error ("bad assignment operator!!\n");
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
733 }
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
734 }
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
735
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
736 switch (oper) {
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
737 case OPER_ADD: return DH_ADD;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
738 case OPER_SUBTRACT: return DH_SUBTRACT;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
739 case OPER_MULTIPLY: return DH_MULTIPLY;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
740 case OPER_DIVIDE: return DH_DIVIDE;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
741 case OPER_MODULUS: return DH_MODULUS;
38
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
742 case OPER_EQUALS: return DH_EQUALS;
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
743 case OPER_NOTEQUALS: return DH_NOTEQUALS;
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
744 case OPER_LESSTHAN: return DH_LESSTHAN;
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
745 case OPER_GREATERTHAN: return DH_GREATERTHAN;
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
746 case OPER_LESSTHANEQUALS: return DH_LESSTHANEQUALS;
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
747 case OPER_GREATERTHANEQUALS: return DH_GREATERTHANEQUALS;
51
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
748 case OPER_LEFTSHIFT: return DH_LSHIFT;
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
749 case OPER_RIGHTSHIFT: return DH_RSHIFT;
53
9ef7e549391f Added support for operators &&, ||, &, | and ^
Teemu Piippo <crimsondusk64@gmail.com>
parents: 52
diff changeset
750 case OPER_OR: return DH_ORLOGICAL;
9ef7e549391f Added support for operators &&, ||, &, | and ^
Teemu Piippo <crimsondusk64@gmail.com>
parents: 52
diff changeset
751 case OPER_AND: return DH_ANDLOGICAL;
9ef7e549391f Added support for operators &&, ||, &, | and ^
Teemu Piippo <crimsondusk64@gmail.com>
parents: 52
diff changeset
752 case OPER_BITWISEOR: return DH_ORBITWISE;
9ef7e549391f Added support for operators &&, ||, &, | and ^
Teemu Piippo <crimsondusk64@gmail.com>
parents: 52
diff changeset
753 case OPER_BITWISEEOR: return DH_EORBITWISE;
9ef7e549391f Added support for operators &&, ||, &, | and ^
Teemu Piippo <crimsondusk64@gmail.com>
parents: 52
diff changeset
754 case OPER_BITWISEAND: return DH_ANDBITWISE;
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
755 }
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
756
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
757 error ("DataHeaderByOperator: couldn't find dataheader for operator %d!\n", oper);
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
758 return 0;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
759 }
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
760
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
761 // ============================================================================
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
762 // Parses an expression, potentially recursively
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
763 DataBuffer* ScriptReader::ParseExpression (int reqtype) {
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
764 DataBuffer* retbuf = new DataBuffer (64);
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
765
46
a29eeecf3ecb Expressions now allow multiple operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 45
diff changeset
766 // Parse first operand
a29eeecf3ecb Expressions now allow multiple operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 45
diff changeset
767 retbuf->Merge (ParseExprValue (reqtype));
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
768
46
a29eeecf3ecb Expressions now allow multiple operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 45
diff changeset
769 // Parse any and all operators we get
a29eeecf3ecb Expressions now allow multiple operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 45
diff changeset
770 int oper;
a29eeecf3ecb Expressions now allow multiple operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 45
diff changeset
771 while ((oper = ParseOperator (true)) != -1) {
a29eeecf3ecb Expressions now allow multiple operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 45
diff changeset
772 // We peeked the operator, move forward now
a29eeecf3ecb Expressions now allow multiple operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 45
diff changeset
773 MustNext();
a29eeecf3ecb Expressions now allow multiple operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 45
diff changeset
774
a29eeecf3ecb Expressions now allow multiple operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 45
diff changeset
775 // Can't be an assignement operator, those belong in assignments.
a29eeecf3ecb Expressions now allow multiple operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 45
diff changeset
776 if (IsAssignmentOperator (oper))
51
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
777 ParserError ("assignment operator inside expression");
46
a29eeecf3ecb Expressions now allow multiple operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 45
diff changeset
778
a29eeecf3ecb Expressions now allow multiple operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 45
diff changeset
779 // Parse the right operand,
a29eeecf3ecb Expressions now allow multiple operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 45
diff changeset
780 MustNext ();
a29eeecf3ecb Expressions now allow multiple operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 45
diff changeset
781 DataBuffer* rb = ParseExprValue (reqtype);
a29eeecf3ecb Expressions now allow multiple operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 45
diff changeset
782
55
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
783 if (oper == OPER_TERNARY) {
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
784 // Ternary operator requires - naturally - a third operand.
55
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
785 MustNext (":");
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
786 MustNext ();
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
787 DataBuffer* tb = ParseExprValue (reqtype);
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
788
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
789 // It also is handled differently: there isn't a dataheader for ternary
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
790 // operator. Instead, we abuse PUSHNUMBER and IFNOTGOTO for this.
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
791 int mark1 = retbuf->AddMark (""); // start of "else" case
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
792 int mark2 = retbuf->AddMark (""); // end of expression
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
793 retbuf->Write<word> (DH_IFNOTGOTO);
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
794 retbuf->AddMarkReference (mark1);
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
795 retbuf->Merge (rb);
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
796 retbuf->Write<word> (DH_GOTO);
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
797 retbuf->AddMarkReference (mark2);
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
798 retbuf->MoveMark (mark1); // start of "else" case
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
799 retbuf->Merge (tb);
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
800 retbuf->Write<word> (DH_GOTO);
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
801 retbuf->AddMarkReference (mark2);
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
802 retbuf->MoveMark (mark2); // move endmark to end
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
803 } else {
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
804 // Write to buffer
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
805 retbuf->Merge (rb);
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
806 retbuf->Write<word> (DataHeaderByOperator (NULL, oper));
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
807 }
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
808 }
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
809
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
810 return retbuf;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
811 }
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
812
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
813 // ============================================================================
46
a29eeecf3ecb Expressions now allow multiple operators
Teemu Piippo <crimsondusk64@gmail.com>
parents: 45
diff changeset
814 // Parses an operator string. Returns the operator number code.
51
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
815 #define ISNEXT(char) !PeekNext (peek ? 1 : 0).compare (char)
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
816 int ScriptReader::ParseOperator (bool peek) {
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
817 str oper;
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
818 if (peek)
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
819 oper += PeekNext ();
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
820 else
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
821 oper += token;
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
822
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
823 // Check one-char operators
51
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
824 bool equalsnext = ISNEXT ("=");
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
825
38
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
826 int o = (!oper.compare ("=") && !equalsnext) ? OPER_ASSIGN :
53
9ef7e549391f Added support for operators &&, ||, &, | and ^
Teemu Piippo <crimsondusk64@gmail.com>
parents: 52
diff changeset
827 (!oper.compare (">") && !equalsnext && !ISNEXT (">")) ? OPER_GREATERTHAN :
9ef7e549391f Added support for operators &&, ||, &, | and ^
Teemu Piippo <crimsondusk64@gmail.com>
parents: 52
diff changeset
828 (!oper.compare ("<") && !equalsnext && !ISNEXT ("<")) ? OPER_LESSTHAN :
9ef7e549391f Added support for operators &&, ||, &, | and ^
Teemu Piippo <crimsondusk64@gmail.com>
parents: 52
diff changeset
829 (!oper.compare ("&") && !ISNEXT ("&")) ? OPER_BITWISEAND :
9ef7e549391f Added support for operators &&, ||, &, | and ^
Teemu Piippo <crimsondusk64@gmail.com>
parents: 52
diff changeset
830 (!oper.compare ("|") && !ISNEXT ("|")) ? OPER_BITWISEOR :
9ef7e549391f Added support for operators &&, ||, &, | and ^
Teemu Piippo <crimsondusk64@gmail.com>
parents: 52
diff changeset
831 !oper.compare ("^") ? OPER_BITWISEEOR :
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
832 !oper.compare ("+") ? OPER_ADD :
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
833 !oper.compare ("-") ? OPER_SUBTRACT :
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
834 !oper.compare ("*") ? OPER_MULTIPLY :
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
835 !oper.compare ("/") ? OPER_DIVIDE :
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
836 !oper.compare ("%") ? OPER_MODULUS :
55
173956c1ac27 Added support for the ternary operator.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 54
diff changeset
837 !oper.compare ("?") ? OPER_TERNARY :
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
838 -1;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
839
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
840 if (o != -1) {
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
841 return o;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
842 }
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
843
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
844 // Two-char operators
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
845 oper += PeekNext (peek ? 1 : 0);
51
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
846 equalsnext = !PeekNext (peek ? 2 : 1).compare ("=");
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
847
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
848 o = !oper.compare ("+=") ? OPER_ASSIGNADD :
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
849 !oper.compare ("-=") ? OPER_ASSIGNSUB :
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
850 !oper.compare ("*=") ? OPER_ASSIGNMUL :
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
851 !oper.compare ("/=") ? OPER_ASSIGNDIV :
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
852 !oper.compare ("%=") ? OPER_ASSIGNMOD :
38
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
853 !oper.compare ("==") ? OPER_EQUALS :
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
854 !oper.compare ("!=") ? OPER_NOTEQUALS :
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
855 !oper.compare (">=") ? OPER_GREATERTHANEQUALS :
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
856 !oper.compare ("<=") ? OPER_LESSTHANEQUALS :
53
9ef7e549391f Added support for operators &&, ||, &, | and ^
Teemu Piippo <crimsondusk64@gmail.com>
parents: 52
diff changeset
857 !oper.compare ("&&") ? OPER_AND :
9ef7e549391f Added support for operators &&, ||, &, | and ^
Teemu Piippo <crimsondusk64@gmail.com>
parents: 52
diff changeset
858 !oper.compare ("||") ? OPER_OR :
51
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
859 (!oper.compare ("<<") && !equalsnext) ? OPER_LEFTSHIFT :
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
860 (!oper.compare (">>") && !equalsnext) ? OPER_RIGHTSHIFT :
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
861 -1;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
862
51
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
863 if (o != -1) {
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
864 MustNext ();
51
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
865 return o;
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
866 }
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
867
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
868 // Three-char opers
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
869 oper += PeekNext (peek ? 2 : 1);
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
870 o = !oper.compare ("<<=") ? OPER_ASSIGNLEFTSHIFT :
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
871 !oper.compare (">>=") ? OPER_ASSIGNRIGHTSHIFT :
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
872 -1;
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
873
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
874 if (o != -1) {
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
875 MustNext ();
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
876 MustNext ();
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
877 }
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
878
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
879 return o;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
880 }
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
881
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
882 // ============================================================================
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
883 // Parses a value in the expression and returns the data needed to push
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
884 // it, contained in a data buffer. A value can be either a variable, a command,
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
885 // a literal or an expression.
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
886 DataBuffer* ScriptReader::ParseExprValue (int reqtype) {
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
887 DataBuffer* b = new DataBuffer(16);
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
888
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
889 ScriptVar* g;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
890
52
f2596a239ea1 Added ! operator support. It's not really an operator since it's just checked at the beginning of the expression value but eh.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 51
diff changeset
891 // Prefixing "!" means negation.
f2596a239ea1 Added ! operator support. It's not really an operator since it's just checked at the beginning of the expression value but eh.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 51
diff changeset
892 bool negate = !token.compare ("!");
f2596a239ea1 Added ! operator support. It's not really an operator since it's just checked at the beginning of the expression value but eh.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 51
diff changeset
893 if (negate) // Jump past the "!"
f2596a239ea1 Added ! operator support. It's not really an operator since it's just checked at the beginning of the expression value but eh.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 51
diff changeset
894 MustNext ();
f2596a239ea1 Added ! operator support. It's not really an operator since it's just checked at the beginning of the expression value but eh.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 51
diff changeset
895
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
896 if (!token.compare ("(")) {
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
897 // Expression
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
898 MustNext ();
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
899 DataBuffer* c = ParseExpression (reqtype);
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
900 b->Merge (c);
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
901 MustNext (")");
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
902 } else if (CommandDef* comm = FindCommand (token)) {
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
903 delete b;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
904
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
905 // Command
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
906 if (reqtype && comm->returnvalue != reqtype)
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
907 ParserError ("%s returns an incompatible data type", comm->name.chars());
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
908 b = ParseCommand (comm);
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
909 } else if ((g = FindGlobalVariable (token)) && reqtype != TYPE_STRING) {
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
910 // Global variable
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
911 b->Write<word> (DH_PUSHGLOBALVAR);
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
912 b->Write<word> (g->index);
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
913 } else {
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
914 // If nothing else, check for literal
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
915 switch (reqtype) {
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
916 case TYPE_VOID:
44
6bbaebc472b5 Added do-while loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 43
diff changeset
917 ParserError ("unknown identifier `%s` (expected keyword, function or variable)", token.chars());
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
918 break;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
919 case TYPE_INT: {
35
3d3f6ed40171 Negative literal integers work properly now..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 34
diff changeset
920 MustNumber (true);
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
921
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
922 // All values are written unsigned - thus we need to write the value's
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
923 // absolute value, followed by an unary minus if it was negative.
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
924 b->Write<word> (DH_PUSHNUMBER);
38
e4bbd540663b Added if() support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 37
diff changeset
925
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
926 long v = atoi (token.chars ());
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
927 b->Write<word> (static_cast<word> (abs (v)));
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
928 if (v < 0)
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
929 b->Write<word> (DH_UNARYMINUS);
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
930 break;
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
931 }
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
932 case TYPE_STRING:
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
933 // PushToStringTable either returns the string index of the
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
934 // string if it finds it in the table, or writes it to the
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
935 // table and returns it index if it doesn't find it there.
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
936 MustString (true);
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
937 b->Write<word> (DH_PUSHSTRINGINDEX);
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
938 b->Write<word> (PushToStringTable (token.chars()));
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
939 break;
54
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
940 case TYPE_FLOAT: {
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
941 str floatstring;
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
942
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
943 MustNumber (true);
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
944 floatstring += token;
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
945
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
946 // Go after the decimal point
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
947 if (!PeekNext ().compare(".")) {
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
948 MustNext (".");
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
949 MustNumber (false);
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
950 floatstring += ".";
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
951 floatstring += token;
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
952 }
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
953
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
954 // TODO: Casting float to word causes the decimal to be lost.
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
955 // Find a way to store the number without such loss.
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
956 float val = atof (floatstring);
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
957 b->Write<word> (DH_PUSHNUMBER);
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
958 b->Write<word> (static_cast<word> ((val > 0) ? val : -val));
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
959 if (val < 0)
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
960 b->Write<word> (DH_UNARYMINUS);
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
961
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
962 // TODO: Keep this check after decimal loss is fixed, but make
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
963 // it a real precision loss check. 55.5123 -> 55.512299, this
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
964 // should probably be warned of.
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
965 float check = static_cast<float> (static_cast<word> (val));
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
966 if (val != check)
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
967 ParserWarning ("floating point number %f loses precision (-> %f)", val, check);
8cc91ef94754 Added floating point support for the most part. However, decimals are somehow lost during a cast..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 53
diff changeset
968 }
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
969 }
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
970 }
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
971
52
f2596a239ea1 Added ! operator support. It's not really an operator since it's just checked at the beginning of the expression value but eh.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 51
diff changeset
972 // Negate it now if desired
f2596a239ea1 Added ! operator support. It's not really an operator since it's just checked at the beginning of the expression value but eh.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 51
diff changeset
973 if (negate)
f2596a239ea1 Added ! operator support. It's not really an operator since it's just checked at the beginning of the expression value but eh.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 51
diff changeset
974 b->Write<word> (DH_NEGATELOGICAL);
f2596a239ea1 Added ! operator support. It's not really an operator since it's just checked at the beginning of the expression value but eh.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 51
diff changeset
975
34
0a9a5902beaa Expression parser mostly up and running!! Still work to do on it though.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 33
diff changeset
976 return b;
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
977 }
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
978
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
979 // ============================================================================
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
980 // Parses an assignment. An assignment starts with a variable name, followed
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
981 // by an assignment operator, followed by an expression value. Expects current
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
982 // token to be the name of the variable, and expects the variable to be given.
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
983 DataBuffer* ScriptReader::ParseAssignment (ScriptVar* var) {
51
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
984 bool global = !var->statename.len ();
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
985
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
986 // Get an operator
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
987 MustNext ();
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
988 int oper = ParseOperator ();
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
989 if (!IsAssignmentOperator (oper))
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
990 ParserError ("expected assignment operator");
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
991
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
992 if (g_CurMode == MODE_TOPLEVEL) // TODO: lift this restriction
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
993 ParserError ("can't alter variables at top level");
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
994
51
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
995 // Parse the right operand
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
996 MustNext ();
51
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
997 DataBuffer* retbuf = new DataBuffer;
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
998 DataBuffer* expr = ParseExpression (TYPE_INT);
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
999
51
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
1000 // <<= and >>= do not have data headers. Solution: expand them.
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
1001 // a <<= b -> a = a << b
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
1002 // a >>= b -> a = a >> b
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
1003 if (oper == OPER_ASSIGNLEFTSHIFT || oper == OPER_ASSIGNRIGHTSHIFT) {
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
1004 retbuf->Write<word> (global ? DH_PUSHGLOBALVAR : DH_PUSHLOCALVAR);
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
1005 retbuf->Write<word> (var->index);
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
1006 retbuf->Merge (expr);
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
1007 retbuf->Write<word> ((oper == OPER_ASSIGNLEFTSHIFT) ? DH_LSHIFT : DH_RSHIFT);
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
1008 retbuf->Write<word> (global ? DH_ASSIGNGLOBALVAR : DH_ASSIGNLOCALVAR);
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
1009 retbuf->Write<word> (var->index);
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
1010 } else {
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
1011 retbuf->Merge (expr);
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
1012 long dh = DataHeaderByOperator (var, oper);
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
1013 retbuf->Write<word> (dh);
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
1014 retbuf->Write<word> (var->index);
2cfa6edbf928 Added <<= and >>= operator support. Zandronum does not provide these, thus they are translated to their longer forms by the compiler. Also aded << and >>.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 50
diff changeset
1015 }
36
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
1016
a8838b5f1213 Parser can now read expressions 100% properly and can perform variable assignment. I'd call this a milestone!
Teemu Piippo <crimsondusk64@gmail.com>
parents: 35
diff changeset
1017 return retbuf;
40
9e4f785501db Committed the other changes done during a failed attempt of else
Teemu Piippo <crimsondusk64@gmail.com>
parents: 39
diff changeset
1018 }
9e4f785501db Committed the other changes done during a failed attempt of else
Teemu Piippo <crimsondusk64@gmail.com>
parents: 39
diff changeset
1019
58
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
1020 void ScriptReader::PushScope () {
bc9317d1b9c9 Renamed 'block stack' to scope stack for more clarified code..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 57
diff changeset
1021 g_ScopeCursor++;
59
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
1022 if (g_ScopeCursor >= MAX_SCOPE)
56
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
1023 ParserError ("too deep scope");
384c5605bda9 Added support for else-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 55
diff changeset
1024
59
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
1025 ScopeInfo* info = &SCOPE(0);
41
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
1026 info->type = 0;
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
1027 info->mark1 = 0;
47e686c96d8f Added while loop support. However, script marks keep getting wrong position numbers..
Teemu Piippo <crimsondusk64@gmail.com>
parents: 40
diff changeset
1028 info->mark2 = 0;
43
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
1029 info->buffer1 = NULL;
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
1030 info->casecursor = -1;
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
1031 for (int i = 0; i < MAX_CASE; i++) {
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
1032 info->casemarks[i] = MAX_MARKS;
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
1033 info->casebuffers[i] = NULL;
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1034 info->casenumbers[i] = -1;
48
976c57f153b3 Added switch support... fixed more problems with marks in the process
Teemu Piippo <crimsondusk64@gmail.com>
parents: 47
diff changeset
1035 }
43
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
1036 }
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
1037
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
1038 DataBuffer* ScriptReader::ParseStatement (ObjWriter* w) {
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
1039 // If it's a variable, expect assignment.
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
1040 if (ScriptVar* var = FindGlobalVariable (token)) {
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
1041 DataBuffer* b = ParseAssignment (var);
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
1042 return b;
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
1043 }
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
1044
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
1045 // If it's not a keyword, parse it as an expression.
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
1046 DataBuffer* b = ParseExpression (TYPE_VOID);
1b35c9985989 Added for-loop support
Teemu Piippo <crimsondusk64@gmail.com>
parents: 42
diff changeset
1047 return b;
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1048 }
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1049
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1050 void ScriptReader::AddSwitchCase (ObjWriter* w, DataBuffer* b) {
59
891b9e6ee139 Added support for continue-statements
Teemu Piippo <crimsondusk64@gmail.com>
parents: 58
diff changeset
1051 ScopeInfo* info = &SCOPE(0);
50
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1052
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1053 info->casecursor++;
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1054 if (info->casecursor >= MAX_CASE)
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1055 ParserError ("too many cases in one switch");
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1056
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1057 // Init a mark for the case buffer
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1058 int m = w->AddMark ("");
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1059 info->casemarks[info->casecursor] = m;
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1060
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1061 // Add a reference to the mark. "case" and "default" both
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1062 // add the necessary bytecode before the reference.
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1063 if (b)
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1064 b->AddMarkReference (m);
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1065 else
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1066 w->AddReference (m);
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1067
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1068 // Init a buffer for the case block and tell the object
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1069 // writer to record all written data to it.
2e333a3ca49a Added default label for switch
Teemu Piippo <crimsondusk64@gmail.com>
parents: 49
diff changeset
1070 info->casebuffers[info->casecursor] = w->SwitchBuffer = new DataBuffer;
15
284c2fc6c1cd Moved command parser to a new function.
Teemu Piippo <crimsondusk64@gmail.com>
parents: 14
diff changeset
1071 }

mercurial