Sun, 26 Jan 2014 23:18:48 +0200
- 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 | } |