annotate lwbasic/parser.c @ 32:49d608aecc4d

Framework for handling local stack frame and/or variables
author lost@l-w.ca
date Thu, 03 Feb 2011 22:00:47 -0700
parents 574931d87abd
children 890a8f688889
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
1 /*
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
2 compiler.c
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
3
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
4 Copyright © 2011 William Astle
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
5
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
6 This file is part of LWTOOLS.
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
7
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
8 LWTOOLS is free software: you can redistribute it and/or modify it under the
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
9 terms of the GNU General Public License as published by the Free Software
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
10 Foundation, either version 3 of the License, or (at your option) any later
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
11 version.
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
12
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
13 This program is distributed in the hope that it will be useful, but WITHOUT
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
16 more details.
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
17
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
18 You should have received a copy of the GNU General Public License along with
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
19 this program. If not, see <http://www.gnu.org/licenses/>.
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
20 */
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
21
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
22 /*
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
23 This is the actual compiler bit; it drives the parser and code generation
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
24 */
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
26 #include <stdio.h>
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
27
26
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
28 #include <lw_alloc.h>
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
29 #include <lw_string.h>
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
30
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
31 #include "lwbasic.h"
32
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
32 #include "symtab.h"
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
33
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
34
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
35 /* size of a type */
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
36 static int sizeof_type(int type)
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
37 {
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
38 /* everything is an "int" right now; 2 bytes */
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
39 return 2;
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
40 }
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
41
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
42 /* parse a type; the next token will be acquired as a result */
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
43 /* the token advancement is to provide consistency */
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
44 static int parse_type(cstate *state)
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
45 {
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
46 int pt = -1;
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
47
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
48 switch (state -> lexer_token)
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
49 {
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
50 case token_kw_integer:
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
51 pt = 1;
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
52 break;
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
53
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
54 default:
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
55 lwb_error("Invalid type specification");
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
56 }
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
57 lexer(state);
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
58 /* look for "unsigned" modifier for integer types */
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
59 return pt;
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
60 }
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
61
32
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
62 static void parse_decls(cstate *state)
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
63 {
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
64 /* declarations */
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
65 switch (state -> lexer_token)
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
66 {
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
67 default:
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
68 return;
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
69 }
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
70 }
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
71
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
72
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
73 /* issub means RETURNS is not allowed; !issub means RETURNS is required */
32
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
74
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
75 static void parse_subfunc(cstate *state, int issub)
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
76 {
32
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
77 int pt, rt;
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
78 char *subname, *pn;
26
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
79 int vis = 0;
32
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
80 symtab_entry_t *se;
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
81 int paramsize = 0;
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
82
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
83 state -> local_syms = symtab_init();
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
84 state -> framesize = 0;
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
85
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
86 lexer(state);
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
87 if (state -> lexer_token != token_identifier)
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
88 {
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
89 lwb_error("Invalid sub name '%s'", state -> lexer_token_string);
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
90 }
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
91
26
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
92 subname = lw_strdup(state -> lexer_token_string);
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
93
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
94 lexer(state);
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
95 if (state -> lexer_token == token_kw_public || state -> lexer_token == token_kw_private)
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
96 {
26
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
97 if (state -> lexer_token == token_kw_public)
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
98 vis = 1;
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
99 lexer(state);
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
100 }
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
101
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
102 /* ignore the "PARAMS" keyword if present */
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
103 if (state -> lexer_token == token_kw_params)
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
104 lexer(state);
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
105
26
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
106 if (state -> lexer_token == token_eol || state -> lexer_token == token_kw_returns)
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
107 goto noparms;
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
108
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
109 paramagain:
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
110 if (state -> lexer_token != token_identifier)
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
111 {
31
574931d87abd Created a function to prettyprint the current lexer token
lost@l-w.ca
parents: 30
diff changeset
112 lwb_error("Parameter name expected, got %s\n", lexer_return_token(state));
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
113 }
32
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
114 pn = lw_strdup(state -> lexer_token_string);
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
115 lexer(state);
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
116
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
117 if (state -> lexer_token != token_kw_as)
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
118 lwb_error("Expecting AS\n");
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
119 lexer(state);
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
120
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
121 pt = parse_type(state);
32
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
122
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
123 se = symtab_find(state -> local_syms, pn);
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
124 if (se)
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
125 {
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
126 lwb_error("Duplicate parameter name %s\n", pn);
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
127 }
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
128 symtab_register(state -> local_syms, pn, paramsize, symtype_param, NULL);
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
129 paramsize += sizeof_type(pt);
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
130 lw_free(pn);
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
131
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
132 if (state -> lexer_token == token_char && state -> lexer_token_string[0] == ',')
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
133 {
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
134 lexer(state);
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
135 goto paramagain;
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
136 }
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
137
32
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
138 noparms:
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
139 rt = -1;
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
140 if (!issub)
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
141 {
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
142 if (state -> lexer_token != token_kw_returns)
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
143 {
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
144 lwb_error("FUNCTION must have RETURNS\n");
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
145 }
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
146 lexer(state);
32
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
147 /* if (state -> lexer_token == token_identifier)
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
148 {
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
149 printf("Return value named: %s\n", state -> lexer_token_string);
32
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
150
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
151 lexer(state);
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
152 if (state -> lexer_token != token_kw_as)
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
153 lwb_error("Execting AS after RETURNS");
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
154 lexer(state);
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
155 }
32
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
156 */
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
157 rt = parse_type(state);
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
158 }
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
159 else
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
160 {
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
161 if (state -> lexer_token == token_kw_returns)
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
162 {
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
163 lwb_error("SUB cannot specify RETURNS\n");
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
164 }
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
165 }
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
166
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
167
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
168 if (state -> lexer_token != token_eol)
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
169 {
31
574931d87abd Created a function to prettyprint the current lexer token
lost@l-w.ca
parents: 30
diff changeset
170 lwb_error("EOL expected; found %s\n", lexer_return_token(state));
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
171 }
26
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
172
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
173
32
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
174 se = symtab_find(state -> global_syms, subname);
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
175 if (se)
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
176 {
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
177 lwb_error("Multiply defined symbol %s\n", subname);
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
178 }
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
179
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
180 symtab_register(state -> global_syms, subname, -1, issub ? symtype_sub : symtype_func, NULL);
26
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
181
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
182 state -> currentsub = subname;
32
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
183 state -> returntype = rt;
26
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
184 /* consume EOL */
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
185 lexer(state);
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
186
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
187 /* variable declarations */
32
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
188 parse_decls(state);
26
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
189
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
190 /* output function/sub prolog */
32
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
191 emit_prolog(state, vis);
26
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
192
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
193 /* parse statement block */
32
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
194 /* parse_statements(state); */
26
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
195
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
196 if (issub)
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
197 {
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
198 if (state -> lexer_token != token_kw_endsub)
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
199 {
31
574931d87abd Created a function to prettyprint the current lexer token
lost@l-w.ca
parents: 30
diff changeset
200 lwb_error("Expecting ENDSUB, got %s\n", lexer_return_token(state));
26
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
201 }
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
202 }
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
203 else
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
204 {
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
205 if (state -> lexer_token != token_kw_endfunction)
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
206 {
31
574931d87abd Created a function to prettyprint the current lexer token
lost@l-w.ca
parents: 30
diff changeset
207 lwb_error("Expecting ENDFUNCTION, got %s\n", lexer_return_token(state));
26
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
208 }
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
209 }
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
210 /* output function/sub epilog */
32
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
211 emit_epilog(state);
26
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
212
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
213 lw_free(state -> currentsub);
26aa76da75ad Additional parsing in function/sub; emission of prolog/epilog code
lost@l-w.ca
parents: 25
diff changeset
214 state -> currentsub = NULL;
32
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
215 symtab_destroy(state -> local_syms);
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
216 state -> local_syms = NULL;
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
217 }
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
218
30
bcd532a90e53 Renamed "compiler" to "parser" for more consistent terminology
lost@l-w.ca
parents: 27
diff changeset
219 void parser(cstate *state)
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
220 {
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
221 state -> lexer_curchar = -1;
32
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
222 state -> global_syms = symtab_init();
49d608aecc4d Framework for handling local stack frame and/or variables
lost@l-w.ca
parents: 31
diff changeset
223
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
224 /* now look for a global declaration */
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
225 for (;;)
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
226 {
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
227 state -> parser_state = parser_state_global;
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
228 lexer(state);
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
229 switch (state -> lexer_token)
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
230 {
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
231 case token_kw_function:
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
232 printf("Function\n");
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
233 parse_subfunc(state, 0);
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
234 break;
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
235
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
236 case token_kw_sub:
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
237 printf("Sub\n");
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
238 parse_subfunc(state, 1);
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
239 break;
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
240
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
241 /* blank lines are allowed */
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
242 case token_eol:
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
243 continue;
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
244
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
245 /* EOF is allowed - end of parsing */
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
246 case token_eof:
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
247 return;
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
248
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
249 default:
31
574931d87abd Created a function to prettyprint the current lexer token
lost@l-w.ca
parents: 30
diff changeset
250 lwb_error("Invalid token '%s' in global state\n", lexer_return_token(state));
25
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
251 }
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
252 }
87590f43e76d Started lwbasic parser; checkpoint
lost@l-w.ca
parents:
diff changeset
253 }