Skip to content

Commit 8e6d11b

Browse files
committed
AST WIP
1 parent 9239b3f commit 8e6d11b

10 files changed

Lines changed: 176 additions & 167 deletions

File tree

include/ps_ast.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ extern "C"
2929
} __attribute__((__packed__)) ps_ast_node_group;
3030

3131
/** @brief Abstract Syntax Tree node kind */
32-
typedef enum enum_ps_ast_node_kind
32+
typedef enum e_ps_ast_node_kind
3333
{
3434
PS_AST_KIND_UNKNOWN = 0, /** @brief Unknown node kind */
3535
PS_AST_PROGRAM, /** @brief BLOCK: PROGRAM */

include/ps_compiler.h

Lines changed: 13 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
#include <string.h>
1111

1212
#include "ps_ast.h"
13-
#include "ps_environment.h"
1413
#include "ps_error.h"
1514
#include "ps_parser.h"
1615
#include "ps_string_heap.h"
@@ -21,13 +20,6 @@ extern "C"
2120
{
2221
#endif
2322

24-
#ifndef PS_COMPILER_ENVIRONMENTS
25-
#define PS_COMPILER_ENVIRONMENTS 1024u
26-
#endif
27-
28-
#define PS_COMPILER_ENVIRONMENT_SYSTEM 0u
29-
#define PS_COMPILER_ENVIRONMENT_PROGRAM 1u
30-
3123
typedef enum e_ps_compiler_debug
3224
{
3325
COMPILER_DEBUG_NONE, /** @brief No debug */
@@ -37,15 +29,15 @@ extern "C"
3729

3830
typedef struct s_ps_compiler
3931
{
40-
ps_parser *parser; /** @brief Parser with lexer(s) with source code buffer(s) */
41-
ps_string_heap *string_heap; /** @brief String heap to hold string constants */
42-
uint16_t level; /** @brief Current environment index : 0 for system, 1 for program, ... */
43-
ps_error error; /** @brief Current error PS_ERROR_XXX */
44-
char message[128]; /** @brief Additional error message */
45-
ps_compiler_debug debug; /** @brief Debug level: NONE, TRACE, VERBOSE */
46-
bool range_check; /** @brief Range checking for integer and real values */
47-
bool bool_eval; /** @brief *FUTURE* Short circuit boolean evaluation */
48-
bool io_check; /** @brief *FUTURE* stop or set IOResult on I/O error */
32+
ps_parser *parser; /** @brief Parser with lexer(s) with source code buffer(s) */
33+
ps_string_heap *string_heap; /** @brief String heap to hold string constants */
34+
ps_error error; /** @brief Current error PS_ERROR_XXX */
35+
ps_symbol_table *system; /** @brief Built-in types, constants, variables, procedures and functions */
36+
char message[128]; /** @brief Additional error message */
37+
ps_compiler_debug debug; /** @brief Debug level: NONE, TRACE, VERBOSE */
38+
bool range_check; /** @brief Range checking for integer and real values */
39+
bool bool_eval; /** @brief *FUTURE* Short circuit boolean evaluation */
40+
bool io_check; /** @brief *FUTURE* stop or set IOResult on I/O error */
4941
} /*__attribute__((__packed__))*/ ps_compiler;
5042

5143
#define PS_COMPILER_SIZEOF sizeof(ps_compiler)
@@ -71,22 +63,13 @@ extern "C"
7163
/** @brief Set formatted message */
7264
bool ps_compiler_set_message(ps_compiler *compiler, char *format, ...); // NOSONAR
7365

74-
/** @brief Create a new environment for program, procedure, function *FUTURE* or unit */
75-
bool ps_compiler_enter_environment(ps_compiler *compiler, ps_identifier name);
76-
77-
/** @brief Release current environment */
78-
bool ps_compiler_exit_environment(ps_compiler *compiler);
79-
80-
/** @brief Get current environment */
81-
ps_environment *ps_compiler_get_environment(ps_compiler *compiler);
82-
83-
/** @brief Find symbol by name in current environment (or its parents if not local) */
84-
ps_symbol *ps_compiler_find_symbol(ps_compiler *compiler, const char *name, bool local);
66+
/** @brief Find symbol by name in current block (or its parents if not local) */
67+
ps_symbol *ps_compiler_find_symbol(ps_compiler *compiler, ps_ast_block *block, const char *name, bool local);
8568

86-
/** @brief Add symbol to current environment */
69+
/** @brief Add symbol to current block */
8770
bool ps_compiler_add_symbol(ps_compiler *compiler, ps_ast_block *block, ps_symbol *symbol);
8871

89-
/** @brief Add variable to current environment, allocate values for arrays */
72+
/** @brief Add variable to current block */
9073
bool ps_compiler_add_variable(ps_compiler *compiler, ps_ast_block *block, const ps_identifier identifier,
9174
ps_symbol *type_symbol);
9275

include/ps_executable.h

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <stdbool.h>
88
#include <stdlib.h>
99

10+
#include "ps_ast.h"
1011
#include "ps_signature.h"
1112
#include "ps_type_definition.h"
1213

@@ -32,26 +33,37 @@ extern "C"
3233
typedef bool (*ps_procedure_file_write)(ps_interpreter *i, FILE *f, const ps_value *v, int16_t w, int16_t p);
3334
typedef bool (*ps_procedure_file_read)(ps_interpreter *i, FILE *f, ps_value *s);
3435

35-
/** @brief Executable is a function or procedure, address is NULL for user defined executables */
36+
typedef enum e_ps_executable_kind
37+
{
38+
PS_EXECUTABLE_FUNC_1ARG,
39+
PS_EXECUTABLE_FUNC_1ARG_S,
40+
PS_EXECUTABLE_FUNC_2ARGS,
41+
PS_EXECUTABLE_PROC_1ARG,
42+
PS_EXECUTABLE_PROC_FILE_READ,
43+
PS_EXECUTABLE_PROC_FILE_WRITE,
44+
PS_EXECUTABLE_FUNC_USER,
45+
PS_EXECUTABLE_PROC_USER,
46+
} __attribute__((__packed__)) ps_executable_kind;
47+
48+
/** @brief Executable is a function or procedure, from system or user defined */
3649
typedef struct s_ps_executable
3750
{
51+
ps_executable_kind kind;
3852
union {
3953
void *address; /** @brief Generic pointer to function/procedure */
4054
ps_function_1arg func_1arg; /** @brief Pointer to system function with 1 value argument */
4155
ps_function_1arg_s func_1arg_s; /** @brief Pointer to system function with 1 symbol argument */
4256
ps_function_2args func_2args; /** @brief Pointer to system function with 2 value arguments */
4357
ps_procedure_1arg proc_1arg; /** @brief Pointer to system procedure with 1 value argument */
4458
ps_procedure_file_read proc_file_read; /** @brief Pointer to "read(file, variable)" system procedure */
45-
ps_procedure_file_write proc_file_write; /** @brief Pointer to "write(file, value)" system procedure */
59+
ps_procedure_file_write proc_file_write; /** @brief Pointer to "write(file, value)" system procedure */
60+
ps_ast_block *block; /** @brief AST block of user defined function or procedure */
4661
};
47-
ps_formal_signature *formal_signature; /** @brief Parameters and return type for user executables */
48-
uint16_t line; /** @brief Line number in source code */
49-
uint16_t column; /** @brief Column number in source code */
5062
} __attribute__((__packed__)) ps_executable;
5163

5264
#define PS_EXECUTABLE_SIZE sizeof(ps_executable)
5365

54-
ps_executable *ps_executable_alloc(ps_formal_signature *formal_signature, uint16_t line, uint16_t column);
66+
ps_executable *ps_executable_alloc(ps_executable_kind kind, ps_ast_block *block);
5567
ps_executable *ps_executable_free(ps_executable *executable);
5668
void ps_executable_debug(FILE *output, char *message, ps_executable *executable);
5769

include/ps_functions.h

Lines changed: 43 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
#include <stdio.h>
1111

1212
#include "ps_interpreter.h"
13+
#include "ps_symbol.h"
14+
#include "ps_symbol_table.h"
1315
#include "ps_value.h"
1416

1517
#ifdef __cplusplus
@@ -53,44 +55,47 @@ extern "C"
5355
// System
5456
extern ps_symbol ps_system_function_get_tick_count;
5557

56-
/** @brief Add base function to system environment */
57-
bool ps_functions_init(ps_environment *system);
58-
59-
ps_error ps_function_exec_1arg (ps_interpreter *interpreter, const ps_symbol *symbol, const ps_value *value, ps_value *result);
60-
ps_error ps_function_exec_1arg_s (ps_interpreter *interpreter, const ps_symbol *symbol, ps_symbol *type, ps_value *result);
61-
ps_error ps_function_exec_2args (ps_interpreter *interpreter, const ps_symbol *symbol, const ps_value *a, const ps_value *b, ps_value *result);
62-
63-
ps_error ps_function_abs (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
64-
ps_error ps_function_arctan (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
65-
ps_error ps_function_cos (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
66-
ps_error ps_function_even (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
67-
ps_error ps_function_exp (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
68-
ps_error ps_function_frac (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
69-
ps_error ps_function_int (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
70-
ps_error ps_function_ln (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
71-
ps_error ps_function_log (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
72-
ps_error ps_function_odd (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
73-
ps_error ps_function_random (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
74-
ps_error ps_function_round (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
75-
ps_error ps_function_sin (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
76-
ps_error ps_function_sqr (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
77-
ps_error ps_function_sqrt (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
78-
ps_error ps_function_tan (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
79-
ps_error ps_function_trunc (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
80-
ps_error ps_function_power (ps_interpreter *interpreter, const ps_value *a, const ps_value *b, ps_value *result);
81-
82-
ps_error ps_function_chr (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
83-
ps_error ps_function_high (ps_interpreter *interpreter, ps_symbol *type, ps_value *result);
84-
ps_error ps_function_low (ps_interpreter *interpreter, ps_symbol *type, ps_value *result);
85-
ps_error ps_function_ord (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
86-
ps_error ps_function_pred (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
87-
ps_error ps_function_succ (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
88-
89-
ps_error ps_function_length (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
90-
ps_error ps_function_lowercase (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
91-
ps_error ps_function_uppercase (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
92-
93-
ps_error ps_function_get_tick_count (ps_interpreter *interpreter, const ps_value *value, ps_value *result);
58+
/** @brief Add base function to system */
59+
bool ps_functions_init(ps_symbol_table *system);
60+
61+
ps_error ps_function_exec_1arg(ps_interpreter *interpreter, const ps_symbol *symbol, const ps_value *value,
62+
ps_value *result);
63+
ps_error ps_function_exec_1arg_s(ps_interpreter *interpreter, const ps_symbol *symbol, ps_symbol *type,
64+
ps_value *result);
65+
ps_error ps_function_exec_2args(ps_interpreter *interpreter, const ps_symbol *symbol, const ps_value *a,
66+
const ps_value *b, ps_value *result);
67+
68+
ps_error ps_function_abs(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
69+
ps_error ps_function_arctan(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
70+
ps_error ps_function_cos(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
71+
ps_error ps_function_even(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
72+
ps_error ps_function_exp(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
73+
ps_error ps_function_frac(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
74+
ps_error ps_function_int(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
75+
ps_error ps_function_ln(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
76+
ps_error ps_function_log(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
77+
ps_error ps_function_odd(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
78+
ps_error ps_function_random(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
79+
ps_error ps_function_round(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
80+
ps_error ps_function_sin(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
81+
ps_error ps_function_sqr(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
82+
ps_error ps_function_sqrt(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
83+
ps_error ps_function_tan(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
84+
ps_error ps_function_trunc(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
85+
ps_error ps_function_power(ps_interpreter *interpreter, const ps_value *a, const ps_value *b, ps_value *result);
86+
87+
ps_error ps_function_chr(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
88+
ps_error ps_function_high(ps_interpreter *interpreter, ps_symbol *type, ps_value *result);
89+
ps_error ps_function_low(ps_interpreter *interpreter, ps_symbol *type, ps_value *result);
90+
ps_error ps_function_ord(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
91+
ps_error ps_function_pred(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
92+
ps_error ps_function_succ(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
93+
94+
ps_error ps_function_length(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
95+
ps_error ps_function_lowercase(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
96+
ps_error ps_function_uppercase(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
97+
98+
ps_error ps_function_get_tick_count(ps_interpreter *interpreter, const ps_value *value, ps_value *result);
9499

95100
/* clang-format on */
96101

include/ps_procedures.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,15 @@
1010
#include <stdio.h>
1111

1212
#include "ps_interpreter.h"
13+
#include "ps_symbol_table.h"
1314
#include "ps_value.h"
1415

1516
#ifdef __cplusplus
1617
extern "C"
1718
{
1819
#endif
1920

20-
bool ps_procedures_init(ps_environment *system);
21+
bool ps_procedures_init(ps_symbol_table *system);
2122

2223
// extern ps_symbol ps_system_procedure_dec;
2324
// extern ps_symbol ps_system_procedure_inc;

include/ps_system.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ extern "C"
4343
.allocated = false}
4444

4545
#define ADD_SYSTEM_SYMBOL(__SYMBOL__) \
46-
if (!ps_environment_add_symbol(system, &__SYMBOL__)) \
46+
if (!ps_system_add_symbol(system, &__SYMBOL__)) \
4747
goto error;
4848

4949
/** @brief Type definition type defintion (!) */
@@ -88,8 +88,9 @@ extern "C"
8888
extern ps_symbol ps_system_constant_unsigned_ps_version_minor;
8989
extern ps_symbol ps_system_constant_unsigned_ps_version_patch;
9090

91-
bool ps_system_init(ps_environment *system);
92-
void ps_system_done(const ps_environment *system);
91+
bool ps_system_init(ps_symbol_table *system);
92+
void ps_system_done(ps_symbol_table *system);
93+
bool ps_system_add_symbol(ps_symbol_table *system, ps_symbol *symbol);
9394

9495
#ifdef __cplusplus
9596
}

0 commit comments

Comments
 (0)