Mercurial > hg > index.cgi
comparison lwbasic/parser.c @ 33:890a8f688889
Basic parsing of local variable decls
author | lost@l-w.ca |
---|---|
date | Thu, 03 Feb 2011 22:15:57 -0700 |
parents | 49d608aecc4d |
children | bfea77812e64 |
comparison
equal
deleted
inserted
replaced
32:49d608aecc4d | 33:890a8f688889 |
---|---|
60 } | 60 } |
61 | 61 |
62 static void parse_decls(cstate *state) | 62 static void parse_decls(cstate *state) |
63 { | 63 { |
64 /* declarations */ | 64 /* declarations */ |
65 switch (state -> lexer_token) | 65 /* the first thing that doesn't look like a declaration is assumed */ |
66 { | 66 /* to be a statement and will trigger a bailout */ |
67 default: | 67 int vt; |
68 return; | 68 char *vn; |
69 symtab_entry_t *se; | |
70 | |
71 for (;;) | |
72 { | |
73 switch (state -> lexer_token) | |
74 { | |
75 /* DIM keyword */ | |
76 case token_kw_dim: | |
77 lexer(state); | |
78 if (state -> lexer_token != token_identifier) | |
79 { | |
80 lwb_error("Expecting identifier, got %s\n", lexer_return_token(state)); | |
81 } | |
82 vn = lw_strdup(state -> lexer_token_string); | |
83 lexer(state); | |
84 if (state -> lexer_token != token_kw_as) | |
85 { | |
86 lwb_error("Expecting AS, got %s\n", lexer_return_token(state)); | |
87 } | |
88 lexer(state); | |
89 vt = parse_type(state); | |
90 | |
91 se = symtab_find(state -> local_syms, vn); | |
92 if (se) | |
93 { | |
94 lwb_error("Multiply defined local variable %s", vn); | |
95 } | |
96 state -> framesize += sizeof_type(vt); | |
97 symtab_register(state -> local_syms, vn, -(state -> framesize), symtype_var, NULL); | |
98 | |
99 lw_free(vn); | |
100 break; | |
101 default: | |
102 return; | |
103 } | |
104 if (state -> lexer_token != token_eol) | |
105 lwb_error("Expecting end of line; got %s", lexer_return_token(state)); | |
106 lexer(state); | |
69 } | 107 } |
70 } | 108 } |
71 | 109 |
72 | 110 |
73 /* issub means RETURNS is not allowed; !issub means RETURNS is required */ | 111 /* issub means RETURNS is not allowed; !issub means RETURNS is required */ |