- 论坛徽章:
- 2
|
前端语法分析部分,如果是手工编写,需要为文法的非终结符编写相应的语法分析函数,根据输入的下一个待处理的单词选择恰当的产生式。在编写这些分析函数的时候,将动作语句嵌入到分析过程中就可以了。比如gcc中,之前是用yacc写的,现在已经改成手写。下面的代码是while语句的分析函数。- /* Parse a while statement (C90 6.6.5, C99 6.8.5).
- while-statement:
- while (expression) statement
- */
- static void
- c_parser_while_statement (c_parser *parser)
- {
- tree block, cond, body, save_break, save_cont;
- location_t loc;
- gcc_assert (c_parser_next_token_is_keyword (parser, RID_WHILE));
- c_parser_consume_token (parser);
- block = c_begin_compound_stmt (flag_isoc99);
- loc = c_parser_peek_token (parser)->location;
- cond = c_parser_paren_condition (parser);
- save_break = c_break_label;
- c_break_label = NULL_TREE;
- save_cont = c_cont_label;
- c_cont_label = NULL_TREE;
- body = c_parser_c99_block_statement (parser);
- c_finish_loop (loc, cond, NULL, body, c_break_label, c_cont_label, true);
- add_stmt (c_end_compound_stmt (loc, block, flag_isoc99));
- c_break_label = save_break;
- c_cont_label = save_cont;
- }
复制代码 这里的c_finish_loop就是执行一个动作。 |
|