src/parser.cc

Sun, 26 Jan 2014 23:18:48 +0200

author
Teemu Piippo <crimsondusk64@gmail.com>
date
Sun, 26 Jan 2014 23:18:48 +0200
changeset 86
43fe4be38a58
parent 85
264a61e9eba0
child 87
8f65914e7046
permissions
-rw-r--r--

- merged object writer into parser

75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1 /*
85
264a61e9eba0 - use the Skulltag 97c2 license which is slightly differently worded
Teemu Piippo <crimsondusk64@gmail.com>
parents: 82
diff changeset
2 Copyright 2012-2014 Santeri Piippo
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
3 All rights reserved.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
4
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
5 Redistribution and use in source and binary forms, with or without
85
264a61e9eba0 - use the Skulltag 97c2 license which is slightly differently worded
Teemu Piippo <crimsondusk64@gmail.com>
parents: 82
diff changeset
6 modification, are permitted provided that the following conditions
264a61e9eba0 - use the Skulltag 97c2 license which is slightly differently worded
Teemu Piippo <crimsondusk64@gmail.com>
parents: 82
diff changeset
7 are met:
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
8
85
264a61e9eba0 - use the Skulltag 97c2 license which is slightly differently worded
Teemu Piippo <crimsondusk64@gmail.com>
parents: 82
diff changeset
9 1. Redistributions of source code must retain the above copyright
264a61e9eba0 - use the Skulltag 97c2 license which is slightly differently worded
Teemu Piippo <crimsondusk64@gmail.com>
parents: 82
diff changeset
10 notice, this list of conditions and the following disclaimer.
264a61e9eba0 - use the Skulltag 97c2 license which is slightly differently worded
Teemu Piippo <crimsondusk64@gmail.com>
parents: 82
diff changeset
11 2. Redistributions in binary form must reproduce the above copyright
264a61e9eba0 - use the Skulltag 97c2 license which is slightly differently worded
Teemu Piippo <crimsondusk64@gmail.com>
parents: 82
diff changeset
12 notice, this list of conditions and the following disclaimer in the
264a61e9eba0 - use the Skulltag 97c2 license which is slightly differently worded
Teemu Piippo <crimsondusk64@gmail.com>
parents: 82
diff changeset
13 documentation and/or other materials provided with the distribution.
264a61e9eba0 - use the Skulltag 97c2 license which is slightly differently worded
Teemu Piippo <crimsondusk64@gmail.com>
parents: 82
diff changeset
14 3. The name of the author may not be used to endorse or promote products
264a61e9eba0 - use the Skulltag 97c2 license which is slightly differently worded
Teemu Piippo <crimsondusk64@gmail.com>
parents: 82
diff changeset
15 derived from this software without specific prior written permission.
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
16
85
264a61e9eba0 - use the Skulltag 97c2 license which is slightly differently worded
Teemu Piippo <crimsondusk64@gmail.com>
parents: 82
diff changeset
17 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
264a61e9eba0 - use the Skulltag 97c2 license which is slightly differently worded
Teemu Piippo <crimsondusk64@gmail.com>
parents: 82
diff changeset
18 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
264a61e9eba0 - use the Skulltag 97c2 license which is slightly differently worded
Teemu Piippo <crimsondusk64@gmail.com>
parents: 82
diff changeset
19 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
264a61e9eba0 - use the Skulltag 97c2 license which is slightly differently worded
Teemu Piippo <crimsondusk64@gmail.com>
parents: 82
diff changeset
20 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
264a61e9eba0 - use the Skulltag 97c2 license which is slightly differently worded
Teemu Piippo <crimsondusk64@gmail.com>
parents: 82
diff changeset
21 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
264a61e9eba0 - use the Skulltag 97c2 license which is slightly differently worded
Teemu Piippo <crimsondusk64@gmail.com>
parents: 82
diff changeset
22 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
264a61e9eba0 - use the Skulltag 97c2 license which is slightly differently worded
Teemu Piippo <crimsondusk64@gmail.com>
parents: 82
diff changeset
23 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
264a61e9eba0 - use the Skulltag 97c2 license which is slightly differently worded
Teemu Piippo <crimsondusk64@gmail.com>
parents: 82
diff changeset
24 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
264a61e9eba0 - use the Skulltag 97c2 license which is slightly differently worded
Teemu Piippo <crimsondusk64@gmail.com>
parents: 82
diff changeset
25 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
264a61e9eba0 - use the Skulltag 97c2 license which is slightly differently worded
Teemu Piippo <crimsondusk64@gmail.com>
parents: 82
diff changeset
26 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
27 */
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
28
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
29 #include "parser.h"
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
30 #include "events.h"
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
31 #include "commands.h"
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
32 #include "stringtable.h"
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
33 #include "variables.h"
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
34 #include "containers.h"
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
35 #include "lexer.h"
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
36 #include "data_buffer.h"
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
37
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
38 #define SCOPE(n) (m_scope_stack[m_scope_cursor - n])
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
39
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
40 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
41 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
42 botscript_parser::botscript_parser() :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
43 m_lx (new lexer) {}
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
44
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
45 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
46 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
47 botscript_parser::~botscript_parser()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
48 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
49 delete m_lx;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
50 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
51
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
52 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
53 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
54 void botscript_parser::check_toplevel()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
55 {
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
56 if (m_current_mode != MODE_TOPLEVEL)
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
57 error ("%1-statements may only be defined at top level!", token_string());
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
58 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
59
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
60 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
61 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
62 void botscript_parser::check_not_toplevel()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
63 {
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
64 if (m_current_mode == MODE_TOPLEVEL)
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
65 error ("%1-statements must not be defined at top level!", token_string());
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
66 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
67
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
68 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
69 // Main parser code. Begins read of the script file, checks the syntax of it
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
70 // and writes the data to the object file via Objwriter - which also takes care
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
71 // of necessary buffering so stuff is written in the correct order.
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
72 void botscript_parser::parse_botscript (string file_name)
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
73 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
74 // Lex and preprocess the file
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
75 m_lx->process_file (file_name);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
76
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
77 m_current_mode = MODE_TOPLEVEL;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
78 m_num_states = 0;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
79 m_num_events = 0;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
80 m_scope_cursor = 0;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
81 m_state_spawn_defined = false;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
82 m_got_main_loop = false;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
83 m_if_expression = null;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
84 m_can_else = false;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
85
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
86 // Zero the entire block stack first
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
87 // TODO: this shouldn't be necessary
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
88 for (int i = 0; i < MAX_SCOPE; i++)
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
89 ZERO (m_scope_stack[i]);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
90
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
91 while (m_lx->get_next())
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
92 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
93 // Check if else is potentically valid
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
94 if (token_is (tk_else) && !m_can_else)
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
95 error ("else without preceding if");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
96
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
97 if (!token_is (tk_else))
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
98 m_can_else = false;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
99
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
100 switch (m_lx->get_token()->type)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
101 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
102 case tk_state:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
103 parse_state_block();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
104 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
105
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
106 case tk_event:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
107 parse_event_block();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
108 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
109
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
110 case tk_mainloop:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
111 parse_mainloop();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
112 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
113
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
114 case tk_onenter:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
115 case tk_onexit:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
116 parse_on_enter_exit();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
117 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
118
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
119 case tk_int:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
120 case tk_str:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
121 case tk_void:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
122 parse_variable_declaration();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
123 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
124
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
125 case tk_goto:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
126 parse_goto();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
127 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
128
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
129 case tk_if:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
130 parse_if();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
131 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
132
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
133 case tk_else:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
134 parse_else();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
135 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
136
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
137 case tk_while:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
138 parse_while_block();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
139 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
140
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
141 case tk_for:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
142 parse_for_block();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
143 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
144
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
145 case tk_do:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
146 parse_do_block();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
147 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
148
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
149 case tk_switch:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
150 parse_switch_block();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
151 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
152
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
153 case tk_case:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
154 parse_switch_case();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
155 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
156
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
157 case tk_default:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
158 parse_switch_default();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
159 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
160
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
161 case tk_break:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
162 parse_break();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
163 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
164
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
165 case tk_continue:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
166 parse_continue();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
167 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
168
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
169 case tk_brace_end:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
170 parse_block_end();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
171 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
172
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
173 case tk_const:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
174 parse_const();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
175 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
176
82
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
177 case tk_eventdef:
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
178 parse_eventdef();
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
179 break;
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
180
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
181 case tk_funcdef:
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
182 parse_funcdef();
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
183 break;
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
184
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
185 default:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
186 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
187 // Check for labels
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
188 lexer::token next;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
189
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
190 if (token_is (tk_symbol) &&
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
191 m_lx->peek_next (&next) &&
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
192 next.type == tk_colon)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
193 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
194 parse_label();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
195 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
196 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
197
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
198 // Check if it's a command
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
199 command_info* comm = find_command_by_name (token_string());
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
200
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
201 if (comm)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
202 {
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
203 buffer()->merge_and_destroy (parse_command (comm));
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
204 m_lx->must_get_next (tk_semicolon);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
205 continue;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
206 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
207
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
208 // If nothing else, parse it as a statement
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
209 data_buffer* b = parse_statement();
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
210
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
211 if (!b)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
212 error ("unknown token `%1`", token_string());
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
213
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
214 buffer()->merge_and_destroy (b);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
215 m_lx->must_get_next (tk_semicolon);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
216 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
217 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
218 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
219 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
220
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
221 // ===============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
222 // Script file ended. Do some last checks and write the last things to main buffer
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
223 if (m_current_mode != MODE_TOPLEVEL)
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
224 error ("script did not end at top level; a `}` is missing somewhere");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
225
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
226 // stateSpawn must be defined!
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
227 if (!m_state_spawn_defined)
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
228 error ("script must have a state named `stateSpawn`!");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
229
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
230 // Ensure no goto target is left undefined
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
231 if (m_undefined_labels.is_empty() == false)
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
232 {
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
233 string_list names;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
234
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
235 for (undefined_label& undf : m_undefined_labels)
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
236 names << undf.name;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
237
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
238 error ("labels `%1` are referenced via `goto` but are not defined\n", names);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
239 }
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
240
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
241 // Dump the last state's onenter and mainloop
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
242 write_member_buffers();
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
243
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
244 // String table
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
245 write_string_table();
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
246 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
247
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
248 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
249 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
250 void botscript_parser::parse_state_block()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
251 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
252 check_toplevel();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
253 m_lx->must_get_next (tk_string);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
254 string statename = token_string();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
255
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
256 // State name must be a word.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
257 if (statename.first (" ") != -1)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
258 error ("state name must be a single word, got `%1`", statename);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
259
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
260 // stateSpawn is special - it *must* be defined. If we
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
261 // encountered it, then mark down that we have it.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
262 if (-statename == "statespawn")
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
263 m_state_spawn_defined = true;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
264
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
265 // Must end in a colon
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
266 m_lx->must_get_next (tk_colon);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
267
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
268 // write the previous state's onenter and
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
269 // mainloop buffers to file now
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
270 if (m_current_state.is_empty() == false)
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
271 write_member_buffers();
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
272
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
273 buffer()->write_dword (dh_state_name);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
274 buffer()->write_string (statename);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
275 buffer()->write_dword (dh_state_index);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
276 buffer()->write_dword (m_num_states);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
277
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
278 m_num_states++;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
279 m_current_state = statename;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
280 m_got_main_loop = false;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
281 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
282
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
283 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
284 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
285 void botscript_parser::parse_event_block()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
286 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
287 check_toplevel();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
288 m_lx->must_get_next (tk_string);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
289
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
290 event_info* e = find_event_by_name (token_string());
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
291
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
292 if (!e)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
293 error ("bad event, got `%1`\n", token_string());
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
294
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
295 m_lx->must_get_next (tk_brace_start);
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
296 m_current_mode = MODE_EVENT;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
297 buffer()->write_dword (dh_event);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
298 buffer()->write_dword (e->number);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
299 m_num_events++;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
300 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
301
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
302 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
303 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
304 void botscript_parser::parse_mainloop()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
305 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
306 check_toplevel();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
307 m_lx->must_get_next (tk_brace_start);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
308
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
309 m_current_mode = MODE_MAINLOOP;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
310 m_main_loop_buffer->write_dword (dh_main_loop);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
311 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
312
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
313 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
314 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
315 void botscript_parser::parse_on_enter_exit()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
316 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
317 check_toplevel();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
318 bool onenter = (token_is (tk_onenter));
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
319 m_lx->must_get_next (tk_brace_start);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
320
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
321 m_current_mode = onenter ? MODE_ONENTER : MODE_ONEXIT;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
322 buffer()->write_dword (onenter ? dh_on_enter : dh_on_exit);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
323 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
324
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
325 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
326 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
327 void botscript_parser::parse_variable_declaration()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
328 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
329 // For now, only globals are supported
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
330 if (m_current_mode != MODE_TOPLEVEL || m_current_state.is_empty() == false)
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
331 error ("variables must only be global for now");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
332
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
333 type_e type = (token_is (tk_int)) ? TYPE_INT :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
334 (token_is (tk_str)) ? TYPE_STRING :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
335 TYPE_BOOL;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
336
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
337 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
338 string varname = token_string();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
339
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
340 // Var name must not be a number
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
341 if (varname.is_numeric())
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
342 error ("variable name must not be a number");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
343
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
344 script_variable* var = declare_global_variable (type, varname);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
345 (void) var;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
346 m_lx->must_get_next (tk_semicolon);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
347 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
348
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
349 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
350 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
351 void botscript_parser::parse_goto()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
352 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
353 check_not_toplevel();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
354
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
355 // Get the name of the label
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
356 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
357
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
358 // Find the mark this goto statement points to
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
359 string target = token_string();
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
360 byte_mark* mark = buffer()->find_mark_by_name (target);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
361
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
362 // If not set, define it
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
363 if (!mark)
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
364 {
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
365 undefined_label undf;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
366 undf.name = target;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
367 undf.target = buffer()->add_mark (target);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
368 m_undefined_labels << undf;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
369 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
370
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
371 // Add a reference to the mark.
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
372 buffer()->write_dword (dh_goto);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
373 buffer()->add_reference (mark);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
374 m_lx->must_get_next (tk_semicolon);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
375 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
376
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
377 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
378 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
379 void botscript_parser::parse_if()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
380 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
381 check_not_toplevel();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
382 push_scope();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
383
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
384 // Condition
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
385 m_lx->must_get_next (tk_paren_start);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
386
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
387 // Read the expression and write it.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
388 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
389 data_buffer* c = parse_expression (TYPE_INT);
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
390 buffer()->merge_and_destroy (c);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
391
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
392 m_lx->must_get_next (tk_paren_end);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
393 m_lx->must_get_next (tk_brace_start);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
394
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
395 // Add a mark - to here temporarily - and add a reference to it.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
396 // Upon a closing brace, the mark will be adjusted.
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
397 byte_mark* mark = buffer()->add_mark ("");
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
398
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
399 // Use dh_if_not_goto - if the expression is not true, we goto the mark
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
400 // we just defined - and this mark will be at the end of the scope block.
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
401 buffer()->write_dword (dh_if_not_goto);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
402 buffer()->add_reference (mark);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
403
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
404 // Store it
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
405 SCOPE (0).mark1 = mark;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
406 SCOPE (0).type = e_if_scope;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
407 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
408
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
409 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
410 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
411 void botscript_parser::parse_else()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
412 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
413 check_not_toplevel();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
414 m_lx->must_get_next (tk_brace_start);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
415
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
416 // Don't use PushScope as it resets the scope
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
417 m_scope_cursor++;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
418
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
419 if (m_scope_cursor >= MAX_SCOPE)
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
420 error ("too deep scope");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
421
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
422 if (SCOPE (0).type != e_if_scope)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
423 error ("else without preceding if");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
424
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
425 // write down to jump to the end of the else statement
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
426 // Otherwise we have fall-throughs
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
427 SCOPE (0).mark2 = buffer()->add_mark ("");
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
428
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
429 // Instruction to jump to the end after if block is complete
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
430 buffer()->write_dword (dh_goto);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
431 buffer()->add_reference (SCOPE (0).mark2);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
432
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
433 // Move the ifnot mark here and set type to else
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
434 buffer()->adjust_mark (SCOPE (0).mark1);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
435 SCOPE (0).type = e_else_scope;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
436 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
437
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
438 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
439 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
440 void botscript_parser::parse_while_block()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
441 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
442 check_not_toplevel();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
443 push_scope();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
444
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
445 // While loops need two marks - one at the start of the loop and one at the
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
446 // end. The condition is checked at the very start of the loop, if it fails,
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
447 // we use goto to skip to the end of the loop. At the end, we loop back to
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
448 // the beginning with a go-to statement.
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
449 byte_mark* mark1 = buffer()->add_mark (""); // start
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
450 byte_mark* mark2 = buffer()->add_mark (""); // end
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
451
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
452 // Condition
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
453 m_lx->must_get_next (tk_paren_start);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
454 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
455 data_buffer* expr = parse_expression (TYPE_INT);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
456 m_lx->must_get_next (tk_paren_end);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
457 m_lx->must_get_next (tk_brace_start);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
458
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
459 // write condition
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
460 buffer()->merge_and_destroy (expr);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
461
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
462 // Instruction to go to the end if it fails
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
463 buffer()->write_dword (dh_if_not_goto);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
464 buffer()->add_reference (mark2);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
465
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
466 // Store the needed stuff
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
467 SCOPE (0).mark1 = mark1;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
468 SCOPE (0).mark2 = mark2;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
469 SCOPE (0).type = e_while_scope;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
470 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
471
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
472 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
473 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
474 void botscript_parser::parse_for_block()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
475 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
476 check_not_toplevel();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
477 push_scope();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
478
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
479 // Initializer
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
480 m_lx->must_get_next (tk_paren_start);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
481 m_lx->must_get_next();
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
482 data_buffer* init = parse_statement();
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
483
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
484 if (!init)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
485 error ("bad statement for initializer of for");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
486
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
487 m_lx->must_get_next (tk_semicolon);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
488
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
489 // Condition
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
490 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
491 data_buffer* cond = parse_expression (TYPE_INT);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
492
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
493 if (!cond)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
494 error ("bad statement for condition of for");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
495
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
496 m_lx->must_get_next (tk_semicolon);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
497
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
498 // Incrementor
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
499 m_lx->must_get_next();
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
500 data_buffer* incr = parse_statement();
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
501
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
502 if (!incr)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
503 error ("bad statement for incrementor of for");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
504
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
505 m_lx->must_get_next (tk_paren_end);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
506 m_lx->must_get_next (tk_brace_start);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
507
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
508 // First, write out the initializer
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
509 buffer()->merge_and_destroy (init);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
510
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
511 // Init two marks
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
512 byte_mark* mark1 = buffer()->add_mark ("");
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
513 byte_mark* mark2 = buffer()->add_mark ("");
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
514
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
515 // Add the condition
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
516 buffer()->merge_and_destroy (cond);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
517 buffer()->write_dword (dh_if_not_goto);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
518 buffer()->add_reference (mark2);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
519
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
520 // Store the marks and incrementor
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
521 SCOPE (0).mark1 = mark1;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
522 SCOPE (0).mark2 = mark2;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
523 SCOPE (0).buffer1 = incr;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
524 SCOPE (0).type = e_for_scope;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
525 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
526
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
527 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
528 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
529 void botscript_parser::parse_do_block()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
530 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
531 check_not_toplevel();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
532 push_scope();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
533 m_lx->must_get_next (tk_brace_start);
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
534 SCOPE (0).mark1 = buffer()->add_mark ("");
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
535 SCOPE (0).type = e_do_scope;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
536 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
537
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
538 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
539 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
540 void botscript_parser::parse_switch_block()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
541 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
542 // This gets a bit tricky. switch is structured in the
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
543 // bytecode followingly:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
544 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
545 // (expression)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
546 // case a: goto casemark1
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
547 // case b: goto casemark2
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
548 // case c: goto casemark3
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
549 // goto mark1 // jump to end if no matches
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
550 // casemark1: ...
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
551 // casemark2: ...
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
552 // casemark3: ...
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
553 // mark1: // end mark
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
554
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
555 check_not_toplevel();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
556 push_scope();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
557 m_lx->must_get_next (tk_paren_start);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
558 m_lx->must_get_next();
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
559 buffer()->merge_and_destroy (parse_expression (TYPE_INT));
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
560 m_lx->must_get_next (tk_paren_end);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
561 m_lx->must_get_next (tk_brace_start);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
562 SCOPE (0).type = e_switch_scope;
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
563 SCOPE (0).mark1 = buffer()->add_mark (""); // end mark
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
564 SCOPE (0).buffer1 = null; // default header
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
565 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
566
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
567 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
568 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
569 void botscript_parser::parse_switch_case()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
570 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
571 // case is only allowed inside switch
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
572 if (SCOPE (0).type != e_switch_scope)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
573 error ("case label outside switch");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
574
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
575 // Get the literal (Zandronum does not support expressions here)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
576 m_lx->must_get_next (tk_number);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
577 int num = m_lx->get_token()->text.to_long();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
578 m_lx->must_get_next (tk_colon);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
579
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
580 for (int i = 0; i < MAX_CASE; i++)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
581 if (SCOPE (0).casenumbers[i] == num)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
582 error ("multiple case %d labels in one switch", num);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
583
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
584 // Write down the expression and case-go-to. This builds
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
585 // the case tree. The closing event will write the actual
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
586 // blocks and move the marks appropriately.
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
587 //
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
588 // AddSwitchCase will add the reference to the mark
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
589 // for the case block that this heralds, and takes care
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
590 // of buffering setup and stuff like that.
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
591 //
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
592 // We null the switch buffer for the case-go-to statement as
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
593 // we want it all under the switch, not into the case-buffers.
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
594 m_switch_buffer = null;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
595 buffer()->write_dword (dh_case_goto);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
596 buffer()->write_dword (num);
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
597 add_switch_case (null);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
598 SCOPE (0).casenumbers[SCOPE (0).casecursor] = num;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
599 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
600
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
601 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
602 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
603 void botscript_parser::parse_switch_default()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
604 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
605 if (SCOPE (0).type != e_switch_scope)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
606 error ("default label outside switch");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
607
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
608 if (SCOPE (0).buffer1)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
609 error ("multiple default labels in one switch");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
610
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
611 m_lx->must_get_next (tk_colon);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
612
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
613 // The default header is buffered into buffer1, since
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
614 // it has to be the last of the case headers
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
615 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
616 // Since the expression is pushed into the switch
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
617 // and is only popped when case succeeds, we have
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
618 // to pop it with dh_drop manually if we end up in
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
619 // a default.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
620 data_buffer* b = new data_buffer;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
621 SCOPE (0).buffer1 = b;
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
622 b->write_dword (dh_drop);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
623 b->write_dword (dh_goto);
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
624 add_switch_case (b);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
625 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
626
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
627 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
628 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
629 void botscript_parser::parse_break()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
630 {
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
631 if (!m_scope_cursor)
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
632 error ("unexpected `break`");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
633
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
634 buffer()->write_dword (dh_goto);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
635
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
636 // switch and if use mark1 for the closing point,
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
637 // for and while use mark2.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
638 switch (SCOPE (0).type)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
639 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
640 case e_if_scope:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
641 case e_switch_scope:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
642 {
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
643 buffer()->add_reference (SCOPE (0).mark1);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
644 } break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
645
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
646 case e_for_scope:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
647 case e_while_scope:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
648 {
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
649 buffer()->add_reference (SCOPE (0).mark2);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
650 } break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
651
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
652 default:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
653 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
654 error ("unexpected `break`");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
655 } break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
656 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
657
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
658 m_lx->must_get_next (tk_semicolon);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
659 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
660
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
661 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
662 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
663 void botscript_parser::parse_continue()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
664 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
665 m_lx->must_get_next (tk_semicolon);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
666
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
667 int curs;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
668 bool found = false;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
669
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
670 // Fall through the scope until we find a loop block
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
671 for (curs = m_scope_cursor; curs > 0 && !found; curs--)
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
672 {
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
673 switch (m_scope_stack[curs].type)
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
674 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
675 case e_for_scope:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
676 case e_while_scope:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
677 case e_do_scope:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
678 {
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
679 buffer()->write_dword (dh_goto);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
680 buffer()->add_reference (m_scope_stack[curs].mark1);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
681 found = true;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
682 } break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
683
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
684 default:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
685 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
686 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
687 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
688
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
689 // No loop blocks
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
690 if (!found)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
691 error ("`continue`-statement not inside a loop");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
692 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
693
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
694 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
695 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
696 void botscript_parser::parse_block_end()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
697 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
698 // Closing brace
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
699 // If we're in the block stack, we're descending down from it now
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
700 if (m_scope_cursor > 0)
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
701 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
702 switch (SCOPE (0).type)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
703 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
704 case e_if_scope:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
705 // Adjust the closing mark.
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
706 buffer()->adjust_mark (SCOPE (0).mark1);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
707
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
708 // We're returning from if, thus else can be next
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
709 m_can_else = true;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
710 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
711
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
712 case e_else_scope:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
713 // else instead uses mark1 for itself (so if expression
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
714 // fails, jump to else), mark2 means end of else
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
715 buffer()->adjust_mark (SCOPE (0).mark2);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
716 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
717
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
718 case e_for_scope:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
719 // write the incrementor at the end of the loop block
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
720 buffer()->merge_and_destroy (SCOPE (0).buffer1);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
721
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
722 // fall-thru
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
723 case e_while_scope:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
724 // write down the instruction to go back to the start of the loop
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
725 buffer()->write_dword (dh_goto);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
726 buffer()->add_reference (SCOPE (0).mark1);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
727
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
728 // Move the closing mark here since we're at the end of the while loop
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
729 buffer()->adjust_mark (SCOPE (0).mark2);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
730 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
731
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
732 case e_do_scope:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
733 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
734 m_lx->must_get_next (tk_while);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
735 m_lx->must_get_next (tk_paren_start);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
736 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
737 data_buffer* expr = parse_expression (TYPE_INT);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
738 m_lx->must_get_next (tk_paren_end);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
739 m_lx->must_get_next (tk_semicolon);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
740
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
741 // If the condition runs true, go back to the start.
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
742 buffer()->merge_and_destroy (expr);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
743 buffer()->write_dword (dh_if_goto);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
744 buffer()->add_reference (SCOPE (0).mark1);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
745 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
746 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
747
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
748 case e_switch_scope:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
749 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
750 // Switch closes. Move down to the record buffer of
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
751 // the lower block.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
752 if (SCOPE (1).casecursor != -1)
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
753 m_switch_buffer = SCOPE (1).casebuffers[SCOPE (1).casecursor];
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
754 else
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
755 m_switch_buffer = null;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
756
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
757 // If there was a default in the switch, write its header down now.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
758 // If not, write instruction to jump to the end of switch after
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
759 // the headers (thus won't fall-through if no case matched)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
760 if (SCOPE (0).buffer1)
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
761 buffer()->merge_and_destroy (SCOPE (0).buffer1);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
762 else
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
763 {
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
764 buffer()->write_dword (dh_drop);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
765 buffer()->write_dword (dh_goto);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
766 buffer()->add_reference (SCOPE (0).mark1);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
767 }
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
768
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
769 // Go through all of the buffers we
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
770 // recorded down and write them.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
771 for (int u = 0; u < MAX_CASE; u++)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
772 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
773 if (!SCOPE (0).casebuffers[u])
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
774 continue;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
775
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
776 buffer()->adjust_mark (SCOPE (0).casemarks[u]);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
777 buffer()->merge_and_destroy (SCOPE (0).casebuffers[u]);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
778 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
779
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
780 // Move the closing mark here
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
781 buffer()->adjust_mark (SCOPE (0).mark1);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
782 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
783 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
784
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
785 case e_unknown_scope:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
786 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
787 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
788
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
789 // Descend down the stack
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
790 m_scope_cursor--;
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
791 return;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
792 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
793
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
794 int dataheader = (m_current_mode == MODE_EVENT) ? dh_end_event :
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
795 (m_current_mode == MODE_MAINLOOP) ? dh_end_main_loop :
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
796 (m_current_mode == MODE_ONENTER) ? dh_end_on_enter :
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
797 (m_current_mode == MODE_ONEXIT) ? dh_end_on_exit : -1;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
798
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
799 if (dataheader == -1)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
800 error ("unexpected `}`");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
801
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
802 // Data header must be written before mode is changed because
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
803 // onenter and mainloop go into special buffers, and we want
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
804 // the closing data headers into said buffers too.
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
805 buffer()->write_dword (dataheader);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
806 m_current_mode = MODE_TOPLEVEL;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
807 m_lx->get_next (tk_semicolon);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
808 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
809
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
810 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
811 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
812 void botscript_parser::parse_const()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
813 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
814 constant_info info;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
815
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
816 // Get the type
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
817 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
818 string typestring = token_string();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
819 info.type = GetTypeByName (typestring);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
820
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
821 if (info.type == TYPE_UNKNOWN || info.type == TYPE_VOID)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
822 error ("unknown type `%1` for constant", typestring);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
823
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
824 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
825 info.name = token_string();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
826
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
827 m_lx->must_get_next (tk_assign);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
828
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
829 switch (info.type)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
830 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
831 case TYPE_BOOL:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
832 case TYPE_INT:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
833 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
834 m_lx->must_get_next (tk_number);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
835 } break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
836
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
837 case TYPE_STRING:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
838 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
839 m_lx->must_get_next (tk_string);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
840 } break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
841
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
842 case TYPE_UNKNOWN:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
843 case TYPE_VOID:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
844 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
845 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
846
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
847 info.val = m_lx->get_token()->text;
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
848 m_constants << info;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
849
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
850 m_lx->must_get_next (tk_semicolon);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
851 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
852
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
853 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
854 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
855 void botscript_parser::parse_label()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
856 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
857 check_not_toplevel();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
858 string label_name = token_string();
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
859 byte_mark* mark = null;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
860
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
861 // want no conflicts..
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
862 if (find_command_by_name (label_name))
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
863 error ("label name `%1` conflicts with command name\n", label_name);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
864
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
865 if (find_global_variable (label_name))
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
866 error ("label name `%1` conflicts with variable\n", label_name);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
867
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
868 // See if a mark already exists for this label
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
869 for (undefined_label& undf : m_undefined_labels)
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
870 {
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
871 if (undf.name != label_name)
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
872 continue;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
873
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
874 mark = undf.target;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
875 buffer()->adjust_mark (mark);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
876
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
877 // No longer undefined
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
878 m_undefined_labels.remove (undf);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
879 break;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
880 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
881
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
882 // Not found in unmarked lists, define it now
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
883 if (mark == null)
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
884 buffer()->add_mark (label_name);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
885
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
886 m_lx->must_get_next (tk_colon);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
887 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
888
82
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
889 // =============================================================================
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
890 //
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
891 void botscript_parser::parse_eventdef()
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
892 {
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
893 event_info* e = new event_info;
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
894
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
895 m_lx->must_get_next (tk_number);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
896 e->number = token_string().to_long();
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
897 m_lx->must_get_next (tk_colon);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
898 m_lx->must_get_next (tk_symbol);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
899 e->name = m_lx->get_token()->text;
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
900 m_lx->must_get_next (tk_paren_start);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
901 m_lx->must_get_next (tk_paren_end);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
902 m_lx->must_get_next (tk_semicolon);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
903 add_event (e);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
904 }
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
905
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
906 // =============================================================================
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
907 //
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
908 void botscript_parser::parse_funcdef()
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
909 {
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
910 command_info* comm = new command_info;
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
911
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
912 // Number
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
913 m_lx->must_get_next (tk_number);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
914 comm->number = m_lx->get_token()->text.to_long();
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
915
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
916 m_lx->must_get_next (tk_colon);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
917
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
918 // Name
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
919 m_lx->must_get_next (tk_symbol);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
920 comm->name = m_lx->get_token()->text;
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
921
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
922 m_lx->must_get_next (tk_colon);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
923
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
924 // Return value
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
925 m_lx->must_get_any_of ({tk_int, tk_void, tk_bool, tk_str});
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
926 comm->returnvalue = GetTypeByName (m_lx->get_token()->text); // TODO
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
927 assert (comm->returnvalue != -1);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
928
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
929 m_lx->must_get_next (tk_colon);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
930
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
931 // Num args
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
932 m_lx->must_get_next (tk_number);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
933 comm->numargs = m_lx->get_token()->text.to_long();
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
934
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
935 m_lx->must_get_next (tk_colon);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
936
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
937 // Max args
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
938 m_lx->must_get_next (tk_number);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
939 comm->maxargs = m_lx->get_token()->text.to_long();
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
940
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
941 // Argument types
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
942 int curarg = 0;
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
943
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
944 while (curarg < comm->maxargs)
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
945 {
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
946 command_argument arg;
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
947 m_lx->must_get_next (tk_colon);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
948 m_lx->must_get_any_of ({tk_int, tk_bool, tk_str});
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
949 type_e type = GetTypeByName (m_lx->get_token()->text);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
950 assert (type != -1 && type != TYPE_VOID);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
951 arg.type = type;
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
952
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
953 m_lx->must_get_next (tk_paren_start);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
954 m_lx->must_get_next (tk_symbol);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
955 arg.name = m_lx->get_token()->text;
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
956
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
957 // If this is an optional parameter, we need the default value.
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
958 if (curarg >= comm->numargs)
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
959 {
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
960 m_lx->must_get_next (tk_assign);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
961
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
962 switch (type)
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
963 {
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
964 case TYPE_INT:
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
965 case TYPE_BOOL:
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
966 m_lx->must_get_next (tk_number);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
967 break;
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
968
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
969 case TYPE_STRING:
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
970 m_lx->must_get_next (tk_string);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
971 break;
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
972
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
973 case TYPE_UNKNOWN:
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
974 case TYPE_VOID:
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
975 break;
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
976 }
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
977
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
978 arg.defvalue = m_lx->get_token()->text.to_long();
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
979 }
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
980
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
981 m_lx->must_get_next (tk_paren_end);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
982 comm->args << arg;
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
983 curarg++;
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
984 }
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
985
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
986 m_lx->must_get_next (tk_semicolon);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
987 add_command_definition (comm);
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
988 }
841562f5a32f - added the public-domain updaterevision so I can have access to git stuff
Teemu Piippo <crimsondusk64@gmail.com>
parents: 77
diff changeset
989
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
990 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
991 // Parses a command call
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
992 data_buffer* botscript_parser::parse_command (command_info* comm)
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
993 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
994 data_buffer* r = new data_buffer (64);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
995
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
996 if (m_current_mode == MODE_TOPLEVEL)
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
997 error ("command call at top level");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
998
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
999 m_lx->must_get_next (tk_paren_start);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1000 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1001
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1002 int curarg = 0;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1003
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1004 while (1)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1005 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1006 if (token_is (tk_paren_end))
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1007 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1008 if (curarg < comm->numargs)
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1009 error ("too few arguments passed to %1\n\tprototype: %2",
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1010 comm->name, get_command_signature (comm));
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1011
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1012 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1013 curarg++;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1014 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1015
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1016 if (curarg >= comm->maxargs)
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1017 error ("too many arguments passed to %1\n\tprototype: %2",
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1018 comm->name, get_command_signature (comm));
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1019
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1020 r->merge_and_destroy (parse_expression (comm->args[curarg].type));
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1021 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1022
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1023 if (curarg < comm->numargs - 1)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1024 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1025 m_lx->must_be (tk_comma);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1026 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1027 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1028 else if (curarg < comm->maxargs - 1)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1029 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1030 // Can continue, but can terminate as well.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1031 if (token_is (tk_paren_end))
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1032 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1033 curarg++;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1034 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1035 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1036 else
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1037 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1038 m_lx->must_be (tk_comma);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1039 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1040 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1041 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1042
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1043 curarg++;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1044 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1045
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1046 // If the script skipped any optional arguments, fill in defaults.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1047 while (curarg < comm->maxargs)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1048 {
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1049 r->write_dword (dh_push_number);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1050 r->write_dword (comm->args[curarg].defvalue);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1051 curarg++;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1052 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1053
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1054 r->write_dword (dh_command);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1055 r->write_dword (comm->number);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1056 r->write_dword (comm->maxargs);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1057
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1058 return r;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1059 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1060
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1061 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1062 // Is the given operator an assignment operator?
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1063 //
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1064 static bool is_assignment_operator (int oper)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1065 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1066 switch (oper)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1067 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1068 case OPER_ASSIGNADD:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1069 case OPER_ASSIGNSUB:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1070 case OPER_ASSIGNMUL:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1071 case OPER_ASSIGNDIV:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1072 case OPER_ASSIGNMOD:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1073 case OPER_ASSIGNLEFTSHIFT:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1074 case OPER_ASSIGNRIGHTSHIFT:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1075 case OPER_ASSIGN:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1076 return true;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1077 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1078
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1079 return false;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1080 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1081
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1082 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1083 // Finds an operator's corresponding dataheader
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1084 //
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1085 static word get_data_header_by_operator (script_variable* var, int oper)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1086 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1087 if (is_assignment_operator (oper))
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1088 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1089 if (!var)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1090 error ("operator %d requires left operand to be a variable\n", oper);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1091
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1092 // TODO: At the moment, vars only are global
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1093 // OPER_ASSIGNLEFTSHIFT and OPER_ASSIGNRIGHTSHIFT do not
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1094 // have data headers, instead they are expanded out in
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1095 // the operator parser
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1096 switch (oper)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1097 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1098 case OPER_ASSIGNADD: return dh_add_global_var;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1099 case OPER_ASSIGNSUB: return dh_subtract_global_var;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1100 case OPER_ASSIGNMUL: return dh_multiply_global_var;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1101 case OPER_ASSIGNDIV: return dh_divide_global_var;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1102 case OPER_ASSIGNMOD: return dh_mod_global_var;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1103 case OPER_ASSIGN: return dh_assign_global_var;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1104
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1105 default: error ("bad assignment operator!!\n");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1106 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1107 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1108
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1109 switch (oper)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1110 {
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1111 case OPER_ADD: return dh_add;
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1112 case OPER_SUBTRACT: return dh_subtract;
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1113 case OPER_MULTIPLY: return dh_multiply;
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1114 case OPER_DIVIDE: return dh_divide;
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1115 case OPER_MODULUS: return dh_modulus;
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1116 case OPER_EQUALS: return dh_equals;
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1117 case OPER_NOTEQUALS: return dh_not_equals;
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1118 case OPER_LESSTHAN: return dh_less_than;
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1119 case OPER_GREATERTHAN: return dh_greater_than;
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1120 case OPER_LESSTHANEQUALS: return dh_at_most;
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1121 case OPER_GREATERTHANEQUALS: return dh_at_least;
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1122 case OPER_LEFTSHIFT: return dh_left_shift;
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1123 case OPER_RIGHTSHIFT: return dh_right_shift;
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1124 case OPER_OR: return dh_or_logical;
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1125 case OPER_AND: return dh_and_logical;
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1126 case OPER_BITWISEOR: return dh_or_bitwise;
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1127 case OPER_BITWISEEOR: return dh_eor_bitwise;
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1128 case OPER_BITWISEAND: return dh_and_bitwise;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1129 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1130
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1131 error ("DataHeaderByOperator: couldn't find dataheader for operator %d!\n", oper);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1132 return 0;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1133 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1134
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1135 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1136 // Parses an expression, potentially recursively
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1137 //
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1138 data_buffer* botscript_parser::parse_expression (type_e reqtype)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1139 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1140 data_buffer* retbuf = new data_buffer (64);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1141
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1142 // Parse first operand
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1143 retbuf->merge_and_destroy (parse_expr_value (reqtype));
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1144
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1145 // Parse any and all operators we get
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1146 int oper;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1147
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1148 while ( (oper = parse_operator (true)) != -1)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1149 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1150 // We peeked the operator, move forward now
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1151 m_lx->skip();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1152
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1153 // Can't be an assignement operator, those belong in assignments.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1154 if (is_assignment_operator (oper))
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1155 error ("assignment operator inside expression");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1156
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1157 // Parse the right operand.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1158 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1159 data_buffer* rb = parse_expr_value (reqtype);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1160
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1161 if (oper == OPER_TERNARY)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1162 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1163 // Ternary operator requires - naturally - a third operand.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1164 m_lx->must_get_next (tk_colon);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1165 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1166 data_buffer* tb = parse_expr_value (reqtype);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1167
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1168 // It also is handled differently: there isn't a dataheader for ternary
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1169 // operator. Instead, we abuse PUSHNUMBER and IFNOTGOTO for this.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1170 // Behold, big block of writing madness! :P
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1171 byte_mark* mark1 = retbuf->add_mark (""); // start of "else" case
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1172 byte_mark* mark2 = retbuf->add_mark (""); // end of expression
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1173 retbuf->write_dword (dh_if_not_goto); // if the first operand (condition)
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1174 retbuf->add_reference (mark1); // didn't eval true, jump into mark1
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1175 retbuf->merge_and_destroy (rb); // otherwise, perform second operand (true case)
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1176 retbuf->write_dword (dh_goto); // afterwards, jump to the end, which is
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1177 retbuf->add_reference (mark2); // marked by mark2.
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1178 retbuf->adjust_mark (mark1); // move mark1 at the end of the true case
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1179 retbuf->merge_and_destroy (tb); // perform third operand (false case)
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1180 retbuf->adjust_mark (mark2); // move the ending mark2 here
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1181 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1182 else
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1183 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1184 // write to buffer
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1185 retbuf->merge_and_destroy (rb);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1186 retbuf->write_dword (get_data_header_by_operator (null, oper));
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1187 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1188 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1189
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1190 return retbuf;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1191 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1192
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1193 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1194 // Parses an operator string. Returns the operator number code.
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1195 //
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1196 #define ISNEXT(C) (m_lx->peek_next_string (peek ? 1 : 0) == C)
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1197
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1198 int botscript_parser::parse_operator (bool peek)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1199 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1200 string oper;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1201
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1202 if (peek)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1203 oper += m_lx->peek_next_string();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1204 else
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1205 oper += token_string();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1206
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1207 if (-oper == "strlen")
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1208 return OPER_STRLEN;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1209
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1210 // Check one-char operators
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1211 bool equalsnext = ISNEXT ("=");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1212
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1213 int o = (oper == "=" && !equalsnext) ? OPER_ASSIGN :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1214 (oper == ">" && !equalsnext && !ISNEXT (">")) ? OPER_GREATERTHAN :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1215 (oper == "<" && !equalsnext && !ISNEXT ("<")) ? OPER_LESSTHAN :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1216 (oper == "&" && !ISNEXT ("&")) ? OPER_BITWISEAND :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1217 (oper == "|" && !ISNEXT ("|")) ? OPER_BITWISEOR :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1218 (oper == "+" && !equalsnext) ? OPER_ADD :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1219 (oper == "-" && !equalsnext) ? OPER_SUBTRACT :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1220 (oper == "*" && !equalsnext) ? OPER_MULTIPLY :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1221 (oper == "/" && !equalsnext) ? OPER_DIVIDE :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1222 (oper == "%" && !equalsnext) ? OPER_MODULUS :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1223 (oper == "^") ? OPER_BITWISEEOR :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1224 (oper == "?") ? OPER_TERNARY :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1225 -1;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1226
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1227 if (o != -1)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1228 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1229 return o;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1230 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1231
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1232 // Two-char operators
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1233 oper += m_lx->peek_next_string (peek ? 1 : 0);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1234 equalsnext = m_lx->peek_next_string (peek ? 2 : 1) == ("=");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1235
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1236 o = (oper == "+=") ? OPER_ASSIGNADD :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1237 (oper == "-=") ? OPER_ASSIGNSUB :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1238 (oper == "*=") ? OPER_ASSIGNMUL :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1239 (oper == "/=") ? OPER_ASSIGNDIV :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1240 (oper == "%=") ? OPER_ASSIGNMOD :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1241 (oper == "==") ? OPER_EQUALS :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1242 (oper == "!=") ? OPER_NOTEQUALS :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1243 (oper == ">=") ? OPER_GREATERTHANEQUALS :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1244 (oper == "<=") ? OPER_LESSTHANEQUALS :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1245 (oper == "&&") ? OPER_AND :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1246 (oper == "||") ? OPER_OR :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1247 (oper == "<<" && !equalsnext) ? OPER_LEFTSHIFT :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1248 (oper == ">>" && !equalsnext) ? OPER_RIGHTSHIFT :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1249 -1;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1250
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1251 if (o != -1)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1252 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1253 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1254 return o;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1255 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1256
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1257 // Three-char opers
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1258 oper += m_lx->peek_next_string (peek ? 2 : 1);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1259 o = oper == "<<=" ? OPER_ASSIGNLEFTSHIFT :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1260 oper == ">>=" ? OPER_ASSIGNRIGHTSHIFT :
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1261 -1;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1262
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1263 if (o != -1)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1264 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1265 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1266 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1267 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1268
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1269 return o;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1270 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1271
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1272 // ============================================================================
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1273 //
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1274 string botscript_parser::parse_float()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1275 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1276 m_lx->must_be (tk_number);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1277 string floatstring = token_string();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1278 lexer::token tok;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1279
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1280 // Go after the decimal point
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1281 if (m_lx->peek_next (&tok) && tok.type == tk_dot)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1282 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1283 m_lx->skip();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1284 m_lx->must_get_next (tk_number);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1285 floatstring += ".";
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1286 floatstring += token_string();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1287 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1288
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1289 return floatstring;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1290 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1291
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1292 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1293 // Parses a value in the expression and returns the data needed to push
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1294 // it, contained in a data buffer. A value can be either a variable, a command,
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1295 // a literal or an expression.
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1296 //
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1297 data_buffer* botscript_parser::parse_expr_value (type_e reqtype)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1298 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1299 data_buffer* b = new data_buffer (16);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1300 script_variable* g;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1301
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1302 // Prefixing "!" means negation.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1303 bool negate = token_is (tk_exclamation_mark);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1304
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1305 if (negate) // Jump past the "!"
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1306 m_lx->skip();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1307
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1308 // Handle strlen
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1309 /* if (token_string() == "strlen")
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1310 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1311 m_lx->must_get_next (tk_paren_start);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1312 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1313
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1314 // By this token we should get a string constant.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1315 constant_info* constant = find_constant (token_string());
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1316
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1317 if (!constant || constant->type != TYPE_STRING)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1318 error ("strlen only works with const str");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1319
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1320 if (reqtype != TYPE_INT)
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1321 error ("strlen returns int but %1 is expected\n", GetTypeName (reqtype));
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1322
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1323 b->write_dword (dh_push_number);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1324 b->write_dword (constant->val.len());
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1325
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1326 m_lx->must_get_next (tk_paren_end);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1327 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1328 else */
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1329 if (token_is (tk_paren_start))
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1330 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1331 // Expression
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1332 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1333 data_buffer* c = parse_expression (reqtype);
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1334 b->merge_and_destroy (c);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1335 m_lx->must_get_next (tk_paren_end);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1336 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1337 else if (command_info* comm = find_command_by_name (token_string()))
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1338 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1339 delete b;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1340
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1341 // Command
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1342 if (reqtype && comm->returnvalue != reqtype)
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1343 error ("%1 returns an incompatible data type", comm->name);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1344
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1345 b = parse_command (comm);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1346 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1347 else if (constant_info* constant = find_constant (token_string()))
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1348 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1349 // Type check
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1350 if (reqtype != constant->type)
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1351 error ("constant `%1` is %2, expression requires %3\n",
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1352 constant->name, GetTypeName (constant->type),
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1353 GetTypeName (reqtype));
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1354
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1355 switch (constant->type)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1356 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1357 case TYPE_BOOL:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1358 case TYPE_INT:
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1359 b->write_dword (dh_push_number);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1360 b->write_dword (atoi (constant->val));
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1361 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1362
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1363 case TYPE_STRING:
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1364 b->write_string_index (constant->val);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1365 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1366
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1367 case TYPE_VOID:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1368 case TYPE_UNKNOWN:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1369 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1370 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1371 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1372 else if ((g = find_global_variable (token_string())))
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1373 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1374 // Global variable
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1375 b->write_dword (dh_push_global_var);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1376 b->write_dword (g->index);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1377 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1378 else
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1379 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1380 // If nothing else, check for literal
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1381 switch (reqtype)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1382 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1383 case TYPE_VOID:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1384 case TYPE_UNKNOWN:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1385 error ("unknown identifier `%1` (expected keyword, function or variable)", token_string());
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1386 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1387
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1388 case TYPE_BOOL:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1389 case TYPE_INT:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1390 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1391 m_lx->must_be (tk_number);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1392
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1393 // All values are written unsigned - thus we need to write the value's
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1394 // absolute value, followed by an unary minus for negatives.
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1395 b->write_dword (dh_push_number);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1396
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1397 long v = token_string().to_long();
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1398 b->write_dword (static_cast<word> (abs (v)));
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1399
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1400 if (v < 0)
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1401 b->write_dword (dh_unary_minus);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1402
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1403 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1404 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1405
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1406 case TYPE_STRING:
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1407 // PushToStringTable either returns the string index of the
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1408 // string if it finds it in the table, or writes it to the
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1409 // table and returns it index if it doesn't find it there.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1410 m_lx->must_be (tk_string);
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1411 b->write_string_index (token_string());
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1412 break;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1413 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1414 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1415
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1416 // Negate it now if desired
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1417 if (negate)
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1418 b->write_dword (dh_negate_logical);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1419
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1420 return b;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1421 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1422
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1423 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1424 // Parses an assignment. An assignment starts with a variable name, followed
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1425 // by an assignment operator, followed by an expression value. Expects current
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1426 // token to be the name of the variable, and expects the variable to be given.
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1427 //
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1428 data_buffer* botscript_parser::parse_assignment (script_variable* var)
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1429 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1430 // Get an operator
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1431 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1432 int oper = parse_operator();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1433
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1434 if (!is_assignment_operator (oper))
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1435 error ("expected assignment operator");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1436
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1437 if (m_current_mode == MODE_TOPLEVEL)
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1438 error ("can't alter variables at top level");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1439
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1440 // Parse the right operand
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1441 m_lx->must_get_next();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1442 data_buffer* retbuf = new data_buffer;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1443 data_buffer* expr = parse_expression (var->type);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1444
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1445 // <<= and >>= do not have data headers. Solution: expand them.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1446 // a <<= b -> a = a << b
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1447 // a >>= b -> a = a >> b
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1448 if (oper == OPER_ASSIGNLEFTSHIFT || oper == OPER_ASSIGNRIGHTSHIFT)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1449 {
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1450 retbuf->write_dword (var->is_global() ? dh_push_global_var : dh_push_local_var);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1451 retbuf->write_dword (var->index);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1452 retbuf->merge_and_destroy (expr);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1453 retbuf->write_dword ((oper == OPER_ASSIGNLEFTSHIFT) ? dh_left_shift : dh_right_shift);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1454 retbuf->write_dword (var->is_global() ? dh_assign_global_var : dh_assign_local_var);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1455 retbuf->write_dword (var->index);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1456 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1457 else
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1458 {
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1459 retbuf->merge_and_destroy (expr);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1460 long dh = get_data_header_by_operator (var, oper);
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1461 retbuf->write_dword (dh);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1462 retbuf->write_dword (var->index);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1463 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1464
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1465 return retbuf;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1466 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1467
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1468 // ============================================================================
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1469 //
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1470 void botscript_parser::push_scope()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1471 {
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1472 m_scope_cursor++;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1473
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1474 if (m_scope_cursor >= MAX_SCOPE)
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1475 error ("too deep scope");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1476
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1477 ScopeInfo* info = &SCOPE (0);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1478 info->type = e_unknown_scope;
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1479 info->mark1 = null;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1480 info->mark2 = null;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1481 info->buffer1 = null;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1482 info->casecursor = -1;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1483
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1484 for (int i = 0; i < MAX_CASE; i++)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1485 {
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1486 info->casemarks[i] = null;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1487 info->casebuffers[i] = null;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1488 info->casenumbers[i] = -1;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1489 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1490 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1491
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1492 // ============================================================================
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1493 //
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1494 data_buffer* botscript_parser::parse_statement()
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1495 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1496 if (find_constant (token_string())) // There should not be constants here.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1497 error ("invalid use for constant\n");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1498
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1499 // If it's a variable, expect assignment.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1500 if (script_variable* var = find_global_variable (token_string()))
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1501 return parse_assignment (var);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1502
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1503 return null;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1504 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1505
77
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1506 // ============================================================================
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1507 //
ad17801b1a36 - various corrections
Teemu Piippo <crimsondusk64@gmail.com>
parents: 75
diff changeset
1508 void botscript_parser::add_switch_case (data_buffer* b)
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1509 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1510 ScopeInfo* info = &SCOPE (0);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1511
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1512 info->casecursor++;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1513
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1514 if (info->casecursor >= MAX_CASE)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1515 error ("too many cases in one switch");
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1516
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1517 // Init a mark for the case buffer
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1518 byte_mark* casemark = buffer()->add_mark ("");
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1519 info->casemarks[info->casecursor] = casemark;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1520
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1521 // Add a reference to the mark. "case" and "default" both
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1522 // add the necessary bytecode before the reference.
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1523 if (b)
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1524 b->add_reference (casemark);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1525 else
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1526 buffer()->add_reference (casemark);
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1527
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1528 // Init a buffer for the case block and tell the object
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1529 // writer to record all written data to it.
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1530 info->casebuffers[info->casecursor] = m_switch_buffer = new data_buffer;
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1531 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1532
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1533 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1534 //
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1535 constant_info* botscript_parser::find_constant (const string& tok)
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1536 {
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1537 for (int i = 0; i < m_constants.size(); i++)
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1538 if (m_constants[i].name == tok)
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1539 return &m_constants[i];
75
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1540
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1541 return null;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1542 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1543
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1544 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1545 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1546 bool botscript_parser::token_is (e_token a)
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1547 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1548 return (m_lx->get_token_type() == a);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1549 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1550
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1551 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1552 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1553 string botscript_parser::token_string()
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1554 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1555 return m_lx->get_token()->text;
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1556 }
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1557
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1558 // ============================================================================
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1559 //
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1560 string botscript_parser::describe_position() const
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1561 {
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1562 lexer::token* tok = m_lx->get_token();
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1563 return tok->file + ":" + string (tok->line) + ":" + string (tok->column);
bf8c57437231 - renamed files to .cxx, restructured parser.cc
Teemu Piippo <crimsondusk64@gmail.com>
parents:
diff changeset
1564 }
86
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1565
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1566 // ============================================================================
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1567 //
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1568 data_buffer* botscript_parser::buffer()
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1569 {
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1570 if (m_switch_buffer != null)
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1571 return m_switch_buffer;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1572
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1573 if (m_current_mode == MODE_MAINLOOP)
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1574 return m_main_loop_buffer;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1575
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1576 if (m_current_mode == MODE_ONENTER)
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1577 return m_on_enter_buffer;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1578
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1579 return m_main_buffer;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1580 }
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1581
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1582 // ============================================================================
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1583 //
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1584 void botscript_parser::write_member_buffers()
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1585 {
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1586 // If there was no mainloop defined, write a dummy one now.
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1587 if (!m_got_main_loop)
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1588 {
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1589 m_main_loop_buffer->write_dword (dh_main_loop);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1590 m_main_loop_buffer->write_dword (dh_end_main_loop);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1591 }
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1592
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1593 // Write the onenter and mainloop buffers, in that order in particular.
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1594 for (data_buffer** bufp : list<data_buffer**> ({&m_on_enter_buffer, &m_main_loop_buffer}))
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1595 {
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1596 buffer()->merge_and_destroy (*bufp);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1597
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1598 // Clear the buffer afterwards for potential next state
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1599 *bufp = new data_buffer;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1600 }
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1601
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1602 // Next state definitely has no mainloop yet
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1603 m_got_main_loop = false;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1604 }
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1605
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1606 // ============================================================================
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1607 //
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1608 // Write string table
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1609 //
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1610 void botscript_parser::write_string_table()
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1611 {
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1612 int stringcount = num_strings_in_table();
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1613
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1614 if (!stringcount)
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1615 return;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1616
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1617 // Write header
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1618 m_main_buffer->write_dword (dh_string_list);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1619 m_main_buffer->write_dword (stringcount);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1620
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1621 // Write all strings
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1622 for (int i = 0; i < stringcount; i++)
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1623 m_main_buffer->write_string (get_string_table()[i]);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1624 }
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1625
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1626 // ============================================================================
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1627 //
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1628 // Write the compiled bytecode to a file
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1629 //
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1630 void botscript_parser::write_to_file (string outfile)
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1631 {
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1632 FILE* fp = fopen (outfile, "w");
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1633 CHECK_FILE (fp, outfile, "writing");
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1634
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1635 // First, resolve references
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1636 for (int u = 0; u < MAX_MARKS; u++)
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1637 {
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1638 mark_reference* ref = m_main_buffer->get_refs()[u];
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1639
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1640 if (!ref)
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1641 continue;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1642
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1643 // Substitute the placeholder with the mark position
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1644 generic_union<word> uni;
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1645 uni.as_word = static_cast<word> (ref->target->pos);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1646
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1647 for (int v = 0; v < (int) sizeof (word); v++)
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1648 memset (m_main_buffer->get_buffer() + ref->pos + v, uni.as_bytes[v], 1);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1649
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1650 /*
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1651 printf ("reference %u at %d resolved to %u at %d\n",
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1652 u, ref->pos, ref->num, MainBuffer->marks[ref->num]->pos);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1653 */
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1654 }
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1655
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1656 // Then, dump the main buffer to the file
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1657 fwrite (m_main_buffer->get_buffer(), 1, m_main_buffer->get_write_size(), fp);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1658 print ("-- %1 byte%s1 written to %2\n", m_main_buffer->get_write_size(), outfile);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1659 fclose (fp);
43fe4be38a58 - merged object writer into parser
Teemu Piippo <crimsondusk64@gmail.com>
parents: 85
diff changeset
1660 }

mercurial