Skip to content

Commit c54d087

Browse files
committed
AST WIP
1 parent ccdd561 commit c54d087

5 files changed

Lines changed: 198 additions & 182 deletions

File tree

include/ps_ast.h

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,17 @@ extern "C"
4040
PS_AST_STATEMENT_LIST, /** @brief STATEMENT: List of statements */
4141
PS_AST_ASSIGNMENT, /** @brief STATEMENT: Assignment */
4242
PS_AST_IF, /** @brief STATEMENT: IF */
43+
PS_AST_CASE, /** @brief STATEMENT: CASE */
4344
PS_AST_WHILE, /** @brief STATEMENT: WHILE */
4445
PS_AST_REPEAT, /** @brief STATEMENT: REPEAT */
4546
PS_AST_FOR, /** @brief STATEMENT: FOR */
4647
PS_AST_PROCEDURE_CALL, /** @brief STATEMENT: PROCEDURE call */
4748
PS_AST_UNARY_OPERATION, /** @brief EXPRESSION: Unary operation */
4849
PS_AST_BINARY_OPERATION, /** @brief EXPRESSION: Binary operation */
4950
PS_AST_FUNCTION_CALL, /** @brief EXPRESSION: FUNCTION call */
50-
PS_AST_VALUE, /** @brief EXPRESSION: Value: integer, real, string, boolean, ... */
51-
PS_AST_VARIABLE_SIMPLE, /** @brief EXPRESSION: Simple variable (or constant) being accessed */
52-
PS_AST_VARIABLE_ARRAY, /** @brief EXPRESSION: Array element being accessed */
51+
PS_AST_RVALUE_CONST, /** @brief EXPRESSION: Value: integer, real, string, boolean, ... */
52+
PS_AST_RVALUE_SIMPLE, /** @brief EXPRESSION: Simple variable (or constant) being accessed */
53+
PS_AST_RVALUE_ARRAY, /** @brief EXPRESSION: Array element being accessed */
5354
PS_AST_LVALUE_SIMPLE, /** @brief LVALUE: Simple variable being written to */
5455
PS_AST_LVALUE_ARRAY, /** @brief LVALUE: Array element being written to */
5556
PS_AST_ARG_EXPR, /** @brief ARGUMENT: Expression passed by value */
@@ -61,7 +62,8 @@ extern "C"
6162
ps_ast_node_group group; /** @brief Node group */ \
6263
ps_ast_node_kind kind; /** @brief Node kind */ \
6364
uint16_t line; /** @brief Source code start line number for error reporting, 0 if unknown */ \
64-
uint16_t column; /** @brief Source code start column number for error reporting, 0 if unknown */
65+
uint16_t column; /** @brief Source code start column number for error reporting, 0 if unknown */ \
66+
uint16_t flags; /** @brief Node flags, reserved for future use */
6567

6668
/** @brief Abstract Syntax Tree node */
6769
typedef struct s_ps_ast_node
@@ -83,13 +85,15 @@ extern "C"
8385
ps_symbol *result_type; /** @brief Only for functions, NULL otherwise */
8486
} ps_ast_block;
8587

88+
/** @brief List of statements, single instruction or instructions between BEGIN and END */
8689
typedef struct s_ps_ast_statement_list
8790
{
8891
PS_AST_NODE_COMMON
8992
size_t count; /** @brief Number of statements */
9093
ps_ast_node **statements; /** @brief NULL if no statements */
9194
} ps_ast_statement_list;
9295

96+
/** @brief IF statement */
9397
typedef struct s_ps_ast_if
9498
{
9599
PS_AST_NODE_COMMON
@@ -98,20 +102,23 @@ extern "C"
98102
ps_ast_statement_list *else_branch; /** @brief Statements to execute if condition is false, can be empty */
99103
} ps_ast_if;
100104

105+
/** @brief WHILE statement */
101106
typedef struct s_ps_ast_while
102107
{
103108
PS_AST_NODE_COMMON
104109
ps_ast_node *condition; /** @brief Loop while condition is true */
105110
ps_ast_statement_list *body; /** @brief Statements to execute while condition is true */
106111
} ps_ast_while;
107112

113+
/** @brief REPEAT statement */
108114
typedef struct s_ps_ast_repeat
109115
{
110116
PS_AST_NODE_COMMON
111117
ps_ast_statement_list *body; /** @brief Statements to execute at least once */
112118
ps_ast_node *condition; /** @brief Loop until condition is true */
113119
} ps_ast_repeat;
114120

121+
/** @brief FOR statement */
115122
typedef struct s_ps_ast_for
116123
{
117124
PS_AST_NODE_COMMON
@@ -122,6 +129,7 @@ extern "C"
122129
ps_ast_statement_list *body; /** @brief Statements to execute for each value of loop variable */
123130
} ps_ast_for;
124131

132+
/** @brief Procedure (group STATEMENT) or function (group EXPRESSION) call */
125133
typedef struct s_ps_ast_call
126134
{
127135
PS_AST_NODE_COMMON
@@ -130,51 +138,54 @@ extern "C"
130138
ps_ast_argument **args; /** @brief arguments, NULL if no arguments */
131139
} ps_ast_call;
132140

141+
/** @brief Argument for procedure or function call */
133142
typedef struct s_ps_ast_argument
134143
{
135144
PS_AST_NODE_COMMON
136145
ps_ast_node *arg; /** @brief expression (by value) or variable (by value or by reference)*/
137146
} ps_ast_argument;
138147

148+
/** @brief Assignment statement: LVALUE := EXPRESSION / RVALUE */
139149
typedef struct s_ps_ast_assignment
140150
{
141151
PS_AST_NODE_COMMON
142152
ps_ast_node *lvalue; /** @brief variable being assigned to */
143153
ps_ast_node *expression; /** @brief expression to assign to variable */
144154
} ps_ast_assignment;
145155

146-
/** @brief Expression: literal value */
156+
/** @brief Expression: literal value, can be char, string, integer, real, ... */
147157
typedef struct s_ps_ast_value
148158
{
149159
PS_AST_NODE_COMMON
150160
ps_value value;
151161
} ps_ast_value;
152162

153-
/** @brief Variable or Lvalue: simple variable */
163+
/** @brief Lvalue: simple variable */
154164
/** @example I, Total, ... */
155165
typedef struct s_ps_ast_variable_simple
156166
{
157167
PS_AST_NODE_COMMON
158168
ps_symbol *variable; /** @brief Symbol being referenced */
159169
} ps_ast_variable_simple;
160170

161-
/** @brief Variable or Lvalue: array */
162-
/** @example A[I], A[I, J, K], ... */
171+
/** @brief Lvalue: array value, like A[I], A[I, J, K], ... */
163172
typedef struct s_ps_ast_variable_array
164173
{
165174
PS_AST_NODE_COMMON
166-
ps_symbol *variable; /** @brief Symbol being referenced */
167-
size_t n_indexes; /** @brief For array access, 0 if not an array */
168-
ps_ast_node **indexes; /** @brief For array access, NULL if not an array */
175+
ps_symbol *variable; /** @brief Array being referenced */
176+
size_t n_indexes; /** @brief Number of dimensions */
177+
ps_ast_node **indexes; /** @brief Values for each dimension */
169178
} ps_ast_variable_array;
170179

180+
/** @brief Unary operation: operator and operand */
171181
typedef struct s_ps_ast_unary_operation
172182
{
173183
PS_AST_NODE_COMMON
174184
ps_operator_unary operator;
175185
ps_ast_node *operand;
176186
} ps_ast_unary_operation;
177187

188+
/** @brief Binary operation: operator and operands */
178189
typedef struct s_ps_ast_binary_operation
179190
{
180191
PS_AST_NODE_COMMON
@@ -206,22 +217,21 @@ extern "C"
206217
size_t size);
207218

208219
// clang-format off
209-
ps_ast_block *ps_ast_create_block (uint16_t line, uint16_t column, ps_ast_node_group group, ps_ast_node_kind kind, char *name );
210-
ps_ast_statement_list *ps_ast_create_statement_list (uint16_t line, uint16_t column, ps_ast_node_group group, ps_ast_node_kind kind, size_t count );
211-
ps_ast_assignment *ps_ast_create_assignment (uint16_t line, uint16_t column, ps_ast_node_group group, ps_ast_node_kind kind, ps_ast_node *variable,ps_ast_node *expression );
212-
ps_ast_if *ps_ast_create_if (uint16_t line, uint16_t column, ps_ast_node_group group, ps_ast_node_kind kind, ps_ast_node *condition, ps_ast_statement_list *then_branch, ps_ast_statement_list *else_branch );
213-
ps_ast_while *ps_ast_create_while (uint16_t line, uint16_t column, ps_ast_node_group group, ps_ast_node_kind kind, ps_ast_node *condition, ps_ast_statement_list *body );
214-
ps_ast_repeat *ps_ast_create_repeat (uint16_t line, uint16_t column, ps_ast_statement_list *body, ps_ast_node *condition );
220+
ps_ast_block *ps_ast_create_block (uint16_t line, uint16_t column, ps_ast_node_kind kind, char *name );
221+
ps_ast_statement_list *ps_ast_create_statement_list (uint16_t line, uint16_t column, size_t count );
222+
ps_ast_assignment *ps_ast_create_assignment (uint16_t line, uint16_t column, ps_ast_node_kind kind, ps_ast_node *variable,ps_ast_node *expression );
223+
ps_ast_if *ps_ast_create_if (uint16_t line, uint16_t column, ps_ast_node_kind kind, ps_ast_node *condition, ps_ast_statement_list *then_branch, ps_ast_statement_list *else_branch );
224+
ps_ast_while *ps_ast_create_while (uint16_t line, uint16_t column, ps_ast_node_kind kind, ps_ast_node *condition, ps_ast_statement_list *body );
225+
ps_ast_repeat *ps_ast_create_repeat (uint16_t line, uint16_t column, ps_ast_statement_list *body, ps_ast_node *condition );
215226
ps_ast_for *ps_ast_create_for (uint16_t line, uint16_t column, ps_ast_node_group group, ps_ast_node_kind kind, ps_ast_node *variable, ps_ast_node *start, ps_ast_node *end, int step, ps_ast_statement_list *body );
216-
ps_ast_call *ps_ast_create_procedure_call (uint16_t line, uint16_t column, ps_symbol *executable, size_t n_args, ps_ast_argument *args );
217-
ps_ast_call *ps_ast_create_function_call (uint16_t line, uint16_t column, ps_symbol *executable, size_t n_args, ps_ast_argument *args );
218-
ps_ast_unary_operation *ps_ast_create_unary_operation (uint16_t line, uint16_t column, ps_operator_unary operator, ps_ast_node * operand );
219-
ps_ast_binary_operation *ps_ast_create_binary_operation (uint16_t line, uint16_t column, ps_operator_binary operator, ps_ast_node * left, ps_ast_node *right );
220-
ps_ast_value *ps_ast_create_value (uint16_t line, uint16_t column, ps_value value );
221-
ps_ast_variable_simple *ps_ast_create_variable_simple (uint16_t line, uint16_t column, ps_symbol *variable );
222-
ps_ast_variable_array *ps_ast_create_variable_array (uint16_t line, uint16_t column, ps_symbol *symbol, size_t n_indexes, ps_ast_node *indexes );
223-
ps_ast_variable_simple *ps_ast_create_lvalue_simple (uint16_t line, uint16_t column, ps_symbol *variable );
224-
ps_ast_variable_array *ps_ast_create_lvalue_array (uint16_t line, uint16_t column, ps_symbol *symbol, size_t n_indexes, ps_ast_node *indexes );
227+
ps_ast_call *ps_ast_create_call (uint16_t line, uint16_t column, ps_ast_node_kind kind, ps_symbol *executable, size_t n_args, ps_ast_argument *args[] );
228+
ps_ast_unary_operation *ps_ast_create_unary_operation (uint16_t line, uint16_t column, ps_operator_unary operator, ps_ast_node * operand );
229+
ps_ast_binary_operation *ps_ast_create_binary_operation (uint16_t line, uint16_t column, ps_operator_binary operator, ps_ast_node * left, ps_ast_node *right );
230+
ps_ast_value *ps_ast_create_rvalue_const (uint16_t line, uint16_t column, ps_value value );
231+
ps_ast_variable_simple *ps_ast_create_variable_simple (uint16_t line, uint16_t column, ps_symbol *variable );
232+
ps_ast_variable_array *ps_ast_create_variable_array (uint16_t line, uint16_t column, ps_symbol *symbol, size_t n_indexes, ps_ast_node *indexes );
233+
ps_ast_variable_simple *ps_ast_create_lvalue_simple (uint16_t line, uint16_t column, ps_symbol *variable );
234+
ps_ast_variable_array *ps_ast_create_lvalue_array (uint16_t line, uint16_t column, ps_symbol *symbol, size_t n_indexes, ps_ast_node *indexes );
225235
// clang-format on
226236

227237
/** @brief Free an AST node and all its children */

0 commit comments

Comments
 (0)