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 */