Skip to content

Commit 03aa115

Browse files
committed
AST WIP
1 parent 3d614c5 commit 03aa115

7 files changed

Lines changed: 100 additions & 125 deletions

File tree

include/ps_compiler.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ extern "C"
7272
void *ps_compiler_return_null(ps_compiler *compiler, ps_error error);
7373

7474
/** @brief Set formatted message */
75-
bool ps_compiler_set_message(ps_compiler *compiler, char *format, ...);
75+
bool ps_compiler_set_message(ps_compiler *compiler, char *format, ...); // NOSONAR
7676

7777
/** @brief Create a new environment for program, procedure, function *FUTURE* or unit */
7878
bool ps_compiler_enter_environment(ps_compiler *compiler, ps_identifier name);

include/ps_parse.h

Lines changed: 25 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -18,40 +18,34 @@ extern "C"
1818
#endif
1919

2020
/* src/ps_parse.c */
21-
bool ps_parse_start(ps_compiler *compiler);
22-
23-
/* src/ps_parse_declaration.c */
24-
bool ps_parse_program(ps_compiler *compiler);
25-
bool ps_parse_uses(ps_compiler *compiler);
26-
bool ps_parse_const(ps_compiler *compiler);
27-
bool ps_parse_type(ps_compiler *compiler);
28-
bool ps_parse_var(ps_compiler *compiler);
29-
bool ps_parse_block(ps_compiler *compiler);
21+
ps_ast_node *ps_parse_start(ps_compiler *compiler);
3022

3123
/* src/ps_parse_executable.c */
32-
bool ps_parse_procedure_or_function_declaration(ps_compiler *compiler, ps_symbol_kind kind);
33-
bool ps_parse_procedure_or_function_call(ps_compiler *compiler, ps_symbol *executable, ps_value *result);
34-
bool ps_parse_variable_reference(ps_compiler *compiler, ps_symbol **variable);
24+
ps_ast_node *ps_parse_procedure_or_function_declaration(ps_compiler *compiler, ps_symbol_kind kind);
25+
ps_ast_node *ps_parse_procedure_or_function_call(ps_compiler *compiler, ps_symbol *executable, ps_value *result);
26+
ps_ast_node *ps_parse_variable_reference(ps_compiler *compiler, ps_symbol **variable);
3527

3628
/* src/ps_parse_expression.c */
37-
bool ps_parse_expression(ps_compiler *compiler, ps_value *result);
38-
bool ps_parse_relational_expression(ps_compiler *compiler, ps_value *result);
39-
bool ps_parse_and_expression(ps_compiler *compiler, ps_value *result);
40-
bool ps_parse_or_expression(ps_compiler *compiler, ps_value *result);
41-
bool ps_parse_simple_expression(ps_compiler *compiler, ps_value *result);
42-
bool ps_parse_term(ps_compiler *compiler, ps_value *result);
43-
bool ps_parse_factor(ps_compiler *compiler, ps_value *result);
44-
bool ps_parse_constant_expression(ps_compiler *compiler, ps_value *constant);
45-
bool ps_parse_function_call(ps_compiler *compiler, ps_symbol *function, ps_value *result);
29+
ps_ast_node *ps_parse_expression(ps_compiler *compiler, ps_value *result);
30+
ps_ast_node *ps_parse_relational_expression(ps_compiler *compiler, ps_value *result);
31+
ps_ast_node *ps_parse_and_expression(ps_compiler *compiler, ps_value *result);
32+
ps_ast_node *ps_parse_or_expression(ps_compiler *compiler, ps_value *result);
33+
ps_ast_node *ps_parse_simple_expression(ps_compiler *compiler, ps_value *result);
34+
ps_ast_node *ps_parse_term(ps_compiler *compiler, ps_value *result);
35+
ps_ast_node *ps_parse_factor(ps_compiler *compiler, ps_value *result);
36+
ps_ast_node *ps_parse_constant_expression(ps_compiler *compiler, ps_value *constant);
37+
ps_ast_node *ps_parse_function_call(ps_compiler *compiler, ps_symbol *function, ps_value *result);
4638

4739
/* src/ps_parse_type.c */
48-
bool ps_parse_type_definition(ps_compiler *compiler);
49-
bool ps_parse_type_reference(ps_compiler *compiler, ps_symbol **type_symbol, const char *type_name);
50-
bool ps_parse_type_reference_enum(ps_compiler *compiler, ps_symbol **type_symbol, const char *type_name);
51-
bool ps_parse_type_reference_subrange(ps_compiler *compiler, ps_symbol **type_symbol, const char *type_name);
52-
bool ps_parse_type_reference_array(ps_compiler *compiler, ps_symbol **type_symbol, const char *type_name);
40+
ps_ast_node *ps_parse_type_definition(ps_compiler *compiler);
41+
ps_ast_node *ps_parse_type_reference(ps_compiler *compiler, ps_symbol **type_symbol, const char *type_name);
42+
ps_ast_node *ps_parse_type_reference_enum(ps_compiler *compiler, ps_symbol **type_symbol, const char *type_name);
43+
ps_ast_node *ps_parse_type_reference_subrange(ps_compiler *compiler, ps_symbol **type_symbol,
44+
const char *type_name);
45+
ps_ast_node *ps_parse_type_reference_array(ps_compiler *compiler, ps_symbol **type_symbol, const char *type_name);
5346

5447
#define PARSE_BEGIN(__PARSE__, __PLUS__) \
48+
ps_ast_node *ast = NULL; \
5549
ps_lexer *lexer = ps_parser_get_lexer(compiler->parser); \
5650
static char *visit = __PARSE__; \
5751
if (compiler->debug >= COMPILER_DEBUG_TRACE) \
@@ -67,13 +61,13 @@ extern "C"
6761
fprintf(stderr, "END\t%-32s %-32s ", visit, __PLUS__); \
6862
ps_token_debug(stderr, "END", &lexer->current_token); \
6963
} \
70-
return true; \
64+
return ast; \
7165
}
7266

7367
#define READ_NEXT_TOKEN \
7468
{ \
7569
if (!ps_lexer_read_token(lexer)) \
76-
return false; \
70+
return NULL; \
7771
if (compiler->debug >= COMPILER_DEBUG_TRACE) \
7872
{ \
7973
fprintf(stderr, "TOKEN\t%-32s %-32s ", "", ""); \
@@ -92,7 +86,7 @@ extern "C"
9286
} \
9387
ps_compiler_set_message(compiler, "Expected '%s'", ps_token_get_keyword(__PS_TOKEN_TYPE__)); \
9488
compiler->error = PS_ERROR_UNEXPECTED_TOKEN; \
95-
return false; \
89+
return NULL; \
9690
}
9791

9892
#define READ_NEXT_TOKEN_OR_CLEANUP \
@@ -129,7 +123,7 @@ extern "C"
129123
fprintf(stderr, "RETURN\t%-32s %-8d ", visit, __PS_ERROR__); \
130124
ps_token_debug(stderr, "RETURN", &lexer->current_token); \
131125
} \
132-
return ps_compiler_return_false(compiler, __PS_ERROR__); \
126+
return ps_compiler_return_null(compiler, __PS_ERROR__); \
133127
}
134128

135129
#define GOTO_CLEANUP(__PS_ERROR__) \
@@ -150,48 +144,7 @@ extern "C"
150144
fprintf(stderr, "ERROR\t%-32s %-32s ", visit, __PLUS__); \
151145
ps_token_debug(stderr, "TRACE", &lexer->current_token); \
152146
} \
153-
return false; \
154-
}
155-
156-
#define SAVE_CURSOR(__LINE__, __COLUMN__) \
157-
if (!ps_lexer_get_cursor(lexer, &__LINE__, &__COLUMN__)) \
158-
TRACE_ERROR("CURSOR!");
159-
160-
#define SAVE_CURSOR_OR_CLEANUP(__LINE__, __COLUMN__) \
161-
if (compiler->debug >= COMPILER_DEBUG_TRACE) \
162-
{ \
163-
fprintf(stderr, "CURSOR\t%-32s %-32s %d %d ", visit, "SAVE", lexer->buffer->current_line, \
164-
lexer->buffer->current_column); \
165-
ps_token_debug(stderr, "TRACE", &lexer->current_token); \
166-
} \
167-
if (!ps_lexer_get_cursor(lexer, &__LINE__, &__COLUMN__)) \
168-
{ \
169-
if (compiler->debug >= COMPILER_DEBUG_TRACE) \
170-
{ \
171-
fprintf(stderr, "ERROR\t%-32s %-32s ", visit, ""); \
172-
ps_token_debug(stderr, "TRACE", &lexer->current_token); \
173-
} \
174-
goto cleanup; \
175-
}
176-
177-
#define RESTORE_CURSOR(__LINE__, __COLUMN__) \
178-
if (compiler->debug >= COMPILER_DEBUG_TRACE) \
179-
{ \
180-
fprintf(stderr, "CURSOR\t%-32s %-32s %d %d ", visit, "RESTORE", __LINE__, __COLUMN__); \
181-
ps_token_debug(stderr, "TRACE", &lexer->current_token); \
182-
} \
183-
if (!ps_lexer_set_cursor(lexer, __LINE__, __COLUMN__)) \
184-
TRACE_ERROR("CURSOR!");
185-
186-
#define TRACE_CURSOR \
187-
if (compiler->debug >= COMPILER_DEBUG_TRACE) \
188-
{ \
189-
uint16_t line = 0; \
190-
uint16_t column = 0; \
191-
if (!ps_lexer_get_cursor(lexer, &line, &column)) \
192-
TRACE_ERROR("CURSOR"); \
193-
fprintf(stderr, "CURSOR\t*** LINE=%d, COLUMN=%d ***\n", line, column); \
194-
ps_token_debug(stderr, "TRACE", &lexer->current_token); \
147+
return NULL; \
195148
}
196149

197150
#ifdef __cplusplus

include/ps_parse_declaration.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@ extern "C"
1818
#endif
1919

2020
/* src/ps_parse_declaration.c */
21-
bool ps_parse_program(ps_compiler *compiler);
22-
bool ps_parse_uses(ps_compiler *compiler);
23-
bool ps_parse_const(ps_compiler *compiler);
24-
bool ps_parse_type(ps_compiler *compiler);
25-
bool ps_parse_var(ps_compiler *compiler);
26-
bool ps_parse_block(ps_compiler *compiler);
21+
ps_ast_node *ps_parse_program(ps_compiler *compiler);
22+
ps_ast_node *ps_parse_uses(ps_compiler *compiler);
23+
ps_ast_node *ps_parse_const(ps_compiler *compiler);
24+
ps_ast_node *ps_parse_type(ps_compiler *compiler);
25+
ps_ast_node *ps_parse_var(ps_compiler *compiler);
26+
ps_ast_node *ps_parse_block(ps_compiler *compiler);
2727

2828
#ifdef __cplusplus
2929
}

include/ps_parse_statement.h

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,18 @@ extern "C"
1717
{
1818
#endif
1919

20-
bool ps_parse_statement(ps_compiler *compiler);
21-
bool ps_parse_compound_statement(ps_compiler *compiler);
22-
bool ps_parse_assignment(ps_compiler *compiler, ps_symbol *variable);
23-
bool ps_parse_read_or_readln(ps_compiler *compiler, bool newline);
24-
bool ps_parse_write_or_writeln(ps_compiler *compiler, bool newline);
25-
bool ps_parse_assignment_or_procedure_call(ps_compiler *compiler);
26-
bool ps_parse_if_then_else(ps_compiler *compiler);
27-
bool ps_parse_repeat_until(ps_compiler *compiler);
28-
bool ps_parse_while_do(ps_compiler *compiler);
29-
bool ps_parse_for_do(ps_compiler *compiler);
30-
bool ps_parse_statement_list(ps_compiler *compiler, ps_token_type stop);
31-
bool ps_parse_statement_or_compound_statement(ps_compiler *compiler);
20+
ps_ast_node *ps_parse_statement(ps_compiler *compiler);
21+
ps_ast_node *ps_parse_compound_statement(ps_compiler *compiler);
22+
ps_ast_node *ps_parse_assignment(ps_compiler *compiler, ps_symbol *variable);
23+
ps_ast_node *ps_parse_read_or_readln(ps_compiler *compiler, bool newline);
24+
ps_ast_node *ps_parse_write_or_writeln(ps_compiler *compiler, bool newline);
25+
ps_ast_node *ps_parse_assignment_or_procedure_call(ps_compiler *compiler);
26+
ps_ast_node *ps_parse_if_then_else(ps_compiler *compiler);
27+
ps_ast_node *ps_parse_repeat_until(ps_compiler *compiler);
28+
ps_ast_node *ps_parse_while_do(ps_compiler *compiler);
29+
ps_ast_node *ps_parse_for_do(ps_compiler *compiler);
30+
ps_ast_node *ps_parse_statement_list(ps_compiler *compiler, ps_token_type stop);
31+
ps_ast_node *ps_parse_statement_or_compound_statement(ps_compiler *compiler);
3232

3333
#ifdef __cplusplus
3434
}

src/ps_parse.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,16 @@
2121
* BLOCK
2222
* '.'
2323
*/
24-
bool ps_parse_start(ps_compiler *compiler)
24+
ps_ast_node *ps_parse_start(ps_compiler *compiler)
2525
{
2626
PARSE_BEGIN("START", "")
2727

2828
READ_NEXT_TOKEN
2929
switch (lexer->current_token.type)
3030
{
3131
case PS_TOKEN_PROGRAM:
32-
if (!ps_parse_program(compiler))
32+
ast = ps_parse_program(compiler);
33+
if (NULL == ast)
3334
TRACE_ERROR("PROGRAM")
3435
break;
3536
case PS_TOKEN_UNIT:

0 commit comments

Comments
 (0)