1 #ifndef PARSE_H 2 #define PARSE_H 3 /* 4 * Basic parsing data structures. Statements and symbols. 5 * 6 * Copyright (C) 2003 Transmeta Corp. 7 * 2003 Linus Torvalds 8 * 9 * Permission is hereby granted, free of charge, to any person obtaining a copy 10 * of this software and associated documentation files (the "Software"), to deal 11 * in the Software without restriction, including without limitation the rights 12 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 13 * copies of the Software, and to permit persons to whom the Software is 14 * furnished to do so, subject to the following conditions: 15 * 16 * The above copyright notice and this permission notice shall be included in 17 * all copies or substantial portions of the Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 22 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 25 * THE SOFTWARE. 26 */ 27 28 #include "symbol.h" 29 30 enum statement_type { 31 STMT_NONE, 32 STMT_DECLARATION, 33 STMT_EXPRESSION, 34 STMT_COMPOUND, 35 STMT_IF, 36 STMT_RETURN, 37 STMT_CASE, 38 STMT_SWITCH, 39 STMT_ITERATOR, 40 STMT_LABEL, 41 STMT_GOTO, 42 STMT_ASM, 43 STMT_CONTEXT, 44 STMT_RANGE, 45 }; 46 47 struct statement { 48 enum statement_type type; 49 struct position pos; 50 union { 51 struct /* declaration */ { 52 struct symbol_list *declaration; 53 }; 54 struct /* context */ { 55 struct expression *expression; 56 struct expression *context; 57 }; 58 struct /* return_statement */ { 59 struct expression *ret_value; 60 struct symbol *ret_target; 61 }; 62 struct /* if_statement */ { 63 struct expression *if_conditional; 64 struct statement *if_true; 65 struct statement *if_false; 66 }; 67 struct /* compound_struct */ { 68 struct statement_list *stmts; 69 struct symbol *ret; 70 struct symbol *inline_fn; 71 struct statement *args; 72 }; 73 struct /* labeled_struct */ { 74 struct symbol *label_identifier; 75 struct scope *label_scope; 76 struct statement *label_statement; 77 }; 78 struct /* case_struct */ { 79 struct expression *case_expression; 80 struct expression *case_to; 81 struct statement *case_statement; 82 struct symbol *case_label; 83 }; 84 struct /* switch_struct */ { 85 struct expression *switch_expression; 86 struct statement *switch_statement; 87 struct symbol *switch_break, *switch_case; 88 }; 89 struct /* iterator_struct */ { 90 struct symbol *iterator_break; 91 struct symbol *iterator_continue; 92 struct symbol_list *iterator_syms; 93 struct statement *iterator_pre_statement; 94 struct expression *iterator_pre_condition; 95 96 struct statement *iterator_statement; 97 98 struct statement *iterator_post_statement; 99 struct expression *iterator_post_condition; 100 }; 101 struct /* goto_struct */ { 102 struct symbol *goto_label; 103 104 /* computed gotos have these: */ 105 struct expression *goto_expression; 106 struct symbol_list *target_list; 107 }; 108 struct /* asm */ { 109 struct expression *asm_string; 110 struct asm_operand_list *asm_outputs; 111 struct asm_operand_list *asm_inputs; 112 struct expression_list *asm_clobbers; 113 struct symbol_list *asm_labels; 114 }; 115 struct /* range */ { 116 struct expression *range_expression; 117 struct expression *range_low; 118 struct expression *range_high; 119 }; 120 }; 121 }; 122 123 extern struct symbol_list *function_computed_target_list; 124 extern struct statement_list *function_computed_goto_list; 125 126 extern struct token *parse_expression(struct token *, struct expression **); 127 extern struct symbol *label_symbol(struct token *token, int used); 128 extern void check_label_usage(struct symbol *label, struct position use_pos); 129 130 extern int show_statement(struct statement *); 131 extern void show_statement_list(struct statement_list *, const char *); 132 extern int show_expression(struct expression *); 133 134 typedef void (*validate_decl_t)(struct symbol *decl); 135 extern struct token *external_declaration(struct token *, struct symbol_list **, validate_decl_t); 136 137 extern struct symbol *ctype_integer(int size, int want_unsigned); 138 139 extern int inline_function(struct expression *expr, struct symbol *sym); 140 extern void uninline(struct symbol *sym); 141 extern void init_parser(int); 142 143 struct token *expect(struct token *, int, const char *); 144 145 #endif /* PARSE_H */ 146