annotate lwcc/cc-parse.c @ 501:f3e9732973f1

Add basic integer operations to lwcc Add +, -, *, and / to lwcc parser and code generator. Multiplication and division require helper functions in a yet to be created support library. These operations are integer only for the moment.
author William Astle <lost@l-w.ca>
date Tue, 24 Sep 2019 22:07:56 -0600
parents 1bd2d590d734
children 14a40f8bb4eb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
498
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
1 /*
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
2 lwcc/cc-parse.c
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
3
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
4 Copyright © 2019 William Astle
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
5
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
6 This file is part of LWTOOLS.
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
7
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
8 LWTOOLS is free software: you can redistribute it and/or modify it under the
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
9 terms of the GNU General Public License as published by the Free Software
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
10 Foundation, either version 3 of the License, or (at your option) any later
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
11 version.
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
12
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
13 This program is distributed in the hope that it will be useful, but WITHOUT
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
16 more details.
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
17
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
18 You should have received a copy of the GNU General Public License along with
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
19 this program. If not, see <http://www.gnu.org/licenses/>.
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
20 */
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
21
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
22 #include <string.h>
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
23
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
24 #include <lw_alloc.h>
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
25 #include <lw_string.h>
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
26
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
27 #include "cpp.h"
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
28 #include "tree.h"
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
29
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
30 #define TOK_KW_IF -1
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
31 #define TOK_KW_ELSE -2
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
32 #define TOK_KW_WHILE -3
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
33 #define TOK_KW_DO -4
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
34 #define TOK_KW_FOR -5
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
35 #define TOK_KW_VOID -6
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
36 #define TOK_KW_INT -7
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
37 #define TOK_KW_CHAR -8
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
38 #define TOK_KW_SHORT -9
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
39 #define TOK_KW_LONG -10
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
40 #define TOK_KW_UNSIGNED -11
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
41 #define TOK_KW_SIGNED -12
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
42 #define TOK_KW_FLOAT -13
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
43 #define TOK_KW_DOUBLE -14
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
44 #define TOK_KW_STRUCT -15
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
45 #define TOK_KW_UNION -16
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
46 #define TOK_KW_TYPEDEF -17
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
47 #define TOK_KW_STATIC -18
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
48 #define TOK_KW_SWITCH -19
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
49 #define TOK_KW_CASE -20
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
50 #define TOK_KW_DEFAULT -21
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
51 #define TOK_KW_BREAK -22
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
52 #define TOK_KW_CONTINUE -23
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
53 #define TOK_KW_CONST -24
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
54 #define TOK_KW_AUTO -25
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
55 #define TOK_KW_ENUM -26
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
56 #define TOK_KW_REGISTER -27
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
57 #define TOK_KW_SIZEOF -28
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
58 #define TOK_KW_VOLATILE -29
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
59 #define TOK_KW_RETURN -30
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
60 #define TOK_KW_EXTERN -31
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
61 #define TOK_KW_GOTO -32
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
62 #define TOK_TYPENAME -100
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
63 #define TOK_CONST_INT -150
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
64
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
65 static struct { int tok; char *word; } keyword_list[] = {
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
66 { TOK_KW_IF, "if" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
67 { TOK_KW_ELSE, "else" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
68 { TOK_KW_WHILE, "while" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
69 { TOK_KW_DO, "do" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
70 { TOK_KW_FOR, "for" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
71 { TOK_KW_VOID, "void" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
72 { TOK_KW_INT, "int" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
73 { TOK_KW_CHAR, "char" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
74 { TOK_KW_SHORT, "short" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
75 { TOK_KW_LONG, "long" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
76 { TOK_KW_UNSIGNED, "unsigned" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
77 { TOK_KW_SIGNED, "signed" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
78 { TOK_KW_FLOAT, "float" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
79 { TOK_KW_DOUBLE, "double" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
80 { TOK_KW_STRUCT, "struct" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
81 { TOK_KW_UNION, "union" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
82 { TOK_KW_TYPEDEF, "typedef" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
83 { TOK_KW_STATIC, "static" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
84 { TOK_KW_SWITCH, "switch" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
85 { TOK_KW_CASE, "case" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
86 { TOK_KW_DEFAULT, "default" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
87 { TOK_KW_BREAK, "break" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
88 { TOK_KW_CONTINUE, "continue" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
89 { TOK_KW_CONST, "const" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
90 { TOK_KW_AUTO, "auto" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
91 { TOK_KW_ENUM, "enum" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
92 { TOK_KW_REGISTER, "register" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
93 { TOK_KW_SIZEOF, "sizeof" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
94 { TOK_KW_VOLATILE, "volatile" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
95 { TOK_KW_RETURN, "return" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
96 { TOK_KW_EXTERN, "extern" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
97 { TOK_KW_GOTO, "goto" },
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
98 { TOK_NONE, "" }
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
99 };
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
100
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
101
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
102 struct parser_state
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
103 {
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
104 struct preproc_info *pp; // preprocessor data
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
105 struct token *curtok; // the current token
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
106 };
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
107
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
108
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
109 struct token *parse_next(struct parser_state *ps)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
110 {
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
111 struct token *tok;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
112 int i;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
113
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
114 for (;;)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
115 {
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
116 tok = preproc_next(ps -> pp);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
117 if (tok -> ttype == TOK_WSPACE)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
118 continue;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
119 if (tok -> ttype == TOK_EOL)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
120 continue;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
121 if (tok -> ttype == TOK_CHAR)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
122 {
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
123 // random character
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
124 fprintf(stderr, "Random character %02x\n", tok -> strval[0]);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
125 if (tok -> strval[0] < 32 || tok -> strval[0] > 126)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
126 continue;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
127 }
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
128 break;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
129 }
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
130 if (tok -> ttype == TOK_IDENT)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
131 {
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
132 // convert identifier tokens to their respective meanings
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
133 for (i = 0; keyword_list[i].tok != TOK_NONE; i++)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
134 {
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
135 if (strcmp(keyword_list[i].word, tok -> strval) == 0)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
136 {
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
137 tok -> ttype = keyword_list[i].tok;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
138 goto out;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
139 }
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
140 }
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
141 // check for registered types here
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
142 }
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
143 else if (tok -> ttype == TOK_NUMBER)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
144 {
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
145 // look for anything that isn't 0-9
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
146 for (i = 0; tok -> strval[i]; i++)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
147 {
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
148 if (tok -> strval[i] < '0' || tok -> strval[i] > '9')
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
149 break;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
150 }
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
151 if (tok -> strval[i] == 0)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
152 tok -> ttype = TOK_CONST_INT;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
153 }
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
154 out:
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
155 fprintf(stderr, "Lexed: ");
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
156 token_print(tok, stderr);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
157 fprintf(stderr, " (%d)\n", tok -> ttype);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
158 if (ps -> curtok)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
159 token_free(ps -> curtok);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
160 ps -> curtok = tok;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
161 return tok;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
162 }
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
163
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
164 void parse_generr(struct parser_state *ps, char *tag)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
165 {
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
166 fprintf(stderr, "(%s) Unexpected token (%d): ", tag, ps -> curtok -> ttype);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
167 token_print(ps -> curtok, stderr);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
168 fprintf(stderr, "\n");
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
169
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
170 }
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
171
501
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
172 node_t *parse_term_real(struct parser_state *ps)
498
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
173 {
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
174 node_t *rv;
501
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
175
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
176 switch (ps -> curtok -> ttype)
498
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
177 {
501
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
178 case TOK_CONST_INT:
498
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
179 rv = node_create(NODE_CONST_INT, ps -> curtok -> strval);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
180 parse_next(ps);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
181 return rv;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
182 }
501
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
183
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
184 parse_generr(ps, "term");
498
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
185 return NULL;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
186 }
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
187
501
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
188 node_t *parse_expr_real(struct parser_state *ps, int prec)
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
189 {
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
190 static struct { int tok; int nodetype; int prec; } operlist[] = {
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
191 { TOK_STAR, NODE_OPER_TIMES, 150 },
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
192 { TOK_DIV, NODE_OPER_DIVIDE, 150 },
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
193 { TOK_ADD, NODE_OPER_PLUS, 100 },
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
194 { TOK_SUB, NODE_OPER_MINUS, 100 },
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
195 { 0, 0, 0 }
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
196 };
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
197 node_t *term1, *term2;
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
198 int i;
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
199
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
200 term1 = parse_term_real(ps);
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
201 if (!term1)
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
202 return NULL;
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
203
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
204 nextoper:
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
205 for (i = 0; operlist[i].tok; i++)
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
206 if (operlist[i].tok == ps -> curtok -> ttype)
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
207 break;
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
208 fprintf(stderr, "Matched operator: %d, %d\n", operlist[i].tok, operlist[i].prec);
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
209 // if we hit the end of the expression, return
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
210 if (operlist[i].tok == 0)
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
211 return term1;
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
212
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
213 // is the next operator less or same precedence?
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
214 if (operlist[i].prec <= prec)
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
215 return term1;
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
216
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
217 parse_next(ps);
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
218 term2 = parse_expr_real(ps, operlist[i].prec);
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
219 if (!term2)
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
220 {
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
221 parse_generr(ps, "expr");
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
222 node_destroy(term2);
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
223 }
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
224
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
225 term1 = node_create(operlist[i].nodetype, term1, term2);
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
226 term2 = NULL;
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
227 goto nextoper;
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
228 }
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
229
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
230 node_t *parse_expr(struct parser_state *ps)
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
231 {
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
232 return parse_expr_real(ps, 0);
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
233 }
f3e9732973f1 Add basic integer operations to lwcc
William Astle <lost@l-w.ca>
parents: 498
diff changeset
234
498
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
235 node_t *parse_statement(struct parser_state *ps)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
236 {
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
237 node_t *rv;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
238 node_t *n;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
239
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
240 switch (ps -> curtok -> ttype)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
241 {
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
242 case TOK_KW_RETURN:
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
243 parse_next(ps);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
244 n = parse_expr(ps);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
245 if (!n)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
246 {
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
247 parse_generr(ps, "statement");
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
248 return NULL;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
249 }
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
250 rv = node_create(NODE_STMT_RETURN);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
251 node_addchild(rv, n);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
252 break;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
253
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
254 default:
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
255 return NULL;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
256 }
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
257
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
258 if (ps -> curtok -> ttype != TOK_EOS)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
259 parse_generr(ps, "statement");
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
260 else
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
261 parse_next(ps);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
262 return rv;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
263 }
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
264
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
265 node_t *parse_globaldecl(struct parser_state *ps)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
266 {
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
267 node_t *rv = NULL;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
268 node_t *stmt;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
269 char *fnname = NULL;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
270 if (ps -> curtok -> ttype == TOK_KW_INT)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
271 {
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
272 // variable name
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
273 parse_next(ps);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
274 if (ps -> curtok -> ttype != TOK_IDENT)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
275 goto error;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
276 fnname = lw_strdup(ps -> curtok -> strval);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
277 parse_next(ps);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
278 if (ps -> curtok -> ttype != TOK_OPAREN)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
279 goto error;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
280 parse_next(ps);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
281 if (ps -> curtok -> ttype != TOK_CPAREN)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
282 goto error;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
283 parse_next(ps);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
284 if (ps -> curtok -> ttype != TOK_OBRACE)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
285 goto error;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
286 parse_next(ps);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
287 stmt = parse_statement(ps);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
288 if (!stmt)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
289 goto error;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
290 rv = node_create(NODE_FUNDEF, node_create(NODE_TYPE_INT), node_create(NODE_IDENT, fnname), node_create(NODE_FUNARGS), stmt);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
291 if (ps -> curtok -> ttype != TOK_CBRACE)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
292 goto error;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
293 parse_next(ps);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
294 lw_free(fnname);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
295 return rv;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
296 }
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
297
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
298
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
299 error:
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
300 if (fnname)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
301 lw_free(fnname);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
302 parse_generr(ps, "globaldecl");
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
303 return rv;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
304 }
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
305
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
306 node_t *parse_program(struct preproc_info *pp)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
307 {
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
308 node_t *rv;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
309 node_t *node;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
310 struct parser_state ps;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
311
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
312 ps.pp = pp;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
313 ps.curtok = NULL;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
314
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
315 rv = node_create(NODE_PROGRAM);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
316
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
317 // prime the parser
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
318 parse_next(&ps);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
319 while (ps.curtok -> ttype != TOK_EOF)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
320 {
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
321 node = parse_globaldecl(&ps);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
322 if (!node)
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
323 break;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
324 node_addchild(rv, node);
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
325 }
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
326
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
327 return rv;
1bd2d590d734 Rejig parser to eliminate lemon
William Astle <lost@l-w.ca>
parents:
diff changeset
328 }