@@ -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