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 |