src/parser.cxx

Fri, 10 Jan 2014 21:58:42 +0200

author
Teemu Piippo <crimsondusk64@gmail.com>
date
Fri, 10 Jan 2014 21:58:42 +0200
changeset 72
03e4d9db3fd9
parent 71
11f23fabf8a6
child 73
1ee9b312dc18
permissions
-rw-r--r--

- major refactoring begins

71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1 #include "objwriter.h"
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
2 #include "scriptreader.h"
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
3 #include "events.h"
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
4 #include "commands.h"
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
5 #include "stringtable.h"
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
6 #include "variables.h"
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
7 #include "containers.h"
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
8
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
9 #define MUST_TOPLEVEL if (g_CurMode != MODE_TOPLEVEL) \
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
10 ParserError ("%s-statements may only be defined at top level!", token.chars());
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
11
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
12 #define MUST_NOT_TOPLEVEL if (g_CurMode == MODE_TOPLEVEL) \
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
13 ParserError ("%s-statements may not be defined at top level!", token.chars());
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
14
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
15 #define SCOPE(n) scopestack[g_ScopeCursor - n]
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
16
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
17 int g_NumStates = 0;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
18 int g_NumEvents = 0;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
19 parsermode_e g_CurMode = MODE_TOPLEVEL;
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
20 string g_CurState = "";
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
21 bool g_stateSpawnDefined = false;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
22 bool g_GotMainLoop = false;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
23 unsigned int g_ScopeCursor = 0;
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
24 DataBuffer* g_IfExpression = null;
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
25 bool g_CanElse = false;
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
26 string* g_UndefinedLabels[MAX_MARKS];
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
27 bool g_Neurosphere = false; // neurosphere-compat
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
28 list<constinfo_t> g_ConstInfo;
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
29
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
30 // ============================================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
31 // Main parser code. Begins read of the script file, checks the syntax of it
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
32 // and writes the data to the object file via ObjWriter - which also takes care
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
33 // of necessary buffering so stuff is written in the correct order.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
34 void ScriptReader::ParseBotScript (ObjWriter* w) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
35 // Zero the entire block stack first
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
36 for (int i = 0; i < MAX_SCOPE; i++)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
37 ZERO(scopestack[i]);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
38
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
39 for (int i = 0; i < MAX_MARKS; i++)
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
40 g_UndefinedLabels[i] = null;
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
41
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
42 while (Next()) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
43 // Check if else is potentically valid
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
44 if (token == "else" && !g_CanElse)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
45 ParserError ("else without preceding if");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
46 if (token != "else")
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
47 g_CanElse = false;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
48
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
49 // ============================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
50 if (token == "state") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
51 MUST_TOPLEVEL
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
52
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
53 MustString ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
54
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
55 // State name must be a word.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
56 if (token.first (" ") != token.len())
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
57 ParserError ("state name must be a single word, got `%s`", token.chars());
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
58 string statename = token;
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
59
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
60 // stateSpawn is special - it *must* be defined. If we
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
61 // encountered it, then mark down that we have it.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
62 if (-token == "statespawn")
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
63 g_stateSpawnDefined = true;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
64
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
65 // Must end in a colon
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
66 MustNext (":");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
67
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
68 // Write the previous state's onenter and
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
69 // mainloop buffers to file now
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
70 if (g_CurState.len())
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
71 w->WriteBuffers();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
72
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
73 w->Write (DH_STATENAME);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
74 w->WriteString (statename);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
75 w->Write (DH_STATEIDX);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
76 w->Write (g_NumStates);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
77
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
78 g_NumStates++;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
79 g_CurState = token;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
80 g_GotMainLoop = false;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
81 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
82 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
83
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
84 // ============================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
85 if (token == "event") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
86 MUST_TOPLEVEL
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
87
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
88 // Event definition
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
89 MustString ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
90
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
91 EventDef* e = FindEventByName (token);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
92 if (!e)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
93 ParserError ("bad event, got `%s`\n", token.chars());
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
94
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
95 MustNext ("{");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
96
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
97 g_CurMode = MODE_EVENT;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
98
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
99 w->Write (DH_EVENT);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
100 w->Write (e->number);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
101 g_NumEvents++;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
102 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
103 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
104
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
105 // ============================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
106 if (token == "mainloop") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
107 MUST_TOPLEVEL
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
108 MustNext ("{");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
109
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
110 // Mode must be set before dataheader is written here!
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
111 g_CurMode = MODE_MAINLOOP;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
112 w->Write (DH_MAINLOOP);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
113 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
114 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
115
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
116 // ============================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
117 if (token == "onenter" || token == "onexit") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
118 MUST_TOPLEVEL
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
119 bool onenter = token == "onenter";
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
120 MustNext ("{");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
121
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
122 // Mode must be set before dataheader is written here,
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
123 // because onenter goes to a separate buffer.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
124 g_CurMode = onenter ? MODE_ONENTER : MODE_ONEXIT;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
125 w->Write (onenter ? DH_ONENTER : DH_ONEXIT);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
126 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
127 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
128
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
129 // ============================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
130 if (token == "int" || token == "str" || token == "bool") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
131 // For now, only globals are supported
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
132 if (g_CurMode != MODE_TOPLEVEL || g_CurState.len())
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
133 ParserError ("variables must only be global for now");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
134
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
135 type_e type = (token == "int") ? TYPE_INT :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
136 (token == "str") ? TYPE_STRING :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
137 TYPE_BOOL;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
138
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
139 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
140
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
141 // Var name must not be a number
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
142 if (token.is_numeric())
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
143 ParserError ("variable name must not be a number");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
144
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
145 string varname = token;
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
146 ScriptVar* var = DeclareGlobalVariable (this, type, varname);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
147
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
148 if (!var)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
149 ParserError ("declaring %s variable %s failed",
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
150 g_CurState.len() ? "state" : "global", varname.chars());
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
151
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
152 MustNext (";");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
153 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
154 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
155
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
156 // ============================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
157 // Goto
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
158 if (token == "goto") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
159 MUST_NOT_TOPLEVEL
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
160
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
161 // Get the name of the label
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
162 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
163
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
164 // Find the mark this goto statement points to
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
165 unsigned int m = w->FindMark (token);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
166
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
167 // If not set, define it
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
168 if (m == MAX_MARKS) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
169 m = w->AddMark (token);
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
170 g_UndefinedLabels[m] = new string (token);
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
171 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
172
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
173 // Add a reference to the mark.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
174 w->Write (DH_GOTO);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
175 w->AddReference (m);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
176 MustNext (";");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
177 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
178 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
179
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
180 // ============================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
181 // If
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
182 if (token == "if") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
183 MUST_NOT_TOPLEVEL
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
184 PushScope ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
185
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
186 // Condition
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
187 MustNext ("(");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
188
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
189 // Read the expression and write it.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
190 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
191 DataBuffer* c = ParseExpression (TYPE_INT);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
192 w->WriteBuffer (c);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
193
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
194 MustNext (")");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
195 MustNext ("{");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
196
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
197 // Add a mark - to here temporarily - and add a reference to it.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
198 // Upon a closing brace, the mark will be adjusted.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
199 unsigned int marknum = w->AddMark ("");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
200
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
201 // Use DH_IFNOTGOTO - if the expression is not true, we goto the mark
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
202 // we just defined - and this mark will be at the end of the scope block.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
203 w->Write (DH_IFNOTGOTO);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
204 w->AddReference (marknum);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
205
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
206 // Store it
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
207 SCOPE(0).mark1 = marknum;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
208 SCOPE(0).type = SCOPETYPE_IF;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
209 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
210 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
211
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
212 if (token == "else") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
213 MUST_NOT_TOPLEVEL
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
214 MustNext ("{");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
215
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
216 // Don't use PushScope as it resets the scope
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
217 g_ScopeCursor++;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
218 if (g_ScopeCursor >= MAX_SCOPE)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
219 ParserError ("too deep scope");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
220
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
221 if (SCOPE(0).type != SCOPETYPE_IF)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
222 ParserError ("else without preceding if");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
223
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
224 // Write down to jump to the end of the else statement
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
225 // Otherwise we have fall-throughs
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
226 SCOPE(0).mark2 = w->AddMark ("");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
227
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
228 // Instruction to jump to the end after if block is complete
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
229 w->Write (DH_GOTO);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
230 w->AddReference (SCOPE(0).mark2);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
231
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
232 // Move the ifnot mark here and set type to else
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
233 w->MoveMark (SCOPE(0).mark1);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
234 SCOPE(0).type = SCOPETYPE_ELSE;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
235 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
236 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
237
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
238 // ============================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
239 // While
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
240 if (token == "while") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
241 MUST_NOT_TOPLEVEL
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
242 PushScope ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
243
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
244 // While loops need two marks - one at the start of the loop and one at the
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
245 // end. The condition is checked at the very start of the loop, if it fails,
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
246 // we use goto to skip to the end of the loop. At the end, we loop back to
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
247 // the beginning with a go-to statement.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
248 unsigned int mark1 = w->AddMark (""); // start
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
249 unsigned int mark2 = w->AddMark (""); // end
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
250
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
251 // Condition
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
252 MustNext ("(");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
253 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
254 DataBuffer* expr = ParseExpression (TYPE_INT);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
255 MustNext (")");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
256 MustNext ("{");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
257
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
258 // Write condition
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
259 w->WriteBuffer (expr);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
260
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
261 // Instruction to go to the end if it fails
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
262 w->Write (DH_IFNOTGOTO);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
263 w->AddReference (mark2);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
264
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
265 // Store the needed stuff
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
266 SCOPE(0).mark1 = mark1;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
267 SCOPE(0).mark2 = mark2;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
268 SCOPE(0).type = SCOPETYPE_WHILE;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
269 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
270 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
271
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
272 // ============================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
273 // For loop
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
274 if (token == "for") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
275 MUST_NOT_TOPLEVEL
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
276 PushScope ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
277
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
278 // Initializer
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
279 MustNext ("(");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
280 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
281 DataBuffer* init = ParseStatement (w);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
282 if (!init)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
283 ParserError ("bad statement for initializer of for");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
284
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
285 MustNext (";");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
286
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
287 // Condition
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
288 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
289 DataBuffer* cond = ParseExpression (TYPE_INT);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
290 if (!cond)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
291 ParserError ("bad statement for condition of for");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
292
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
293 MustNext (";");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
294
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
295 // Incrementor
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
296 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
297 DataBuffer* incr = ParseStatement (w);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
298 if (!incr)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
299 ParserError ("bad statement for incrementor of for");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
300
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
301 MustNext (")");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
302 MustNext ("{");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
303
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
304 // First, write out the initializer
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
305 w->WriteBuffer (init);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
306
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
307 // Init two marks
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
308 int mark1 = w->AddMark ("");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
309 int mark2 = w->AddMark ("");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
310
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
311 // Add the condition
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
312 w->WriteBuffer (cond);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
313 w->Write (DH_IFNOTGOTO);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
314 w->AddReference (mark2);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
315
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
316 // Store the marks and incrementor
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
317 SCOPE(0).mark1 = mark1;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
318 SCOPE(0).mark2 = mark2;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
319 SCOPE(0).buffer1 = incr;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
320 SCOPE(0).type = SCOPETYPE_FOR;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
321 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
322 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
323
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
324 // ============================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
325 // Do/while loop
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
326 if (token == "do") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
327 MUST_NOT_TOPLEVEL
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
328 PushScope ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
329 MustNext ("{");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
330 SCOPE(0).mark1 = w->AddMark ("");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
331 SCOPE(0).type = SCOPETYPE_DO;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
332 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
333 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
334
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
335 // ============================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
336 // Switch
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
337 if (token == "switch") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
338 /* This goes a bit tricky. switch is structured in the
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
339 * bytecode followingly:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
340 * (expression)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
341 * case a: goto casemark1
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
342 * case b: goto casemark2
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
343 * case c: goto casemark3
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
344 * goto mark1 // jump to end if no matches
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
345 * casemark1: ...
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
346 * casemark2: ...
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
347 * casemark3: ...
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
348 * mark1: // end mark
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
349 */
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
350
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
351 MUST_NOT_TOPLEVEL
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
352 PushScope ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
353 MustNext ("(");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
354 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
355 w->WriteBuffer (ParseExpression (TYPE_INT));
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
356 MustNext (")");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
357 MustNext ("{");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
358 SCOPE(0).type = SCOPETYPE_SWITCH;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
359 SCOPE(0).mark1 = w->AddMark (""); // end mark
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
360 SCOPE(0).buffer1 = null; // default header
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
361 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
362 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
363
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
364 // ============================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
365 if (token == "case") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
366 // case is only allowed inside switch
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
367 if (SCOPE(0).type != SCOPETYPE_SWITCH)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
368 ParserError ("case label outside switch");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
369
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
370 // Get the literal (Zandronum does not support expressions here)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
371 MustNumber ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
372 int num = atoi (token.chars ());
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
373 MustNext (":");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
374
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
375 for (int i = 0; i < MAX_CASE; i++)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
376 if (SCOPE(0).casenumbers[i] == num)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
377 ParserError ("multiple case %d labels in one switch", num);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
378
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
379 // Write down the expression and case-go-to. This builds
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
380 // the case tree. The closing event will write the actual
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
381 // blocks and move the marks appropriately.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
382 // AddSwitchCase will add the reference to the mark
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
383 // for the case block that this heralds, and takes care
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
384 // of buffering setup and stuff like that.
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
385 // null the switch buffer for the case-go-to statement,
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
386 // we want it all under the switch, not into the case-buffers.
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
387 w->SwitchBuffer = null;
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
388 w->Write (DH_CASEGOTO);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
389 w->Write (num);
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
390 AddSwitchCase (w, null);
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
391 SCOPE(0).casenumbers[SCOPE(0).casecursor] = num;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
392 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
393 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
394
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
395 if (token == "default") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
396 if (SCOPE(0).type != SCOPETYPE_SWITCH)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
397 ParserError ("default label outside switch");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
398
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
399 if (SCOPE(0).buffer1)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
400 ParserError ("multiple default labels in one switch");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
401
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
402 MustNext (":");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
403
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
404 // The default header is buffered into buffer1, since
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
405 // it has to be the last of the case headers
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
406 //
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
407 // Since the expression is pushed into the switch
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
408 // and is only popped when case succeeds, we have
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
409 // to pop it with DH_DROP manually if we end up in
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
410 // a default.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
411 DataBuffer* b = new DataBuffer;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
412 SCOPE(0).buffer1 = b;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
413 b->Write (DH_DROP);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
414 b->Write (DH_GOTO);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
415 AddSwitchCase (w, b);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
416 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
417 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
418
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
419 // ============================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
420 // Break statement.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
421 if (token == "break") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
422 if (!g_ScopeCursor)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
423 ParserError ("unexpected `break`");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
424
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
425 w->Write (DH_GOTO);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
426
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
427 // switch and if use mark1 for the closing point,
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
428 // for and while use mark2.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
429 switch (SCOPE(0).type) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
430 case SCOPETYPE_IF:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
431 case SCOPETYPE_SWITCH:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
432 w->AddReference (SCOPE(0).mark1);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
433 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
434 case SCOPETYPE_FOR:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
435 case SCOPETYPE_WHILE:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
436 w->AddReference (SCOPE(0).mark2);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
437 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
438 default:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
439 ParserError ("unexpected `break`");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
440 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
441 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
442
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
443 MustNext (";");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
444 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
445 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
446
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
447 // ============================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
448 // Continue
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
449 if (token == "continue") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
450 MustNext (";");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
451
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
452 int curs;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
453 bool found = false;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
454
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
455 // Drop through the scope until we find a loop block
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
456 for (curs = g_ScopeCursor; curs > 0 && !found; curs--) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
457 switch (scopestack[curs].type) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
458 case SCOPETYPE_FOR:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
459 case SCOPETYPE_WHILE:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
460 case SCOPETYPE_DO:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
461 w->Write (DH_GOTO);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
462 w->AddReference (scopestack[curs].mark1);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
463 found = true;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
464 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
465 default:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
466 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
467 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
468 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
469
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
470 // No loop blocks
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
471 if (!found)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
472 ParserError ("`continue`-statement not inside a loop");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
473
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
474 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
475 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
476
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
477 // ============================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
478 // Label
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
479 if (PeekNext() == ":") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
480 MUST_NOT_TOPLEVEL
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
481
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
482 // want no conflicts..
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
483 if (IsKeyword (token))
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
484 ParserError ("label name `%s` conflicts with keyword\n", token.chars());
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
485 if (FindCommand (token))
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
486 ParserError ("label name `%s` conflicts with command name\n", token.chars());
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
487 if (FindGlobalVariable (token))
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
488 ParserError ("label name `%s` conflicts with variable\n", token.chars());
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
489
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
490 // See if a mark already exists for this label
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
491 int mark = -1;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
492 for (int i = 0; i < MAX_MARKS; i++) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
493 if (g_UndefinedLabels[i] && *g_UndefinedLabels[i] == token) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
494 mark = i;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
495 w->MoveMark (i);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
496
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
497 // No longer undefinde
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
498 delete g_UndefinedLabels[i];
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
499 g_UndefinedLabels[i] = null;
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
500 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
501 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
502
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
503 // Not found in unmarked lists, define it now
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
504 if (mark == -1)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
505 w->AddMark (token);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
506
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
507 MustNext (":");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
508 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
509 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
510
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
511 // ============================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
512 if (token == "const") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
513 constinfo_t info;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
514
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
515 // Get the type
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
516 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
517 info.type = GetTypeByName (token);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
518
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
519 if (info.type == TYPE_UNKNOWN || info.type == TYPE_VOID)
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
520 ParserError ("unknown type `%s` for constant", token.c_str());
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
521
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
522 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
523 info.name = token;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
524
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
525 MustNext ("=");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
526
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
527 switch (info.type) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
528 case TYPE_BOOL:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
529 case TYPE_INT:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
530 MustNumber (false);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
531 info.val = token;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
532 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
533 case TYPE_STRING:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
534 MustString ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
535 info.val = token;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
536 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
537 case TYPE_UNKNOWN:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
538 case TYPE_VOID:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
539 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
540 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
541
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
542 g_ConstInfo << info;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
543
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
544 MustNext (";");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
545 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
546 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
547
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
548 // ============================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
549 if (token == "}") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
550 // Closing brace
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
551
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
552 // If we're in the block stack, we're descending down from it now
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
553 if (g_ScopeCursor > 0) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
554 switch (SCOPE(0).type) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
555 case SCOPETYPE_IF:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
556 // Adjust the closing mark.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
557 w->MoveMark (SCOPE(0).mark1);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
558
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
559 // We're returning from if, thus else can be next
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
560 g_CanElse = true;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
561 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
562 case SCOPETYPE_ELSE:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
563 // else instead uses mark1 for itself (so if expression
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
564 // fails, jump to else), mark2 means end of else
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
565 w->MoveMark (SCOPE(0).mark2);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
566 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
567 case SCOPETYPE_FOR:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
568 // Write the incrementor at the end of the loop block
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
569 w->WriteBuffer (SCOPE(0).buffer1);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
570 // fall-thru
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
571 case SCOPETYPE_WHILE:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
572 // Write down the instruction to go back to the start of the loop
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
573 w->Write (DH_GOTO);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
574 w->AddReference (SCOPE(0).mark1);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
575
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
576 // Move the closing mark here since we're at the end of the while loop
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
577 w->MoveMark (SCOPE(0).mark2);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
578 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
579 case SCOPETYPE_DO: {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
580 MustNext ("while");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
581 MustNext ("(");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
582 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
583 DataBuffer* expr = ParseExpression (TYPE_INT);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
584 MustNext (")");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
585 MustNext (";");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
586
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
587 // If the condition runs true, go back to the start.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
588 w->WriteBuffer (expr);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
589 w->Write (DH_IFGOTO);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
590 w->AddReference (SCOPE(0).mark1);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
591 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
592 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
593 case SCOPETYPE_SWITCH: {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
594 // Switch closes. Move down to the record buffer of
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
595 // the lower block.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
596 if (SCOPE(1).casecursor != -1)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
597 w->SwitchBuffer = SCOPE(1).casebuffers[SCOPE(1).casecursor];
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
598 else
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
599 w->SwitchBuffer = null;
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
600
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
601 // If there was a default in the switch, write its header down now.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
602 // If not, write instruction to jump to the end of switch after
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
603 // the headers (thus won't fall-through if no case matched)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
604 if (SCOPE(0).buffer1)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
605 w->WriteBuffer (SCOPE(0).buffer1);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
606 else {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
607 w->Write (DH_DROP);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
608 w->Write (DH_GOTO);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
609 w->AddReference (SCOPE(0).mark1);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
610 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
611
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
612 // Go through all of the buffers we
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
613 // recorded down and write them.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
614 for (unsigned int u = 0; u < MAX_CASE; u++) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
615 if (!SCOPE(0).casebuffers[u])
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
616 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
617
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
618 w->MoveMark (SCOPE(0).casemarks[u]);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
619 w->WriteBuffer (SCOPE(0).casebuffers[u]);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
620 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
621
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
622 // Move the closing mark here
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
623 w->MoveMark (SCOPE(0).mark1);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
624 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
625 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
626 case SCOPETYPE_UNKNOWN:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
627 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
628 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
629
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
630 // Descend down the stack
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
631 g_ScopeCursor--;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
632 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
633 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
634
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
635 int dataheader = (g_CurMode == MODE_EVENT) ? DH_ENDEVENT :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
636 (g_CurMode == MODE_MAINLOOP) ? DH_ENDMAINLOOP :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
637 (g_CurMode == MODE_ONENTER) ? DH_ENDONENTER :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
638 (g_CurMode == MODE_ONEXIT) ? DH_ENDONEXIT : -1;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
639
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
640 if (dataheader == -1)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
641 ParserError ("unexpected `}`");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
642
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
643 // Data header must be written before mode is changed because
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
644 // onenter and mainloop go into special buffers, and we want
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
645 // the closing data headers into said buffers too.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
646 w->Write (dataheader);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
647 g_CurMode = MODE_TOPLEVEL;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
648
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
649 if (PeekNext() == ";")
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
650 MustNext (";");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
651 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
652 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
653
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
654 // Check if it's a command
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
655 CommandDef* comm = FindCommand (token);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
656 if (comm) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
657 w->GetCurrentBuffer()->Merge (ParseCommand (comm));
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
658 MustNext (";");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
659 continue;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
660 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
661
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
662 // ============================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
663 // If nothing else, parse it as a statement
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
664 DataBuffer* b = ParseStatement (w);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
665 if (!b)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
666 ParserError ("unknown token `%s`", token.chars());
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
667
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
668 w->WriteBuffer (b);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
669 MustNext (";");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
670 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
671
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
672 // ===============================================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
673 // Script file ended. Do some last checks and write the last things to main buffer
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
674 if (g_CurMode != MODE_TOPLEVEL)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
675 ParserError ("script did not end at top level; did you forget a `}`?");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
676
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
677 // stateSpawn must be defined!
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
678 if (!g_stateSpawnDefined)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
679 ParserError ("script must have a state named `stateSpawn`!");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
680
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
681 for (int i = 0; i < MAX_MARKS; i++)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
682 if (g_UndefinedLabels[i])
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
683 ParserError ("label `%s` is referenced via `goto` but isn't defined\n", g_UndefinedLabels[i]->chars());
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
684
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
685 // Dump the last state's onenter and mainloop
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
686 w->WriteBuffers ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
687
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
688 // String table
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
689 w->WriteStringTable ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
690 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
691
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
692 // ============================================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
693 // Parses a command call
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
694 DataBuffer* ScriptReader::ParseCommand (CommandDef* comm) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
695 DataBuffer* r = new DataBuffer(64);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
696 if (g_CurMode == MODE_TOPLEVEL)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
697 ParserError ("command call at top level");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
698
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
699 MustNext ("(");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
700 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
701
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
702 int curarg = 0;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
703 while (1) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
704 if (token == ")") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
705 if (curarg < comm->numargs)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
706 ParserError ("too few arguments passed to %s\n\tprototype: %s",
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
707 comm->name.chars(), GetCommandPrototype (comm).chars());
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
708 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
709 curarg++;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
710 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
711
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
712 if (curarg >= comm->maxargs)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
713 ParserError ("too many arguments passed to %s\n\tprototype: %s",
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
714 comm->name.chars(), GetCommandPrototype (comm).chars());
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
715
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
716 r->Merge (ParseExpression (comm->argtypes[curarg]));
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
717 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
718
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
719 if (curarg < comm->numargs - 1) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
720 MustThis (",");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
721 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
722 } else if (curarg < comm->maxargs - 1) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
723 // Can continue, but can terminate as well.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
724 if (token == ")") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
725 curarg++;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
726 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
727 } else {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
728 MustThis (",");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
729 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
730 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
731 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
732
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
733 curarg++;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
734 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
735
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
736 // If the script skipped any optional arguments, fill in defaults.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
737 while (curarg < comm->maxargs) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
738 r->Write (DH_PUSHNUMBER);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
739 r->Write (comm->defvals[curarg]);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
740 curarg++;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
741 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
742
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
743 r->Write (DH_COMMAND);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
744 r->Write (comm->number);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
745 r->Write (comm->maxargs);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
746
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
747 return r;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
748 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
749
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
750 // ============================================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
751 // Is the given operator an assignment operator?
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
752 static bool IsAssignmentOperator (int oper) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
753 switch (oper) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
754 case OPER_ASSIGNADD:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
755 case OPER_ASSIGNSUB:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
756 case OPER_ASSIGNMUL:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
757 case OPER_ASSIGNDIV:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
758 case OPER_ASSIGNMOD:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
759 case OPER_ASSIGNLEFTSHIFT:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
760 case OPER_ASSIGNRIGHTSHIFT:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
761 case OPER_ASSIGN:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
762 return true;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
763 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
764 return false;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
765 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
766
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
767 // ============================================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
768 // Finds an operator's corresponding dataheader
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
769 static word DataHeaderByOperator (ScriptVar* var, int oper) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
770 if (IsAssignmentOperator (oper)) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
771 if (!var)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
772 error ("operator %d requires left operand to be a variable\n", oper);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
773
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
774 // TODO: At the moment, vars only are global
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
775 // OPER_ASSIGNLEFTSHIFT and OPER_ASSIGNRIGHTSHIFT do not
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
776 // have data headers, instead they are expanded out in
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
777 // the operator parser
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
778 switch (oper) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
779 case OPER_ASSIGNADD: return DH_ADDGLOBALVAR;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
780 case OPER_ASSIGNSUB: return DH_SUBGLOBALVAR;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
781 case OPER_ASSIGNMUL: return DH_MULGLOBALVAR;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
782 case OPER_ASSIGNDIV: return DH_DIVGLOBALVAR;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
783 case OPER_ASSIGNMOD: return DH_MODGLOBALVAR;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
784 case OPER_ASSIGN: return DH_ASSIGNGLOBALVAR;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
785 default: error ("bad assignment operator!!\n");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
786 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
787 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
788
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
789 switch (oper) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
790 case OPER_ADD: return DH_ADD;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
791 case OPER_SUBTRACT: return DH_SUBTRACT;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
792 case OPER_MULTIPLY: return DH_MULTIPLY;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
793 case OPER_DIVIDE: return DH_DIVIDE;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
794 case OPER_MODULUS: return DH_MODULUS;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
795 case OPER_EQUALS: return DH_EQUALS;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
796 case OPER_NOTEQUALS: return DH_NOTEQUALS;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
797 case OPER_LESSTHAN: return DH_LESSTHAN;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
798 case OPER_GREATERTHAN: return DH_GREATERTHAN;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
799 case OPER_LESSTHANEQUALS: return DH_LESSTHANEQUALS;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
800 case OPER_GREATERTHANEQUALS: return DH_GREATERTHANEQUALS;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
801 case OPER_LEFTSHIFT: return DH_LSHIFT;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
802 case OPER_RIGHTSHIFT: return DH_RSHIFT;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
803 case OPER_OR: return DH_ORLOGICAL;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
804 case OPER_AND: return DH_ANDLOGICAL;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
805 case OPER_BITWISEOR: return DH_ORBITWISE;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
806 case OPER_BITWISEEOR: return DH_EORBITWISE;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
807 case OPER_BITWISEAND: return DH_ANDBITWISE;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
808 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
809
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
810 error ("DataHeaderByOperator: couldn't find dataheader for operator %d!\n", oper);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
811 return 0;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
812 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
813
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
814 // ============================================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
815 // Parses an expression, potentially recursively
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
816 DataBuffer* ScriptReader::ParseExpression (type_e reqtype) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
817 DataBuffer* retbuf = new DataBuffer (64);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
818
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
819 // Parse first operand
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
820 retbuf->Merge (ParseExprValue (reqtype));
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
821
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
822 // Parse any and all operators we get
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
823 int oper;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
824 while ((oper = ParseOperator (true)) != -1) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
825 // We peeked the operator, move forward now
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
826 Next ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
827
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
828 // Can't be an assignement operator, those belong in assignments.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
829 if (IsAssignmentOperator (oper))
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
830 ParserError ("assignment operator inside expression");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
831
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
832 // Parse the right operand.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
833 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
834 DataBuffer* rb = ParseExprValue (reqtype);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
835
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
836 if (oper == OPER_TERNARY) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
837 // Ternary operator requires - naturally - a third operand.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
838 MustNext (":");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
839 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
840 DataBuffer* tb = ParseExprValue (reqtype);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
841
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
842 // It also is handled differently: there isn't a dataheader for ternary
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
843 // operator. Instead, we abuse PUSHNUMBER and IFNOTGOTO for this.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
844 // Behold, big block of writing madness! :P
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
845 int mark1 = retbuf->AddMark (""); // start of "else" case
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
846 int mark2 = retbuf->AddMark (""); // end of expression
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
847 retbuf->Write (DH_IFNOTGOTO); // if the first operand (condition)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
848 retbuf->AddMarkReference (mark1); // didn't eval true, jump into mark1
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
849 retbuf->Merge (rb); // otherwise, perform second operand (true case)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
850 retbuf->Write (DH_GOTO); // afterwards, jump to the end, which is
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
851 retbuf->AddMarkReference (mark2); // marked by mark2.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
852 retbuf->MoveMark (mark1); // move mark1 at the end of the true case
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
853 retbuf->Merge (tb); // perform third operand (false case)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
854 retbuf->MoveMark (mark2); // move the ending mark2 here
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
855 } else {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
856 // Write to buffer
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
857 retbuf->Merge (rb);
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
858 retbuf->Write (DataHeaderByOperator (null, oper));
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
859 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
860 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
861
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
862 return retbuf;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
863 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
864
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
865 // ============================================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
866 // Parses an operator string. Returns the operator number code.
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
867 #define ISNEXT(C) (PeekNext (peek ? 1 : 0) == C)
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
868 int ScriptReader::ParseOperator (bool peek) {
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
869 string oper;
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
870 if (peek)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
871 oper += PeekNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
872 else
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
873 oper += token;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
874
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
875 if (-oper == "strlen")
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
876 return OPER_STRLEN;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
877
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
878 // Check one-char operators
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
879 bool equalsnext = ISNEXT ("=");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
880
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
881 int o = (oper == "=" && !equalsnext) ? OPER_ASSIGN :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
882 (oper == ">" && !equalsnext && !ISNEXT (">")) ? OPER_GREATERTHAN :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
883 (oper == "<" && !equalsnext && !ISNEXT ("<")) ? OPER_LESSTHAN :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
884 (oper == "&" && !ISNEXT ("&")) ? OPER_BITWISEAND :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
885 (oper == "|" && !ISNEXT ("|")) ? OPER_BITWISEOR :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
886 (oper == "+" && !equalsnext) ? OPER_ADD :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
887 (oper == "-" && !equalsnext) ? OPER_SUBTRACT :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
888 (oper == "*" && !equalsnext) ? OPER_MULTIPLY :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
889 (oper == "/" && !equalsnext) ? OPER_DIVIDE :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
890 (oper == "%" && !equalsnext) ? OPER_MODULUS :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
891 (oper == "^") ? OPER_BITWISEEOR :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
892 (oper == "?") ? OPER_TERNARY :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
893 -1;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
894
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
895 if (o != -1) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
896 return o;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
897 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
898
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
899 // Two-char operators
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
900 oper += PeekNext (peek ? 1 : 0);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
901 equalsnext = PeekNext (peek ? 2 : 1) == ("=");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
902
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
903 o = (oper == "+=") ? OPER_ASSIGNADD :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
904 (oper == "-=") ? OPER_ASSIGNSUB :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
905 (oper == "*=") ? OPER_ASSIGNMUL :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
906 (oper == "/=") ? OPER_ASSIGNDIV :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
907 (oper == "%=") ? OPER_ASSIGNMOD :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
908 (oper == "==") ? OPER_EQUALS :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
909 (oper == "!=") ? OPER_NOTEQUALS :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
910 (oper == ">=") ? OPER_GREATERTHANEQUALS :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
911 (oper == "<=") ? OPER_LESSTHANEQUALS :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
912 (oper == "&&") ? OPER_AND :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
913 (oper == "||") ? OPER_OR :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
914 (oper == "<<" && !equalsnext) ? OPER_LEFTSHIFT :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
915 (oper == ">>" && !equalsnext) ? OPER_RIGHTSHIFT :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
916 -1;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
917
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
918 if (o != -1) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
919 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
920 return o;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
921 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
922
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
923 // Three-char opers
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
924 oper += PeekNext (peek ? 2 : 1);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
925 o = oper == "<<=" ? OPER_ASSIGNLEFTSHIFT :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
926 oper == ">>=" ? OPER_ASSIGNRIGHTSHIFT :
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
927 -1;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
928
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
929 if (o != -1) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
930 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
931 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
932 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
933
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
934 return o;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
935 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
936
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
937 // ============================================================================
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
938 string ScriptReader::ParseFloat () {
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
939 MustNumber (true);
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
940 string floatstring = token;
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
941
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
942 // Go after the decimal point
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
943 if (PeekNext () == ".") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
944 Next (".");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
945 MustNumber (false);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
946 floatstring += ".";
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
947 floatstring += token;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
948 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
949
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
950 return floatstring;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
951 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
952
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
953 // ============================================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
954 // Parses a value in the expression and returns the data needed to push
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
955 // it, contained in a data buffer. A value can be either a variable, a command,
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
956 // a literal or an expression.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
957 DataBuffer* ScriptReader::ParseExprValue (type_e reqtype) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
958 DataBuffer* b = new DataBuffer(16);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
959
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
960 ScriptVar* g;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
961
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
962 // Prefixing "!" means negation.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
963 bool negate = (token == "!");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
964 if (negate) // Jump past the "!"
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
965 Next ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
966
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
967 // Handle strlen
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
968 if (token == "strlen") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
969 MustNext ("(");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
970 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
971
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
972 // By this token we should get a string constant.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
973 constinfo_t* constant = FindConstant (token);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
974 if (!constant || constant->type != TYPE_STRING)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
975 ParserError ("strlen only works with const str");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
976
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
977 if (reqtype != TYPE_INT)
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
978 ParserError ("strlen returns int but %s is expected\n", GetTypeName (reqtype).c_str());
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
979
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
980 b->Write (DH_PUSHNUMBER);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
981 b->Write (constant->val.len ());
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
982
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
983 MustNext (")");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
984 } else if (token == "(") {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
985 // Expression
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
986 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
987 DataBuffer* c = ParseExpression (reqtype);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
988 b->Merge (c);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
989 MustNext (")");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
990 } else if (CommandDef* comm = FindCommand (token)) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
991 delete b;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
992
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
993 // Command
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
994 if (reqtype && comm->returnvalue != reqtype)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
995 ParserError ("%s returns an incompatible data type", comm->name.chars());
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
996 b = ParseCommand (comm);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
997 } else if (constinfo_t* constant = FindConstant (token)) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
998 // Type check
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
999 if (reqtype != constant->type)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1000 ParserError ("constant `%s` is %s, expression requires %s\n",
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
1001 constant->name.c_str(), GetTypeName (constant->type).c_str(),
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
1002 GetTypeName (reqtype).c_str());
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1003
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1004 switch (constant->type) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1005 case TYPE_BOOL:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1006 case TYPE_INT:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1007 b->Write (DH_PUSHNUMBER);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1008 b->Write (atoi (constant->val));
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1009 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1010 case TYPE_STRING:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1011 b->WriteString (constant->val);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1012 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1013 case TYPE_VOID:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1014 case TYPE_UNKNOWN:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1015 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1016 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1017 } else if ((g = FindGlobalVariable (token))) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1018 // Global variable
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1019 b->Write (DH_PUSHGLOBALVAR);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1020 b->Write (g->index);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1021 } else {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1022 // If nothing else, check for literal
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1023 switch (reqtype) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1024 case TYPE_VOID:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1025 case TYPE_UNKNOWN:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1026 ParserError ("unknown identifier `%s` (expected keyword, function or variable)", token.chars());
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1027 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1028 case TYPE_BOOL:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1029 case TYPE_INT: {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1030 MustNumber (true);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1031
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1032 // All values are written unsigned - thus we need to write the value's
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1033 // absolute value, followed by an unary minus for negatives.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1034 b->Write (DH_PUSHNUMBER);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1035
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1036 long v = atol (token);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1037 b->Write (static_cast<word> (abs (v)));
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1038 if (v < 0)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1039 b->Write (DH_UNARYMINUS);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1040 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1041 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1042 case TYPE_STRING:
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1043 // PushToStringTable either returns the string index of the
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1044 // string if it finds it in the table, or writes it to the
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1045 // table and returns it index if it doesn't find it there.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1046 MustString (true);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1047 b->WriteString (token);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1048 break;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1049 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1050 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1051
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1052 // Negate it now if desired
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1053 if (negate)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1054 b->Write (DH_NEGATELOGICAL);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1055
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1056 return b;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1057 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1058
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1059 // ============================================================================
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1060 // Parses an assignment. An assignment starts with a variable name, followed
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1061 // by an assignment operator, followed by an expression value. Expects current
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1062 // token to be the name of the variable, and expects the variable to be given.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1063 DataBuffer* ScriptReader::ParseAssignment (ScriptVar* var) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1064 bool global = !var->statename.len ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1065
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1066 // Get an operator
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1067 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1068 int oper = ParseOperator ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1069 if (!IsAssignmentOperator (oper))
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1070 ParserError ("expected assignment operator");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1071
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1072 if (g_CurMode == MODE_TOPLEVEL) // TODO: lift this restriction
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1073 ParserError ("can't alter variables at top level");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1074
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1075 // Parse the right operand
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1076 MustNext ();
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1077 DataBuffer* retbuf = new DataBuffer;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1078 DataBuffer* expr = ParseExpression (var->type);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1079
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1080 // <<= and >>= do not have data headers. Solution: expand them.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1081 // a <<= b -> a = a << b
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1082 // a >>= b -> a = a >> b
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1083 if (oper == OPER_ASSIGNLEFTSHIFT || oper == OPER_ASSIGNRIGHTSHIFT) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1084 retbuf->Write (global ? DH_PUSHGLOBALVAR : DH_PUSHLOCALVAR);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1085 retbuf->Write (var->index);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1086 retbuf->Merge (expr);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1087 retbuf->Write ((oper == OPER_ASSIGNLEFTSHIFT) ? DH_LSHIFT : DH_RSHIFT);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1088 retbuf->Write (global ? DH_ASSIGNGLOBALVAR : DH_ASSIGNLOCALVAR);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1089 retbuf->Write (var->index);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1090 } else {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1091 retbuf->Merge (expr);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1092 long dh = DataHeaderByOperator (var, oper);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1093 retbuf->Write (dh);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1094 retbuf->Write (var->index);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1095 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1096
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1097 return retbuf;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1098 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1099
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1100 void ScriptReader::PushScope () {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1101 g_ScopeCursor++;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1102 if (g_ScopeCursor >= MAX_SCOPE)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1103 ParserError ("too deep scope");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1104
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1105 ScopeInfo* info = &SCOPE(0);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1106 info->type = SCOPETYPE_UNKNOWN;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1107 info->mark1 = 0;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1108 info->mark2 = 0;
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
1109 info->buffer1 = null;
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1110 info->casecursor = -1;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1111 for (int i = 0; i < MAX_CASE; i++) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1112 info->casemarks[i] = MAX_MARKS;
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
1113 info->casebuffers[i] = null;
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1114 info->casenumbers[i] = -1;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1115 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1116 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1117
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1118 DataBuffer* ScriptReader::ParseStatement (ObjWriter* w) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1119 if (FindConstant (token)) // There should not be constants here.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1120 ParserError ("invalid use for constant\n");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1121
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1122 // If it's a variable, expect assignment.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1123 if (ScriptVar* var = FindGlobalVariable (token))
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1124 return ParseAssignment (var);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1125
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
1126 return null;
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1127 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1128
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1129 void ScriptReader::AddSwitchCase (ObjWriter* w, DataBuffer* b) {
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1130 ScopeInfo* info = &SCOPE(0);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1131
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1132 info->casecursor++;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1133 if (info->casecursor >= MAX_CASE)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1134 ParserError ("too many cases in one switch");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1135
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1136 // Init a mark for the case buffer
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1137 int m = w->AddMark ("");
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1138 info->casemarks[info->casecursor] = m;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1139
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1140 // Add a reference to the mark. "case" and "default" both
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1141 // add the necessary bytecode before the reference.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1142 if (b)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1143 b->AddMarkReference (m);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1144 else
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1145 w->AddReference (m);
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1146
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1147 // Init a buffer for the case block and tell the object
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1148 // writer to record all written data to it.
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1149 info->casebuffers[info->casecursor] = w->SwitchBuffer = new DataBuffer;
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1150 }
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1151
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
1152 constinfo_t* FindConstant (string token) {
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1153 for (uint i = 0; i < g_ConstInfo.size(); i++)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1154 if (g_ConstInfo[i].name == token)
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1155 return &g_ConstInfo[i];
72
03e4d9db3fd9 - major refactoring begins
Teemu Piippo <crimsondusk64@gmail.com>
parents: 71
diff changeset
1156 return null;
71
11f23fabf8a6 - moved sources to src/, migrated to cmake
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1157 }

mercurial