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