parser.c

changeset 22
79fb689317ea
parent 20
3f11f764772a
child 24
c3fa6c2785dd
equal deleted inserted replaced
21:6d4282804e73 22:79fb689317ea
67 ntokens++; 67 ntokens++;
68 } 68 }
69 69
70 if(!TOK_IS_OP(tok)){ 70 if(!TOK_IS_OP(tok)){
71 if(ntokens==1 && !had_comma){ 71 if(ntokens==1 && !had_comma){
72 /*if(!TOK_IS_IDENT(tok)){ 72 /* first token */
73 e=E_TOKZ_IDENTIFIER_EXPECTED;
74 goto handle_error;
75 }*/
76
77 had_comma=2; 73 had_comma=2;
78 }else{ 74 }else{
79 if(had_comma==0) 75 if(had_comma==0)
80 goto syntax; 76 goto syntax;
81 77
242 238
243 for(i=0; i<MAX_TOKENS; i++) 239 for(i=0; i<MAX_TOKENS; i++)
244 tok_init(&tokens[i]); 240 tok_init(&tokens[i]);
245 241
246 242
247 /* The loop
248 */
249 while(1){ 243 while(1){
250 had_error=FALSE; 244 had_error=FALSE;
251 245
252 /* free the tokens */ 246 /* free the tokens */
253 while(ntokens--) 247 while(ntokens--)
273 had_error=TRUE; 267 had_error=TRUE;
274 tokz_warn_error(tokz, tokens->line, 268 tokz_warn_error(tokz, tokens->line,
275 E_TOKZ_IDENTIFIER_EXPECTED); 269 E_TOKZ_IDENTIFIER_EXPECTED);
276 } 270 }
277 271
278 if(had_error)
279 break;
280
281 if(t==P_STMT){ 272 if(t==P_STMT){
282 if(find_beg_sect(tokz)) 273 if(find_beg_sect(tokz))
283 t=P_STMT_SECT; 274 t=P_STMT_SECT;
284 } 275 }
276
277 if(had_error)
278 break;
279
280 /* Got the statement and its type */
285 281
286 options=lookup_option(tokz->optstack[tokz->nest_lvl], 282 options=lookup_option(tokz->optstack[tokz->nest_lvl],
287 TOK_IDENT_VAL(tokens+0)); 283 TOK_IDENT_VAL(tokens+0));
288 if(options==NULL) 284 if(options==NULL)
289 options=lookup_option(common_opts, TOK_IDENT_VAL(tokens+0)); 285 options=lookup_option(common_opts, TOK_IDENT_VAL(tokens+0));
295 had_error=!check_args(tokz, tokens, ntokens, options->argfmt); 291 had_error=!check_args(tokz, tokens, ntokens, options->argfmt);
296 } 292 }
297 293
298 if(had_error) 294 if(had_error)
299 break; 295 break;
296
297 /* Found the option and arguments are ok */
300 298
301 if(options->opts!=NULL){ 299 if(options->opts!=NULL){
302 if(t!=P_STMT_SECT){ 300 if(t!=P_STMT_SECT){
303 had_error=TRUE; 301 had_error=TRUE;
304 tokz_warn_error(tokz, tokz->line, E_TOKZ_LBRACE_EXPECTED); 302 tokz_warn_error(tokz, tokz->line, E_TOKZ_LBRACE_EXPECTED);
305 }else if(tokz->nest_lvl==MAX_NEST-1){ 303 }else if(tokz->nest_lvl==MAX_NEST-1){
306 tokz_warn_error(tokz, tokz->line, E_TOKZ_MAX_NEST); 304 tokz_warn_error(tokz, tokz->line, E_TOKZ_MAX_NEST);
307 had_error=TRUE; 305 had_error=TRUE;
308 }else{ 306 }else{
309 tokz->optstack[++tokz->nest_lvl]=options->opts; 307 tokz->nest_lvl++;
308 tokz->optstack[tokz->nest_lvl]=options->opts;
310 } 309 }
311 }else if(t==P_STMT_SECT){ 310 }else if(t==P_STMT_SECT){
312 had_error=TRUE; 311 had_error=TRUE;
313 tokz_warn_error(tokz, tokz->line, E_TOKZ_SYNTAX); 312 tokz_warn_error(tokz, tokz->line, E_TOKZ_SYNTAX);
314 } 313 }
334 errornest++; 333 errornest++;
335 tokz_warn_error(tokz, tokz->line, E_TOKZ_SYNTAX); 334 tokz_warn_error(tokz, tokz->line, E_TOKZ_SYNTAX);
336 break; 335 break;
337 336
338 case P_END_SECT: 337 case P_END_SECT:
339 if(tokz->nest_lvl==0){ 338 if(tokz->nest_lvl+errornest==0){
340 tokz_warn_error(tokz, tokz->line, E_TOKZ_SYNTAX); 339 tokz_warn_error(tokz, tokz->line, E_TOKZ_SYNTAX);
341 had_error=TRUE; 340 had_error=TRUE;
341 }
342
343 if(had_error)
342 break; 344 break;
343 }
344 345
345 if(errornest!=0){ 346 if(errornest!=0){
346 if(errornest==1){
347 call_cancel_sect(tokz, tokz->optstack[tokz->nest_lvl]);
348 tokz->nest_lvl--;
349 }
350 errornest--; 347 errornest--;
351 }else{ 348 }else{
352 if(!had_error) 349 had_error=!call_end_sect(tokz, tokz->optstack[tokz->nest_lvl]);
353 had_error=!call_end_sect(tokz,
354 tokz->optstack[tokz->nest_lvl]);
355
356 tokz->nest_lvl--; 350 tokz->nest_lvl--;
357 } 351 }
358 352
359 if(tokz->nest_lvl<init_nest_lvl) 353 if(tokz->nest_lvl<init_nest_lvl)
360 goto eof; 354 goto eof;
361 } 355 }
362 356
363 if(!had_error) 357 if(!had_error)
364 continue; 358 continue;
365 359
366 if(t==P_STMT_SECT || t==P_END_SECT){ 360 if(t==P_STMT_SECT)
367 errornest++; 361 errornest++;
368 /*if(t==P_END_SECT)
369 tokz->nest_lvl--;*/
370 }
371 362
372 if(!(tokz->flags&TOKZ_ERROR_TOLERANT)) 363 if(!(tokz->flags&TOKZ_ERROR_TOLERANT))
373 break; 364 break;
374 } 365 }
375 366

mercurial