diff options
author | Mike Buland <eichlan@xagasoft.com> | 2010-10-12 07:35:08 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2010-10-12 07:35:08 +0000 |
commit | 0981b9d6a12bd7aadbf9286459e033ac1a2ba910 (patch) | |
tree | fa461761086f182e43f94637a9c8df040333e8a4 /src/tools | |
parent | 1ee5f374ed986333d5cdbbf41390f1c4c755a8e3 (diff) | |
download | libbu++-0981b9d6a12bd7aadbf9286459e033ac1a2ba910.tar.gz libbu++-0981b9d6a12bd7aadbf9286459e033ac1a2ba910.tar.bz2 libbu++-0981b9d6a12bd7aadbf9286459e033ac1a2ba910.tar.xz libbu++-0981b9d6a12bd7aadbf9286459e033ac1a2ba910.zip |
Ok, libbu++ compiles again, the basic parser system is getting there, I think,
it's still a little tricky becasue you have to do the non-terminal prime
seperation yourself (I forget what it's really called), but it's going quite
well. After a few tweaks to the core of it, we should be able to do some
math :)
Diffstat (limited to '')
-rw-r--r-- | src/tools/parser.cpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/tools/parser.cpp b/src/tools/parser.cpp index a70dfa4..e4fc95f 100644 --- a/src/tools/parser.cpp +++ b/src/tools/parser.cpp | |||
@@ -149,12 +149,91 @@ private: | |||
149 | QueueBuf qbIn; | 149 | QueueBuf qbIn; |
150 | }; | 150 | }; |
151 | 151 | ||
152 | void redAdd( Bu::Parser &p ) | ||
153 | { | ||
154 | } | ||
155 | |||
156 | void redPrint( Bu::Parser &p ) | ||
157 | { | ||
158 | } | ||
159 | |||
152 | int main( int argc, char *argv[] ) | 160 | int main( int argc, char *argv[] ) |
153 | { | 161 | { |
154 | File fIn( argv[1], File::Read ); | 162 | File fIn( argv[1], File::Read ); |
155 | 163 | ||
156 | Parser p; | 164 | Parser p; |
157 | 165 | ||
166 | { | ||
167 | Parser::NonTerminal nt; | ||
168 | int iSelf = p.addNonTerminal("expr"); | ||
169 | nt.addProduction( | ||
170 | Parser::Production( | ||
171 | Parser::State( | ||
172 | Parser::State::typeTerminal, | ||
173 | tokPlus | ||
174 | ) | ||
175 | ).append( | ||
176 | Parser::State( | ||
177 | Parser::State::typeNonTerminal, | ||
178 | iSelf | ||
179 | ) | ||
180 | ).append( | ||
181 | Parser::State( | ||
182 | Parser::State::typeReduction, | ||
183 | p.addReduction("add") | ||
184 | ) | ||
185 | ) | ||
186 | ); | ||
187 | nt.addProduction( | ||
188 | Parser::Production() | ||
189 | ); | ||
190 | p.addNonTerminal( "expr", nt ); | ||
191 | } | ||
192 | { | ||
193 | Parser::NonTerminal nt; | ||
194 | nt.addProduction( | ||
195 | Parser::Production( | ||
196 | Parser::State( | ||
197 | Parser::State::typeTerminalPush, | ||
198 | tokNumber | ||
199 | ) | ||
200 | ).append( | ||
201 | Parser::State( | ||
202 | Parser::State::typeNonTerminal, | ||
203 | p.getNonTerminalId("expr") | ||
204 | ) | ||
205 | ) | ||
206 | ); | ||
207 | p.addNonTerminal( "expr'", nt ); | ||
208 | } | ||
209 | { | ||
210 | Parser::NonTerminal nt; | ||
211 | nt.addProduction( | ||
212 | Parser::Production( | ||
213 | Parser::State( | ||
214 | Parser::State::typeNonTerminal, | ||
215 | p.getNonTerminalId("expr'") | ||
216 | ) | ||
217 | ).append( | ||
218 | Parser::State( | ||
219 | Parser::State::typeTerminal, | ||
220 | tokCompute | ||
221 | ) | ||
222 | ).append( | ||
223 | Parser::State( | ||
224 | Parser::State::typeReduction, | ||
225 | p.addReduction("print") | ||
226 | ) | ||
227 | ) | ||
228 | ); | ||
229 | p.addNonTerminal("input", nt ); | ||
230 | } | ||
231 | |||
232 | p.setRootNonTerminal("input"); | ||
233 | |||
234 | p.setReduction("add", Bu::slot( &redAdd ) ); | ||
235 | p.setReduction("print", Bu::slot( &redPrint ) ); | ||
236 | |||
158 | p.pushLexer( new MathLexer( fIn ) ); | 237 | p.pushLexer( new MathLexer( fIn ) ); |
159 | 238 | ||
160 | p.parse(); | 239 | p.parse(); |