1*10465441SEvalZero /*
2*10465441SEvalZero * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero *
4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero *
6*10465441SEvalZero * Change Logs:
7*10465441SEvalZero * Date Author Notes
8*10465441SEvalZero * 2010-03-22 Bernard first version
9*10465441SEvalZero * 2013-10-09 Bernard fix the command line too long issue.
10*10465441SEvalZero */
11*10465441SEvalZero #include <finsh.h>
12*10465441SEvalZero
13*10465441SEvalZero #include "finsh_token.h"
14*10465441SEvalZero #include "finsh_node.h"
15*10465441SEvalZero #include "finsh_error.h"
16*10465441SEvalZero #include "finsh_parser.h"
17*10465441SEvalZero #include "finsh_var.h"
18*10465441SEvalZero
19*10465441SEvalZero /*
20*10465441SEvalZero * the structure of abstract syntax tree:
21*10465441SEvalZero * root____________
22*10465441SEvalZero * | \
23*10465441SEvalZero * child__ sibling__
24*10465441SEvalZero * | \ | \
25*10465441SEvalZero * child sibling child sibling
26*10465441SEvalZero * ...
27*10465441SEvalZero */
28*10465441SEvalZero static enum finsh_type proc_type(struct finsh_parser* self);
29*10465441SEvalZero static int proc_identifier(struct finsh_parser* self, char* id);
30*10465441SEvalZero static struct finsh_node* proc_variable_decl(struct finsh_parser* self);
31*10465441SEvalZero static struct finsh_node* proc_expr(struct finsh_parser* self);
32*10465441SEvalZero static struct finsh_node* proc_assign_expr(struct finsh_parser* self);
33*10465441SEvalZero static struct finsh_node* proc_inclusive_or_expr(struct finsh_parser* self);
34*10465441SEvalZero static struct finsh_node* proc_exclusive_or_expr(struct finsh_parser* self);
35*10465441SEvalZero static struct finsh_node* proc_and_expr(struct finsh_parser* self);
36*10465441SEvalZero static struct finsh_node* proc_shift_expr(struct finsh_parser* self);
37*10465441SEvalZero static struct finsh_node* proc_additive_expr(struct finsh_parser* self);
38*10465441SEvalZero static struct finsh_node* proc_multiplicative_expr(struct finsh_parser* self);
39*10465441SEvalZero static struct finsh_node* proc_cast_expr(struct finsh_parser* self);
40*10465441SEvalZero static struct finsh_node* proc_unary_expr(struct finsh_parser* self);
41*10465441SEvalZero static struct finsh_node* proc_postfix_expr(struct finsh_parser* self);
42*10465441SEvalZero static struct finsh_node* proc_primary_expr(struct finsh_parser* self);
43*10465441SEvalZero static struct finsh_node* proc_param_list(struct finsh_parser* self);
44*10465441SEvalZero static struct finsh_node* proc_expr_statement(struct finsh_parser* self);
45*10465441SEvalZero static struct finsh_node* make_sys_node(uint8_t type, struct finsh_node* node1,
46*10465441SEvalZero struct finsh_node* node2);
47*10465441SEvalZero
48*10465441SEvalZero /* check token */
49*10465441SEvalZero #define check_token(token, lex, type) if ( (token) != (type) ) \
50*10465441SEvalZero { \
51*10465441SEvalZero finsh_error_set(FINSH_ERROR_INVALID_TOKEN); \
52*10465441SEvalZero finsh_token_replay(lex); \
53*10465441SEvalZero }
54*10465441SEvalZero
55*10465441SEvalZero /* is the token a data type? */
56*10465441SEvalZero #define is_base_type(token) ((token) == finsh_token_type_void \
57*10465441SEvalZero || (token) == finsh_token_type_char \
58*10465441SEvalZero || (token) == finsh_token_type_short \
59*10465441SEvalZero || (token) == finsh_token_type_int \
60*10465441SEvalZero || (token) == finsh_token_type_long)
61*10465441SEvalZero
62*10465441SEvalZero /* get the next token */
63*10465441SEvalZero #define next_token(token, lex) (token) = finsh_token_token(lex)
64*10465441SEvalZero
65*10465441SEvalZero /* match a specified token */
66*10465441SEvalZero #define match_token(token, lex, type) next_token(token, lex); \
67*10465441SEvalZero check_token(token, lex, type)
68*10465441SEvalZero
69*10465441SEvalZero /*
70*10465441SEvalZero process for function and variable declaration.
71*10465441SEvalZero decl_variable -> type declaration_list ';'
72*10465441SEvalZero declarator_list -> declarator_list ',' declarator
73*10465441SEvalZero | declarator
74*10465441SEvalZero declarator -> identifier
75*10465441SEvalZero | identifier ASSIGN expr_assign
76*10465441SEvalZero */
proc_variable_decl(struct finsh_parser * self)77*10465441SEvalZero static struct finsh_node* proc_variable_decl(struct finsh_parser* self)
78*10465441SEvalZero {
79*10465441SEvalZero enum finsh_token_type token;
80*10465441SEvalZero enum finsh_type type;
81*10465441SEvalZero char id[FINSH_NAME_MAX + 1];
82*10465441SEvalZero
83*10465441SEvalZero struct finsh_node *node;
84*10465441SEvalZero struct finsh_node *end;
85*10465441SEvalZero struct finsh_node *assign;
86*10465441SEvalZero
87*10465441SEvalZero node = NULL;
88*10465441SEvalZero end = NULL;
89*10465441SEvalZero
90*10465441SEvalZero /* get type */
91*10465441SEvalZero type = proc_type(self);
92*10465441SEvalZero
93*10465441SEvalZero /*process id.*/
94*10465441SEvalZero if (proc_identifier(self, id) == 0)
95*10465441SEvalZero {
96*10465441SEvalZero /* if add variable failed */
97*10465441SEvalZero if (finsh_var_insert(id, type) < 0)
98*10465441SEvalZero {
99*10465441SEvalZero finsh_error_set(FINSH_ERROR_VARIABLE_EXIST);
100*10465441SEvalZero }
101*10465441SEvalZero }
102*10465441SEvalZero
103*10465441SEvalZero next_token(token, &(self->token));
104*10465441SEvalZero switch ( token )
105*10465441SEvalZero {
106*10465441SEvalZero case finsh_token_type_comma:/*',', it's a variable_list declaration.*/
107*10465441SEvalZero if (proc_identifier(self, id) == 0)
108*10465441SEvalZero {
109*10465441SEvalZero /* if add variable failed */
110*10465441SEvalZero if (finsh_var_insert(id, type) < 0)
111*10465441SEvalZero {
112*10465441SEvalZero finsh_error_set(FINSH_ERROR_VARIABLE_EXIST);
113*10465441SEvalZero }
114*10465441SEvalZero }
115*10465441SEvalZero
116*10465441SEvalZero next_token(token, &(self->token));
117*10465441SEvalZero if ( token == finsh_token_type_assign )
118*10465441SEvalZero {
119*10465441SEvalZero /* get the right side of assign expression */
120*10465441SEvalZero assign = proc_assign_expr(self);
121*10465441SEvalZero
122*10465441SEvalZero if (assign != NULL)
123*10465441SEvalZero {
124*10465441SEvalZero struct finsh_node* idnode;
125*10465441SEvalZero
126*10465441SEvalZero idnode = finsh_node_new_id(id);
127*10465441SEvalZero end = make_sys_node(FINSH_NODE_SYS_ASSIGN, idnode, assign);
128*10465441SEvalZero node = end;
129*10465441SEvalZero
130*10465441SEvalZero next_token(token, &(self->token));
131*10465441SEvalZero }
132*10465441SEvalZero }
133*10465441SEvalZero
134*10465441SEvalZero while ( token == finsh_token_type_comma )
135*10465441SEvalZero {
136*10465441SEvalZero if (proc_identifier(self, id) == 0)
137*10465441SEvalZero {
138*10465441SEvalZero /* if add variable failed */
139*10465441SEvalZero if (finsh_var_insert(id, type) < 0)
140*10465441SEvalZero {
141*10465441SEvalZero finsh_error_set(FINSH_ERROR_VARIABLE_EXIST);
142*10465441SEvalZero }
143*10465441SEvalZero }
144*10465441SEvalZero
145*10465441SEvalZero next_token(token, &(self->token));
146*10465441SEvalZero if ( token == finsh_token_type_assign )
147*10465441SEvalZero {
148*10465441SEvalZero /* get the right side of assign expression */
149*10465441SEvalZero assign = proc_assign_expr(self);
150*10465441SEvalZero
151*10465441SEvalZero if (assign != NULL)
152*10465441SEvalZero {
153*10465441SEvalZero struct finsh_node* idnode;
154*10465441SEvalZero
155*10465441SEvalZero idnode = finsh_node_new_id(id);
156*10465441SEvalZero
157*10465441SEvalZero /* make assign expression node */
158*10465441SEvalZero if (node != NULL)
159*10465441SEvalZero {
160*10465441SEvalZero finsh_node_sibling(end) = make_sys_node(FINSH_NODE_SYS_ASSIGN, idnode, assign);
161*10465441SEvalZero end = finsh_node_sibling(end);
162*10465441SEvalZero }
163*10465441SEvalZero else
164*10465441SEvalZero {
165*10465441SEvalZero end = make_sys_node(FINSH_NODE_SYS_ASSIGN, idnode, assign);
166*10465441SEvalZero node = end;
167*10465441SEvalZero }
168*10465441SEvalZero
169*10465441SEvalZero next_token(token, &(self->token));
170*10465441SEvalZero }
171*10465441SEvalZero }
172*10465441SEvalZero }
173*10465441SEvalZero
174*10465441SEvalZero check_token(token, &(self->token), finsh_token_type_semicolon);
175*10465441SEvalZero return node;
176*10465441SEvalZero
177*10465441SEvalZero case finsh_token_type_assign:/*'=', it's a variable with assign declaration.*/
178*10465441SEvalZero {
179*10465441SEvalZero struct finsh_node *idnode;
180*10465441SEvalZero
181*10465441SEvalZero assign = proc_assign_expr(self);
182*10465441SEvalZero if (assign != NULL)
183*10465441SEvalZero {
184*10465441SEvalZero idnode = finsh_node_new_id(id);
185*10465441SEvalZero
186*10465441SEvalZero /* make assign expression node */
187*10465441SEvalZero end = make_sys_node(FINSH_NODE_SYS_ASSIGN, idnode, assign);
188*10465441SEvalZero node = end;
189*10465441SEvalZero
190*10465441SEvalZero next_token(token, &(self->token));
191*10465441SEvalZero }
192*10465441SEvalZero
193*10465441SEvalZero while ( token == finsh_token_type_comma )
194*10465441SEvalZero {
195*10465441SEvalZero if (proc_identifier(self, id) == 0)
196*10465441SEvalZero {
197*10465441SEvalZero /* if add variable failed */
198*10465441SEvalZero if (finsh_var_insert(id, type) < 0)
199*10465441SEvalZero {
200*10465441SEvalZero finsh_error_set(FINSH_ERROR_VARIABLE_EXIST);
201*10465441SEvalZero }
202*10465441SEvalZero }
203*10465441SEvalZero
204*10465441SEvalZero next_token(token, &(self->token));
205*10465441SEvalZero if (token == finsh_token_type_assign)
206*10465441SEvalZero {
207*10465441SEvalZero /* get the right side of assign expression */
208*10465441SEvalZero assign = proc_assign_expr(self);
209*10465441SEvalZero
210*10465441SEvalZero if (assign != NULL)
211*10465441SEvalZero {
212*10465441SEvalZero idnode = finsh_node_new_id(id);
213*10465441SEvalZero
214*10465441SEvalZero /* make assign expression node */
215*10465441SEvalZero if (node != NULL)
216*10465441SEvalZero {
217*10465441SEvalZero finsh_node_sibling(end) = make_sys_node(FINSH_NODE_SYS_ASSIGN, idnode, assign);
218*10465441SEvalZero end = finsh_node_sibling(end);
219*10465441SEvalZero }
220*10465441SEvalZero else
221*10465441SEvalZero {
222*10465441SEvalZero end = make_sys_node(FINSH_NODE_SYS_ASSIGN, idnode, assign);
223*10465441SEvalZero node = end;
224*10465441SEvalZero }
225*10465441SEvalZero
226*10465441SEvalZero next_token(token, &(self->token));
227*10465441SEvalZero }
228*10465441SEvalZero }
229*10465441SEvalZero }
230*10465441SEvalZero
231*10465441SEvalZero check_token(token, &(self->token), finsh_token_type_semicolon);
232*10465441SEvalZero return node;
233*10465441SEvalZero }
234*10465441SEvalZero
235*10465441SEvalZero case finsh_token_type_semicolon:/*';', it's a variable declaration.*/
236*10465441SEvalZero return node;
237*10465441SEvalZero
238*10465441SEvalZero default:
239*10465441SEvalZero finsh_error_set(FINSH_ERROR_EXPECT_TYPE);
240*10465441SEvalZero
241*10465441SEvalZero return NULL;
242*10465441SEvalZero }
243*10465441SEvalZero }
244*10465441SEvalZero
245*10465441SEvalZero /*
246*10465441SEvalZero type -> type_prefix type_basic | type_basic
247*10465441SEvalZero type_prefix -> UNSIGNED
248*10465441SEvalZero type_basic -> VOID
249*10465441SEvalZero | CHAR
250*10465441SEvalZero | SHORT
251*10465441SEvalZero | INT
252*10465441SEvalZero | STRING
253*10465441SEvalZero */
proc_type(struct finsh_parser * self)254*10465441SEvalZero static enum finsh_type proc_type(struct finsh_parser* self)
255*10465441SEvalZero {
256*10465441SEvalZero enum finsh_type type;
257*10465441SEvalZero enum finsh_token_type token;
258*10465441SEvalZero
259*10465441SEvalZero /* set init type */
260*10465441SEvalZero type = finsh_type_unknown;
261*10465441SEvalZero
262*10465441SEvalZero next_token(token, &(self->token));
263*10465441SEvalZero if ( is_base_type(token) ) /* base_type */
264*10465441SEvalZero {
265*10465441SEvalZero switch (token)
266*10465441SEvalZero {
267*10465441SEvalZero case finsh_token_type_void:
268*10465441SEvalZero type = finsh_type_void;
269*10465441SEvalZero break;
270*10465441SEvalZero
271*10465441SEvalZero case finsh_token_type_char:
272*10465441SEvalZero type = finsh_type_char;
273*10465441SEvalZero break;
274*10465441SEvalZero
275*10465441SEvalZero case finsh_token_type_short:
276*10465441SEvalZero type = finsh_type_short;
277*10465441SEvalZero break;
278*10465441SEvalZero
279*10465441SEvalZero case finsh_token_type_int:
280*10465441SEvalZero type = finsh_type_int;
281*10465441SEvalZero break;
282*10465441SEvalZero
283*10465441SEvalZero case finsh_token_type_long:
284*10465441SEvalZero type = finsh_type_long;
285*10465441SEvalZero break;
286*10465441SEvalZero
287*10465441SEvalZero default:
288*10465441SEvalZero goto __return;
289*10465441SEvalZero }
290*10465441SEvalZero }
291*10465441SEvalZero else if ( token == finsh_token_type_unsigned ) /* unsigned base_type */
292*10465441SEvalZero {
293*10465441SEvalZero next_token(token, &(self->token));
294*10465441SEvalZero if ( is_base_type(token) )
295*10465441SEvalZero {
296*10465441SEvalZero switch (token)
297*10465441SEvalZero {
298*10465441SEvalZero case finsh_token_type_char:
299*10465441SEvalZero type = finsh_type_uchar;
300*10465441SEvalZero break;
301*10465441SEvalZero
302*10465441SEvalZero case finsh_token_type_short:
303*10465441SEvalZero type = finsh_type_ushort;
304*10465441SEvalZero break;
305*10465441SEvalZero
306*10465441SEvalZero case finsh_token_type_int:
307*10465441SEvalZero type = finsh_type_uint;
308*10465441SEvalZero break;
309*10465441SEvalZero
310*10465441SEvalZero case finsh_token_type_long:
311*10465441SEvalZero type = finsh_type_ulong;
312*10465441SEvalZero break;
313*10465441SEvalZero
314*10465441SEvalZero default:
315*10465441SEvalZero goto __return;
316*10465441SEvalZero }
317*10465441SEvalZero }
318*10465441SEvalZero else
319*10465441SEvalZero {
320*10465441SEvalZero finsh_token_replay(&(self->token));
321*10465441SEvalZero finsh_error_set(FINSH_ERROR_EXPECT_TYPE);
322*10465441SEvalZero }
323*10465441SEvalZero }
324*10465441SEvalZero else
325*10465441SEvalZero {
326*10465441SEvalZero goto __return;
327*10465441SEvalZero }
328*10465441SEvalZero
329*10465441SEvalZero /* parse for pointer */
330*10465441SEvalZero next_token(token, &(self->token));
331*10465441SEvalZero if (token == finsh_token_type_mul)
332*10465441SEvalZero {
333*10465441SEvalZero switch (type)
334*10465441SEvalZero {
335*10465441SEvalZero case finsh_type_void:
336*10465441SEvalZero type = finsh_type_voidp;
337*10465441SEvalZero break;
338*10465441SEvalZero
339*10465441SEvalZero case finsh_type_char:
340*10465441SEvalZero case finsh_type_uchar:
341*10465441SEvalZero type = finsh_type_charp;
342*10465441SEvalZero break;
343*10465441SEvalZero
344*10465441SEvalZero case finsh_type_short:
345*10465441SEvalZero case finsh_type_ushort:
346*10465441SEvalZero type = finsh_type_shortp;
347*10465441SEvalZero break;
348*10465441SEvalZero
349*10465441SEvalZero case finsh_type_int:
350*10465441SEvalZero case finsh_type_uint:
351*10465441SEvalZero type = finsh_type_intp;
352*10465441SEvalZero break;
353*10465441SEvalZero
354*10465441SEvalZero case finsh_type_long:
355*10465441SEvalZero case finsh_type_ulong:
356*10465441SEvalZero type = finsh_type_longp;
357*10465441SEvalZero break;
358*10465441SEvalZero
359*10465441SEvalZero default:
360*10465441SEvalZero type = finsh_type_voidp;
361*10465441SEvalZero break;
362*10465441SEvalZero }
363*10465441SEvalZero }
364*10465441SEvalZero else finsh_token_replay(&(self->token));
365*10465441SEvalZero
366*10465441SEvalZero return type;
367*10465441SEvalZero
368*10465441SEvalZero __return:
369*10465441SEvalZero finsh_token_replay(&(self->token));
370*10465441SEvalZero finsh_error_set(FINSH_ERROR_UNKNOWN_TYPE);
371*10465441SEvalZero
372*10465441SEvalZero return type;
373*10465441SEvalZero }
374*10465441SEvalZero
375*10465441SEvalZero /*
376*10465441SEvalZero identifier -> IDENTIFIER
377*10465441SEvalZero */
proc_identifier(struct finsh_parser * self,char * id)378*10465441SEvalZero static int proc_identifier(struct finsh_parser* self, char* id)
379*10465441SEvalZero {
380*10465441SEvalZero enum finsh_token_type token;
381*10465441SEvalZero
382*10465441SEvalZero match_token(token, &(self->token), finsh_token_type_identifier);
383*10465441SEvalZero
384*10465441SEvalZero strncpy(id, (char*)self->token.string, FINSH_NAME_MAX);
385*10465441SEvalZero
386*10465441SEvalZero return 0;
387*10465441SEvalZero }
388*10465441SEvalZero
389*10465441SEvalZero /*
390*10465441SEvalZero statement_expr -> ';'
391*10465441SEvalZero | expr ';'
392*10465441SEvalZero */
proc_expr_statement(struct finsh_parser * self)393*10465441SEvalZero static struct finsh_node* proc_expr_statement(struct finsh_parser* self)
394*10465441SEvalZero {
395*10465441SEvalZero enum finsh_token_type token;
396*10465441SEvalZero struct finsh_node* expr;
397*10465441SEvalZero
398*10465441SEvalZero expr = NULL;
399*10465441SEvalZero next_token(token, &(self->token));
400*10465441SEvalZero if ( token != finsh_token_type_semicolon )
401*10465441SEvalZero {
402*10465441SEvalZero finsh_token_replay(&(self->token));
403*10465441SEvalZero expr = proc_expr(self);
404*10465441SEvalZero
405*10465441SEvalZero match_token(token, &(self->token), finsh_token_type_semicolon);
406*10465441SEvalZero }
407*10465441SEvalZero
408*10465441SEvalZero return expr;
409*10465441SEvalZero }
410*10465441SEvalZero
411*10465441SEvalZero /*
412*10465441SEvalZero expr -> expr_assign
413*10465441SEvalZero */
proc_expr(struct finsh_parser * self)414*10465441SEvalZero static struct finsh_node* proc_expr(struct finsh_parser* self)
415*10465441SEvalZero {
416*10465441SEvalZero return proc_assign_expr(self);
417*10465441SEvalZero }
418*10465441SEvalZero
419*10465441SEvalZero /*
420*10465441SEvalZero expr_assign -> expr_inclusive_or
421*10465441SEvalZero | expr_unary ASSIGN expr_assign
422*10465441SEvalZero */
proc_assign_expr(struct finsh_parser * self)423*10465441SEvalZero static struct finsh_node* proc_assign_expr(struct finsh_parser* self)
424*10465441SEvalZero {
425*10465441SEvalZero enum finsh_token_type token;
426*10465441SEvalZero struct finsh_node* or;
427*10465441SEvalZero struct finsh_node* assign;
428*10465441SEvalZero
429*10465441SEvalZero or = proc_inclusive_or_expr(self);
430*10465441SEvalZero
431*10465441SEvalZero next_token(token, &(self->token));
432*10465441SEvalZero
433*10465441SEvalZero if (token == finsh_token_type_assign)
434*10465441SEvalZero {
435*10465441SEvalZero assign = proc_assign_expr(self);
436*10465441SEvalZero
437*10465441SEvalZero return make_sys_node(FINSH_NODE_SYS_ASSIGN, or, assign);
438*10465441SEvalZero }
439*10465441SEvalZero else finsh_token_replay(&(self->token));
440*10465441SEvalZero
441*10465441SEvalZero return or;
442*10465441SEvalZero }
443*10465441SEvalZero
444*10465441SEvalZero /*
445*10465441SEvalZero expr_inclusive_or -> expr_exclusive_or
446*10465441SEvalZero | expr_inclusive_or '|' expr_exclusive_or
447*10465441SEvalZero */
proc_inclusive_or_expr(struct finsh_parser * self)448*10465441SEvalZero static struct finsh_node* proc_inclusive_or_expr(struct finsh_parser* self)
449*10465441SEvalZero {
450*10465441SEvalZero enum finsh_token_type token;
451*10465441SEvalZero struct finsh_node* xor;
452*10465441SEvalZero struct finsh_node* xor_new;
453*10465441SEvalZero
454*10465441SEvalZero xor = proc_exclusive_or_expr(self);
455*10465441SEvalZero
456*10465441SEvalZero next_token(token, &(self->token));
457*10465441SEvalZero while ( token == finsh_token_type_or )
458*10465441SEvalZero {
459*10465441SEvalZero xor_new = proc_exclusive_or_expr(self);
460*10465441SEvalZero
461*10465441SEvalZero if (xor_new == NULL) finsh_error_set(FINSH_ERROR_EXPECT_OPERATOR);
462*10465441SEvalZero else xor = make_sys_node(FINSH_NODE_SYS_OR, xor, xor_new);
463*10465441SEvalZero
464*10465441SEvalZero next_token(token, &(self->token));
465*10465441SEvalZero }
466*10465441SEvalZero
467*10465441SEvalZero finsh_token_replay(&(self->token));
468*10465441SEvalZero return xor;
469*10465441SEvalZero }
470*10465441SEvalZero
471*10465441SEvalZero /*
472*10465441SEvalZero expr_exclusive_or -> expr_and
473*10465441SEvalZero | expr_exclusive '^' expr_and
474*10465441SEvalZero */
proc_exclusive_or_expr(struct finsh_parser * self)475*10465441SEvalZero static struct finsh_node* proc_exclusive_or_expr(struct finsh_parser* self)
476*10465441SEvalZero {
477*10465441SEvalZero enum finsh_token_type token;
478*10465441SEvalZero struct finsh_node* and;
479*10465441SEvalZero struct finsh_node* and_new;
480*10465441SEvalZero
481*10465441SEvalZero and = proc_and_expr(self);
482*10465441SEvalZero next_token(token, &(self->token));
483*10465441SEvalZero while ( token == finsh_token_type_xor )
484*10465441SEvalZero {
485*10465441SEvalZero and_new = proc_and_expr(self);
486*10465441SEvalZero if (and_new == NULL) finsh_error_set(FINSH_ERROR_EXPECT_OPERATOR);
487*10465441SEvalZero else and = make_sys_node(FINSH_NODE_SYS_XOR, and, and_new);
488*10465441SEvalZero
489*10465441SEvalZero next_token(token, &(self->token));
490*10465441SEvalZero }
491*10465441SEvalZero
492*10465441SEvalZero finsh_token_replay(&(self->token));
493*10465441SEvalZero return and;
494*10465441SEvalZero }
495*10465441SEvalZero
496*10465441SEvalZero /*
497*10465441SEvalZero expr_and -> expr_shift
498*10465441SEvalZero | expr_and '&' expr_shift
499*10465441SEvalZero */
proc_and_expr(struct finsh_parser * self)500*10465441SEvalZero static struct finsh_node* proc_and_expr(struct finsh_parser* self)
501*10465441SEvalZero {
502*10465441SEvalZero enum finsh_token_type token;
503*10465441SEvalZero struct finsh_node* shift;
504*10465441SEvalZero struct finsh_node* shift_new;
505*10465441SEvalZero
506*10465441SEvalZero shift = proc_shift_expr(self);
507*10465441SEvalZero
508*10465441SEvalZero next_token(token, &(self->token));
509*10465441SEvalZero while ( token == finsh_token_type_and )
510*10465441SEvalZero {
511*10465441SEvalZero shift_new = proc_shift_expr(self);
512*10465441SEvalZero
513*10465441SEvalZero if (shift_new == NULL) finsh_error_set(FINSH_ERROR_EXPECT_OPERATOR);
514*10465441SEvalZero else shift = make_sys_node(FINSH_NODE_SYS_AND, shift, shift_new);
515*10465441SEvalZero
516*10465441SEvalZero next_token(token, &(self->token));
517*10465441SEvalZero }
518*10465441SEvalZero
519*10465441SEvalZero finsh_token_replay(&(self->token));
520*10465441SEvalZero return shift;
521*10465441SEvalZero }
522*10465441SEvalZero
523*10465441SEvalZero /*
524*10465441SEvalZero expr_shift -> expr_additive
525*10465441SEvalZero | expr_shift '<<' expr_additive
526*10465441SEvalZero | expr_shift '>>' expr_additive
527*10465441SEvalZero */
proc_shift_expr(struct finsh_parser * self)528*10465441SEvalZero static struct finsh_node* proc_shift_expr(struct finsh_parser* self)
529*10465441SEvalZero {
530*10465441SEvalZero enum finsh_token_type token;
531*10465441SEvalZero struct finsh_node* add;
532*10465441SEvalZero struct finsh_node* add_new;
533*10465441SEvalZero
534*10465441SEvalZero add = proc_additive_expr(self);
535*10465441SEvalZero
536*10465441SEvalZero next_token(token, &(self->token));
537*10465441SEvalZero while ( token == finsh_token_type_shl || token == finsh_token_type_shr)
538*10465441SEvalZero {
539*10465441SEvalZero add_new = proc_additive_expr(self);
540*10465441SEvalZero if (add_new == NULL) finsh_error_set(FINSH_ERROR_EXPECT_OPERATOR);
541*10465441SEvalZero else
542*10465441SEvalZero {
543*10465441SEvalZero switch (token)
544*10465441SEvalZero {
545*10465441SEvalZero case finsh_token_type_shl:
546*10465441SEvalZero add = make_sys_node(FINSH_NODE_SYS_SHL, add, add_new);
547*10465441SEvalZero break;
548*10465441SEvalZero case finsh_token_type_shr:
549*10465441SEvalZero add = make_sys_node(FINSH_NODE_SYS_SHR, add, add_new);
550*10465441SEvalZero break;
551*10465441SEvalZero default:
552*10465441SEvalZero finsh_error_set(FINSH_ERROR_EXPECT_OPERATOR);
553*10465441SEvalZero break;
554*10465441SEvalZero }
555*10465441SEvalZero }
556*10465441SEvalZero next_token(token, &(self->token));
557*10465441SEvalZero }
558*10465441SEvalZero
559*10465441SEvalZero finsh_token_replay(&(self->token));
560*10465441SEvalZero return add;
561*10465441SEvalZero }
562*10465441SEvalZero
563*10465441SEvalZero /*
564*10465441SEvalZero expr_additive -> expr_multiplicative
565*10465441SEvalZero | expr_additive SUB expr_multiplicative
566*10465441SEvalZero | expr_additive ADD expr_multiplicative
567*10465441SEvalZero */
proc_additive_expr(struct finsh_parser * self)568*10465441SEvalZero static struct finsh_node* proc_additive_expr(struct finsh_parser* self)
569*10465441SEvalZero {
570*10465441SEvalZero enum finsh_token_type token;
571*10465441SEvalZero struct finsh_node* mul;
572*10465441SEvalZero struct finsh_node* mul_new;
573*10465441SEvalZero
574*10465441SEvalZero mul = proc_multiplicative_expr(self);
575*10465441SEvalZero
576*10465441SEvalZero next_token(token, &(self->token));
577*10465441SEvalZero while ( token == finsh_token_type_sub || token == finsh_token_type_add )
578*10465441SEvalZero {
579*10465441SEvalZero mul_new = proc_multiplicative_expr(self);
580*10465441SEvalZero if (mul_new == NULL) finsh_error_set(FINSH_ERROR_EXPECT_OPERATOR);
581*10465441SEvalZero else
582*10465441SEvalZero {
583*10465441SEvalZero switch (token)
584*10465441SEvalZero {
585*10465441SEvalZero case finsh_token_type_sub:
586*10465441SEvalZero mul = make_sys_node(FINSH_NODE_SYS_SUB, mul, mul_new);
587*10465441SEvalZero break;
588*10465441SEvalZero case finsh_token_type_add:
589*10465441SEvalZero mul = make_sys_node(FINSH_NODE_SYS_ADD, mul, mul_new);
590*10465441SEvalZero break;
591*10465441SEvalZero default:
592*10465441SEvalZero finsh_error_set(FINSH_ERROR_EXPECT_OPERATOR);
593*10465441SEvalZero break;
594*10465441SEvalZero }
595*10465441SEvalZero }
596*10465441SEvalZero next_token(token, &(self->token));
597*10465441SEvalZero }
598*10465441SEvalZero
599*10465441SEvalZero finsh_token_replay(&(self->token));
600*10465441SEvalZero return mul;
601*10465441SEvalZero }
602*10465441SEvalZero
603*10465441SEvalZero /*
604*10465441SEvalZero expr_multiplicative -> expr_cast
605*10465441SEvalZero | expr_multiplicative '*' expr_cast
606*10465441SEvalZero | expr_multiplicative '/' expr_cast
607*10465441SEvalZero | expr_multiplicative '%' expr_cast
608*10465441SEvalZero */
proc_multiplicative_expr(struct finsh_parser * self)609*10465441SEvalZero static struct finsh_node* proc_multiplicative_expr(struct finsh_parser* self)
610*10465441SEvalZero {
611*10465441SEvalZero enum finsh_token_type token;
612*10465441SEvalZero struct finsh_node* cast;
613*10465441SEvalZero struct finsh_node* cast_new;
614*10465441SEvalZero
615*10465441SEvalZero cast = proc_cast_expr(self);
616*10465441SEvalZero next_token(token, &(self->token));
617*10465441SEvalZero while (token == finsh_token_type_mul ||
618*10465441SEvalZero token == finsh_token_type_div ||
619*10465441SEvalZero token == finsh_token_type_mod )
620*10465441SEvalZero {
621*10465441SEvalZero cast_new = proc_cast_expr(self);
622*10465441SEvalZero if (cast_new == NULL) finsh_error_set(FINSH_ERROR_EXPECT_OPERATOR);
623*10465441SEvalZero else
624*10465441SEvalZero {
625*10465441SEvalZero switch (token)
626*10465441SEvalZero {
627*10465441SEvalZero case finsh_token_type_mul:
628*10465441SEvalZero cast = make_sys_node(FINSH_NODE_SYS_MUL, cast, cast_new);
629*10465441SEvalZero break;
630*10465441SEvalZero
631*10465441SEvalZero case finsh_token_type_div:
632*10465441SEvalZero cast = make_sys_node(FINSH_NODE_SYS_DIV, cast, cast_new);
633*10465441SEvalZero break;
634*10465441SEvalZero
635*10465441SEvalZero case finsh_token_type_mod:
636*10465441SEvalZero cast = make_sys_node(FINSH_NODE_SYS_MOD, cast, cast_new);
637*10465441SEvalZero break;
638*10465441SEvalZero
639*10465441SEvalZero default:
640*10465441SEvalZero finsh_error_set(FINSH_ERROR_EXPECT_OPERATOR);
641*10465441SEvalZero break;
642*10465441SEvalZero }
643*10465441SEvalZero }
644*10465441SEvalZero next_token(token, &(self->token));
645*10465441SEvalZero }
646*10465441SEvalZero
647*10465441SEvalZero finsh_token_replay(&(self->token));
648*10465441SEvalZero return cast;
649*10465441SEvalZero }
650*10465441SEvalZero
651*10465441SEvalZero /*
652*10465441SEvalZero 20060313, add recast parse
653*10465441SEvalZero expr_cast -> expr_unary
654*10465441SEvalZero | '(' type ')' expr_cast
655*10465441SEvalZero */
proc_cast_expr(struct finsh_parser * self)656*10465441SEvalZero static struct finsh_node* proc_cast_expr(struct finsh_parser* self)
657*10465441SEvalZero {
658*10465441SEvalZero enum finsh_token_type token;
659*10465441SEvalZero enum finsh_type type;
660*10465441SEvalZero struct finsh_node* cast;
661*10465441SEvalZero
662*10465441SEvalZero next_token(token, &(self->token));
663*10465441SEvalZero if (token == finsh_token_type_left_paren)
664*10465441SEvalZero {
665*10465441SEvalZero type = proc_type(self);
666*10465441SEvalZero match_token(token, &(self->token), finsh_token_type_right_paren);
667*10465441SEvalZero
668*10465441SEvalZero cast = proc_cast_expr(self);
669*10465441SEvalZero if (cast != NULL)
670*10465441SEvalZero {
671*10465441SEvalZero cast->data_type = type;
672*10465441SEvalZero return cast;
673*10465441SEvalZero }
674*10465441SEvalZero }
675*10465441SEvalZero
676*10465441SEvalZero finsh_token_replay(&(self->token));
677*10465441SEvalZero return proc_unary_expr(self);
678*10465441SEvalZero }
679*10465441SEvalZero
680*10465441SEvalZero /*
681*10465441SEvalZero 20050921, add '*' and '&'
682*10465441SEvalZero expr_unary -> expr_postfix
683*10465441SEvalZero | ADD expr_cast
684*10465441SEvalZero | INC expr_cast
685*10465441SEvalZero | SUB expr_cast
686*10465441SEvalZero | DEC expr_cast
687*10465441SEvalZero | '~' expr_cast
688*10465441SEvalZero | '*' expr_cast
689*10465441SEvalZero | '&' expr_cast
690*10465441SEvalZero */
proc_unary_expr(struct finsh_parser * self)691*10465441SEvalZero static struct finsh_node* proc_unary_expr(struct finsh_parser* self)
692*10465441SEvalZero {
693*10465441SEvalZero enum finsh_token_type token;
694*10465441SEvalZero struct finsh_node *cast;
695*10465441SEvalZero
696*10465441SEvalZero next_token(token, &(self->token));
697*10465441SEvalZero switch (token)
698*10465441SEvalZero {
699*10465441SEvalZero case finsh_token_type_add: /* + */
700*10465441SEvalZero cast = proc_cast_expr(self);
701*10465441SEvalZero return cast;
702*10465441SEvalZero
703*10465441SEvalZero case finsh_token_type_inc: /* ++ */
704*10465441SEvalZero cast = proc_cast_expr(self);
705*10465441SEvalZero return make_sys_node(FINSH_NODE_SYS_PREINC, cast, NULL);
706*10465441SEvalZero
707*10465441SEvalZero case finsh_token_type_sub: /* - */
708*10465441SEvalZero cast = proc_cast_expr(self);
709*10465441SEvalZero return make_sys_node(FINSH_NODE_SYS_SUB, finsh_node_new_long(0), cast);
710*10465441SEvalZero
711*10465441SEvalZero case finsh_token_type_dec: /* -- */
712*10465441SEvalZero cast = proc_cast_expr(self);
713*10465441SEvalZero return make_sys_node(FINSH_NODE_SYS_PREDEC, cast, NULL);
714*10465441SEvalZero
715*10465441SEvalZero case finsh_token_type_bitwise: /* ~ */
716*10465441SEvalZero cast = proc_cast_expr(self);
717*10465441SEvalZero return make_sys_node(FINSH_NODE_SYS_BITWISE, cast, NULL);
718*10465441SEvalZero
719*10465441SEvalZero case finsh_token_type_mul: /* * */
720*10465441SEvalZero cast = proc_cast_expr(self);
721*10465441SEvalZero return make_sys_node(FINSH_NODE_SYS_GETVALUE, cast, NULL);
722*10465441SEvalZero
723*10465441SEvalZero case finsh_token_type_and: /* & */
724*10465441SEvalZero cast = proc_cast_expr(self);
725*10465441SEvalZero return make_sys_node(FINSH_NODE_SYS_GETADDR, cast, NULL);
726*10465441SEvalZero
727*10465441SEvalZero default:
728*10465441SEvalZero finsh_token_replay(&(self->token));
729*10465441SEvalZero return proc_postfix_expr(self);
730*10465441SEvalZero }
731*10465441SEvalZero }
732*10465441SEvalZero
733*10465441SEvalZero /*
734*10465441SEvalZero expr_postfix -> expr_primary
735*10465441SEvalZero | expr_postfix INC
736*10465441SEvalZero | expr_postfix DEC
737*10465441SEvalZero | expr_postfix '(' param_list ')'
738*10465441SEvalZero */
proc_postfix_expr(struct finsh_parser * self)739*10465441SEvalZero static struct finsh_node* proc_postfix_expr(struct finsh_parser* self)
740*10465441SEvalZero {
741*10465441SEvalZero enum finsh_token_type token;
742*10465441SEvalZero struct finsh_node* postfix;
743*10465441SEvalZero
744*10465441SEvalZero postfix = proc_primary_expr(self);
745*10465441SEvalZero
746*10465441SEvalZero next_token(token, &(self->token));
747*10465441SEvalZero while ( token == finsh_token_type_inc ||
748*10465441SEvalZero token == finsh_token_type_dec ||
749*10465441SEvalZero token == finsh_token_type_left_paren )
750*10465441SEvalZero {
751*10465441SEvalZero switch (token)
752*10465441SEvalZero {
753*10465441SEvalZero case finsh_token_type_inc :/* '++' */
754*10465441SEvalZero postfix = make_sys_node(FINSH_NODE_SYS_INC, postfix, NULL);
755*10465441SEvalZero break;
756*10465441SEvalZero
757*10465441SEvalZero case finsh_token_type_dec :/* '--' */
758*10465441SEvalZero postfix = make_sys_node(FINSH_NODE_SYS_DEC, postfix, NULL);
759*10465441SEvalZero break;
760*10465441SEvalZero
761*10465441SEvalZero case finsh_token_type_left_paren :/* '(' */
762*10465441SEvalZero {
763*10465441SEvalZero struct finsh_node* param_list;
764*10465441SEvalZero
765*10465441SEvalZero param_list = NULL;
766*10465441SEvalZero next_token(token, &(self->token));
767*10465441SEvalZero if (token != finsh_token_type_right_paren)
768*10465441SEvalZero {
769*10465441SEvalZero finsh_token_replay(&(self->token));
770*10465441SEvalZero param_list = proc_param_list(self);
771*10465441SEvalZero
772*10465441SEvalZero match_token(token, &(self->token), finsh_token_type_right_paren);
773*10465441SEvalZero }
774*10465441SEvalZero
775*10465441SEvalZero postfix = make_sys_node(FINSH_NODE_SYS_FUNC, postfix, param_list);
776*10465441SEvalZero }
777*10465441SEvalZero break;
778*10465441SEvalZero
779*10465441SEvalZero default:
780*10465441SEvalZero break;
781*10465441SEvalZero }
782*10465441SEvalZero
783*10465441SEvalZero next_token(token, &(self->token));
784*10465441SEvalZero }
785*10465441SEvalZero
786*10465441SEvalZero finsh_token_replay(&(self->token));
787*10465441SEvalZero return postfix;
788*10465441SEvalZero }
789*10465441SEvalZero
790*10465441SEvalZero /*
791*10465441SEvalZero expr_primary -> literal
792*10465441SEvalZero | '(' expr ')'
793*10465441SEvalZero | identifier
794*10465441SEvalZero */
proc_primary_expr(struct finsh_parser * self)795*10465441SEvalZero static struct finsh_node* proc_primary_expr(struct finsh_parser* self)
796*10465441SEvalZero {
797*10465441SEvalZero enum finsh_token_type token;
798*10465441SEvalZero struct finsh_node* expr;
799*10465441SEvalZero
800*10465441SEvalZero next_token(token, &(self->token));
801*10465441SEvalZero switch ( token )
802*10465441SEvalZero {
803*10465441SEvalZero case finsh_token_type_identifier:
804*10465441SEvalZero {
805*10465441SEvalZero char id[FINSH_NAME_MAX + 1];
806*10465441SEvalZero
807*10465441SEvalZero finsh_token_replay(&(self->token));
808*10465441SEvalZero proc_identifier(self, id);
809*10465441SEvalZero return finsh_node_new_id(id);
810*10465441SEvalZero }
811*10465441SEvalZero
812*10465441SEvalZero case finsh_token_type_left_paren:
813*10465441SEvalZero expr = proc_expr(self);
814*10465441SEvalZero match_token(token, &(self->token), finsh_token_type_right_paren);
815*10465441SEvalZero return expr;
816*10465441SEvalZero
817*10465441SEvalZero case finsh_token_type_value_int:
818*10465441SEvalZero return finsh_node_new_int(self->token.value.int_value);
819*10465441SEvalZero
820*10465441SEvalZero case finsh_token_type_value_long:
821*10465441SEvalZero return finsh_node_new_long(self->token.value.long_value);
822*10465441SEvalZero
823*10465441SEvalZero case finsh_token_type_value_char:
824*10465441SEvalZero return finsh_node_new_char(self->token.value.char_value);
825*10465441SEvalZero
826*10465441SEvalZero case finsh_token_type_value_string:
827*10465441SEvalZero return finsh_node_new_string((char*)self->token.string);
828*10465441SEvalZero
829*10465441SEvalZero case finsh_token_type_value_null:
830*10465441SEvalZero return finsh_node_new_ptr(NULL);
831*10465441SEvalZero
832*10465441SEvalZero default:
833*10465441SEvalZero finsh_error_set(FINSH_ERROR_INVALID_TOKEN);
834*10465441SEvalZero break;
835*10465441SEvalZero }
836*10465441SEvalZero
837*10465441SEvalZero return NULL;
838*10465441SEvalZero }
839*10465441SEvalZero
840*10465441SEvalZero /*
841*10465441SEvalZero param_list -> empty
842*10465441SEvalZero | expr_assign
843*10465441SEvalZero | param_list ',' expr_assign
844*10465441SEvalZero */
proc_param_list(struct finsh_parser * self)845*10465441SEvalZero static struct finsh_node* proc_param_list(struct finsh_parser* self)
846*10465441SEvalZero {
847*10465441SEvalZero enum finsh_token_type token;
848*10465441SEvalZero struct finsh_node *node, *assign;
849*10465441SEvalZero
850*10465441SEvalZero assign = proc_assign_expr(self);
851*10465441SEvalZero if (assign == NULL) return NULL;
852*10465441SEvalZero node = assign;
853*10465441SEvalZero
854*10465441SEvalZero next_token(token, &(self->token));
855*10465441SEvalZero while (token == finsh_token_type_comma )
856*10465441SEvalZero {
857*10465441SEvalZero finsh_node_sibling(assign) = proc_assign_expr(self);
858*10465441SEvalZero
859*10465441SEvalZero if (finsh_node_sibling(assign) != NULL) assign = finsh_node_sibling(assign);
860*10465441SEvalZero else finsh_error_set(FINSH_ERROR_EXPECT_OPERATOR);
861*10465441SEvalZero
862*10465441SEvalZero next_token(token, &(self->token));
863*10465441SEvalZero }
864*10465441SEvalZero
865*10465441SEvalZero finsh_token_replay(&(self->token));
866*10465441SEvalZero
867*10465441SEvalZero return node;
868*10465441SEvalZero }
869*10465441SEvalZero
870*10465441SEvalZero /*
871*10465441SEvalZero make a new node as following tree:
872*10465441SEvalZero new_node
873*10465441SEvalZero |
874*10465441SEvalZero node1__
875*10465441SEvalZero \
876*10465441SEvalZero node2
877*10465441SEvalZero */
make_sys_node(uint8_t type,struct finsh_node * node1,struct finsh_node * node2)878*10465441SEvalZero static struct finsh_node* make_sys_node(uint8_t type, struct finsh_node* node1, struct finsh_node* node2)
879*10465441SEvalZero {
880*10465441SEvalZero struct finsh_node* node;
881*10465441SEvalZero
882*10465441SEvalZero node = finsh_node_allocate(type);
883*10465441SEvalZero
884*10465441SEvalZero if ((node1 != NULL) && (node != NULL))
885*10465441SEvalZero {
886*10465441SEvalZero finsh_node_child(node) = node1;
887*10465441SEvalZero finsh_node_sibling(node1) = node2;
888*10465441SEvalZero }
889*10465441SEvalZero else finsh_error_set(FINSH_ERROR_NULL_NODE);
890*10465441SEvalZero
891*10465441SEvalZero return node;
892*10465441SEvalZero }
893*10465441SEvalZero
894*10465441SEvalZero /*
895*10465441SEvalZero start -> statement_expr | decl_variable
896*10465441SEvalZero */
finsh_parser_run(struct finsh_parser * self,const uint8_t * string)897*10465441SEvalZero void finsh_parser_run(struct finsh_parser* self, const uint8_t* string)
898*10465441SEvalZero {
899*10465441SEvalZero enum finsh_token_type token;
900*10465441SEvalZero struct finsh_node *node;
901*10465441SEvalZero
902*10465441SEvalZero node = NULL;
903*10465441SEvalZero
904*10465441SEvalZero /* init parser */
905*10465441SEvalZero self->parser_string = (uint8_t*)string;
906*10465441SEvalZero
907*10465441SEvalZero /* init token */
908*10465441SEvalZero finsh_token_init(&(self->token), self->parser_string);
909*10465441SEvalZero
910*10465441SEvalZero /* get next token */
911*10465441SEvalZero next_token(token, &(self->token));
912*10465441SEvalZero while (token != finsh_token_type_eof && token != finsh_token_type_bad)
913*10465441SEvalZero {
914*10465441SEvalZero switch (token)
915*10465441SEvalZero {
916*10465441SEvalZero case finsh_token_type_identifier:
917*10465441SEvalZero /* process expr_statement */
918*10465441SEvalZero finsh_token_replay(&(self->token));
919*10465441SEvalZero
920*10465441SEvalZero if (self->root != NULL)
921*10465441SEvalZero {
922*10465441SEvalZero finsh_node_sibling(node) = proc_expr_statement(self);
923*10465441SEvalZero if (finsh_node_sibling(node) != NULL)
924*10465441SEvalZero node = finsh_node_sibling(node);
925*10465441SEvalZero }
926*10465441SEvalZero else
927*10465441SEvalZero {
928*10465441SEvalZero node = proc_expr_statement(self);
929*10465441SEvalZero self->root = node;
930*10465441SEvalZero }
931*10465441SEvalZero break;
932*10465441SEvalZero
933*10465441SEvalZero default:
934*10465441SEvalZero if (is_base_type(token) || token == finsh_token_type_unsigned)
935*10465441SEvalZero {
936*10465441SEvalZero /* variable decl */
937*10465441SEvalZero finsh_token_replay(&(self->token));
938*10465441SEvalZero
939*10465441SEvalZero if (self->root != NULL)
940*10465441SEvalZero {
941*10465441SEvalZero finsh_node_sibling(node) = proc_variable_decl(self);
942*10465441SEvalZero if (finsh_node_sibling(node) != NULL)
943*10465441SEvalZero node = finsh_node_sibling(node);
944*10465441SEvalZero }
945*10465441SEvalZero else
946*10465441SEvalZero {
947*10465441SEvalZero node = proc_variable_decl(self);
948*10465441SEvalZero self->root = node;
949*10465441SEvalZero }
950*10465441SEvalZero }
951*10465441SEvalZero else
952*10465441SEvalZero {
953*10465441SEvalZero /* process expr_statement */
954*10465441SEvalZero finsh_token_replay(&(self->token));
955*10465441SEvalZero
956*10465441SEvalZero if (self->root != NULL)
957*10465441SEvalZero {
958*10465441SEvalZero finsh_node_sibling(node) = proc_expr_statement(self);
959*10465441SEvalZero if (finsh_node_sibling(node) != NULL)
960*10465441SEvalZero node = finsh_node_sibling(node);
961*10465441SEvalZero else next_token(token, &(self->token));
962*10465441SEvalZero }
963*10465441SEvalZero else
964*10465441SEvalZero {
965*10465441SEvalZero node = proc_expr_statement(self);
966*10465441SEvalZero self->root = node;
967*10465441SEvalZero }
968*10465441SEvalZero }
969*10465441SEvalZero
970*10465441SEvalZero break;
971*10465441SEvalZero }
972*10465441SEvalZero
973*10465441SEvalZero /* no root found, break out */
974*10465441SEvalZero if (self->root == NULL) break;
975*10465441SEvalZero
976*10465441SEvalZero /* get next token */
977*10465441SEvalZero next_token(token, &(self->token));
978*10465441SEvalZero }
979*10465441SEvalZero }
980*10465441SEvalZero
finsh_parser_init(struct finsh_parser * self)981*10465441SEvalZero int finsh_parser_init(struct finsh_parser* self)
982*10465441SEvalZero {
983*10465441SEvalZero memset(self, 0, sizeof(struct finsh_parser));
984*10465441SEvalZero
985*10465441SEvalZero return 0;
986*10465441SEvalZero }
987