1 // ================================================================ 2 // Miller abstract syntax tree for put and filter. 3 // ================================================================ 4 5 #ifndef EX_AST_H 6 #define EX_AST_H 7 #include "../containers/sllv.h" 8 9 // ---------------------------------------------------------------- 10 typedef enum _ex_ast_node_type_t { 11 MD_AST_NODE_TYPE_STATEMENT_BLOCK, 12 MD_AST_NODE_TYPE_BEGIN, 13 MD_AST_NODE_TYPE_END, 14 MD_AST_NODE_TYPE_STRING_LITERAL, 15 MD_AST_NODE_TYPE_NUMERIC_LITERAL, 16 MD_AST_NODE_TYPE_BOOLEAN_LITERAL, 17 MD_AST_NODE_TYPE_REGEXI, 18 MD_AST_NODE_TYPE_FIELD_NAME, // E.g. $x 19 MD_AST_NODE_TYPE_INDIRECT_FIELD_NAME, // E.g. $[@x] 20 MD_AST_NODE_TYPE_FULL_SREC, 21 MD_AST_NODE_TYPE_OOSVAR_KEYLIST, 22 MD_AST_NODE_TYPE_FULL_OOSVAR, 23 MD_AST_NODE_TYPE_NON_SIGIL_NAME, 24 MD_AST_NODE_TYPE_OPERATOR, 25 MD_AST_NODE_TYPE_SREC_ASSIGNMENT, 26 MD_AST_NODE_TYPE_INDIRECT_SREC_ASSIGNMENT, 27 MD_AST_NODE_TYPE_OOSVAR_ASSIGNMENT, 28 MD_AST_NODE_TYPE_OOSVAR_FROM_FULL_SREC_ASSIGNMENT, 29 MD_AST_NODE_TYPE_FULL_SREC_FROM_OOSVAR_ASSIGNMENT, 30 MD_AST_NODE_TYPE_CONTEXT_VARIABLE, 31 MD_AST_NODE_TYPE_ENV, 32 MD_AST_NODE_TYPE_STRIPPED_AWAY, 33 MD_AST_NODE_TYPE_CONDITIONAL_BLOCK, 34 MD_AST_NODE_TYPE_FILTER, 35 MD_AST_NODE_TYPE_UNSET, 36 MD_AST_NODE_TYPE_EMITF, 37 MD_AST_NODE_TYPE_EMITF_WRITE, 38 MD_AST_NODE_TYPE_EMITF_APPEND, 39 MD_AST_NODE_TYPE_EMITP, 40 MD_AST_NODE_TYPE_EMITP_WRITE, 41 MD_AST_NODE_TYPE_EMITP_APPEND, 42 MD_AST_NODE_TYPE_EMIT, 43 MD_AST_NODE_TYPE_EMIT_WRITE, 44 MD_AST_NODE_TYPE_EMIT_APPEND, 45 MD_AST_NODE_TYPE_EMITP_LASHED, 46 MD_AST_NODE_TYPE_EMITP_LASHED_WRITE, 47 MD_AST_NODE_TYPE_EMITP_LASHED_APPEND, 48 MD_AST_NODE_TYPE_EMIT_LASHED, 49 MD_AST_NODE_TYPE_EMIT_LASHED_WRITE, 50 MD_AST_NODE_TYPE_EMIT_LASHED_APPEND, 51 MD_AST_NODE_TYPE_DUMP, 52 MD_AST_NODE_TYPE_DUMP_WRITE, 53 MD_AST_NODE_TYPE_DUMP_APPEND, 54 MD_AST_NODE_TYPE_EDUMP, 55 MD_AST_NODE_TYPE_PRINT, 56 MD_AST_NODE_TYPE_PRINT_WRITE, 57 MD_AST_NODE_TYPE_PRINT_APPEND, 58 MD_AST_NODE_TYPE_PRINTN, 59 MD_AST_NODE_TYPE_PRINTN_WRITE, 60 MD_AST_NODE_TYPE_PRINTN_APPEND, 61 MD_AST_NODE_TYPE_EPRINT, 62 MD_AST_NODE_TYPE_EPRINTN, 63 MD_AST_NODE_TYPE_ALL, 64 MD_AST_NODE_TYPE_NOP, // only for parser internals; should not be in the AST returned by the parser 65 MD_AST_NODE_TYPE_WHILE, 66 MD_AST_NODE_TYPE_DO_WHILE, 67 MD_AST_NODE_TYPE_FOR_SREC, 68 MD_AST_NODE_TYPE_FOR_OOSVAR, 69 MD_AST_NODE_TYPE_FOR_VARIABLES, 70 MD_AST_NODE_TYPE_NONINDEXED_LOCAL_VARIABLE, 71 MD_AST_NODE_TYPE_IN, 72 MD_AST_NODE_TYPE_BREAK, 73 MD_AST_NODE_TYPE_CONTINUE, 74 MD_AST_NODE_TYPE_IF_HEAD, 75 MD_AST_NODE_TYPE_IF_ITEM, 76 } ex_ast_node_type_t; 77 78 typedef struct _ex_ast_node_t { 79 char* text; 80 ex_ast_node_type_t type; 81 sllv_t* pchildren; 82 } ex_ast_node_t; 83 84 typedef struct _ex_ast_t { 85 ex_ast_node_t* proot; 86 } ex_ast_t; 87 88 // ---------------------------------------------------------------- 89 ex_ast_t* ex_ast_alloc(); 90 91 ex_ast_node_t* ex_ast_node_alloc(char* text, ex_ast_node_type_t type); 92 93 ex_ast_node_t* ex_ast_node_alloc_zary(char* text, ex_ast_node_type_t type); 94 95 ex_ast_node_t* ex_ast_node_alloc_unary(char* text, ex_ast_node_type_t type, ex_ast_node_t* pa); 96 97 ex_ast_node_t* ex_ast_node_alloc_binary(char* text, ex_ast_node_type_t type, 98 ex_ast_node_t* pa, ex_ast_node_t* pb); 99 100 ex_ast_node_t* ex_ast_node_alloc_ternary(char* text, ex_ast_node_type_t type, 101 ex_ast_node_t* pa, ex_ast_node_t* pb, ex_ast_node_t* pc); 102 103 ex_ast_node_t* ex_ast_node_copy(ex_ast_node_t* pother); 104 // These are so the parser can expand '$x += 1' to '$x = $x + 1', etc. 105 ex_ast_node_t* ex_ast_tree_copy(ex_ast_node_t* pother); 106 107 // See comments in ex_parse.y for this seemingly awkward syntax wherein 108 // we change the function name after having set it up. This is a consequence of 109 // bottom-up DSL parsing. 110 ex_ast_node_t* ex_ast_node_prepend_arg(ex_ast_node_t* pa, ex_ast_node_t* pb); 111 ex_ast_node_t* ex_ast_node_append_arg(ex_ast_node_t* pa, ex_ast_node_t* pb); 112 ex_ast_node_t* ex_ast_node_set_function_name(ex_ast_node_t* pa, char* name); 113 114 void ex_ast_print(ex_ast_t* past); 115 void ex_ast_node_print(ex_ast_node_t* pnode); 116 void ex_ast_node_fprint(ex_ast_node_t* pnode, FILE* o); 117 char* ex_ast_node_describe_type(ex_ast_node_type_t type); 118 119 void ex_ast_node_free(ex_ast_node_t* pnode); 120 121 void ex_ast_free(ex_ast_t* past); 122 123 #endif // EX_AST_H 124