Skip to content

Commit 00c0258

Browse files
committed
AST WIP
1 parent 03aa115 commit 00c0258

4 files changed

Lines changed: 50 additions & 25 deletions

File tree

include/ps_lexer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ extern "C"
2121
{
2222
ps_buffer *buffer;
2323
ps_error error;
24+
uint16_t token_line;
25+
uint16_t token_column;
2426
ps_token current_token;
2527
} ps_lexer;
2628

include/ps_parse.h

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ extern "C"
4545
ps_ast_node *ps_parse_type_reference_array(ps_compiler *compiler, ps_symbol **type_symbol, const char *type_name);
4646

4747
#define PARSE_BEGIN(__PARSE__, __PLUS__) \
48-
ps_ast_node *ast = NULL; \
4948
ps_lexer *lexer = ps_parser_get_lexer(compiler->parser); \
5049
static char *visit = __PARSE__; \
5150
if (compiler->debug >= COMPILER_DEBUG_TRACE) \
@@ -61,13 +60,33 @@ extern "C"
6160
fprintf(stderr, "END\t%-32s %-32s ", visit, __PLUS__); \
6261
ps_token_debug(stderr, "END", &lexer->current_token); \
6362
} \
64-
return ast; \
63+
return true; \
6564
}
6665

67-
#define READ_NEXT_TOKEN \
66+
#define PARSE_BEGIN_AST(__AST__, __PARSE__, __PLUS__) \
67+
__AST__ *ast = NULL; \
68+
ps_lexer *lexer = ps_parser_get_lexer(compiler->parser); \
69+
static char *visit = __PARSE__; \
70+
if (compiler->debug >= COMPILER_DEBUG_TRACE) \
71+
{ \
72+
fprintf(stderr, "BEGIN\t%-32s %-32s ", visit, __PLUS__); \
73+
ps_token_debug(stderr, "BEGIN", &lexer->current_token); \
74+
}
75+
76+
#define PARSE_END_AST(__PLUS__) \
77+
{ \
78+
if (compiler->debug >= COMPILER_DEBUG_TRACE) \
79+
{ \
80+
fprintf(stderr, "END\t%-32s %-32s ", visit, __PLUS__); \
81+
ps_token_debug(stderr, "END", &lexer->current_token); \
82+
} \
83+
return (ps_ast_node *)ast; \
84+
}
85+
86+
#define READ_NEXT_TOKEN(__RETURN__) \
6887
{ \
6988
if (!ps_lexer_read_token(lexer)) \
70-
return NULL; \
89+
return __RETURN__; \
7190
if (compiler->debug >= COMPILER_DEBUG_TRACE) \
7291
{ \
7392
fprintf(stderr, "TOKEN\t%-32s %-32s ", "", ""); \

src/ps_lexer.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,8 @@ bool ps_lexer_read_token(ps_lexer *lexer)
423423
return false;
424424
char current_char = ps_buffer_peek_char(lexer->buffer);
425425
char next_char = ps_buffer_peek_next_char(lexer->buffer);
426+
lexer->token_line = lexer->buffer->current_line;
427+
lexer->token_column = lexer->buffer->current_char;
426428
if (isdigit(current_char) || current_char == '%' || current_char == '&' || current_char == '$')
427429
{
428430
if (!ps_lexer_read_number(lexer))

src/ps_parse_declaration.c

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,34 +14,35 @@
1414
#include "ps_token.h"
1515

1616
/**
17-
* Parse program parameters (identifiers in parentheses)
17+
* Parse/skip program parameters
18+
* [ '(' [ IDENTIFIER [ ',' IDENTIFIER ]* ] ')']
1819
*/
19-
static ps_ast_node *ps_parse_program_parameters(ps_compiler *compiler)
20+
static bool ps_parse_program_parameters(ps_compiler *compiler)
2021
{
2122
PARSE_BEGIN("PROGRAM", "PARAMETERS")
2223

2324
// Empty list?
2425
if (lexer->current_token.type == PS_TOKEN_LEFT_PARENTHESIS)
2526
{
26-
READ_NEXT_TOKEN
27+
READ_NEXT_TOKEN(false)
2728
if (lexer->current_token.type == PS_TOKEN_RIGHT_PARENTHESIS)
2829
{
29-
READ_NEXT_TOKEN
30+
READ_NEXT_TOKEN(false)
3031
PARSE_END("OK")
3132
}
3233
}
3334
bool loop = true;
3435
do
3536
{
3637
EXPECT_TOKEN(PS_TOKEN_IDENTIFIER)
37-
READ_NEXT_TOKEN
38+
READ_NEXT_TOKEN(false)
3839
switch (lexer->current_token.type)
3940
{
4041
case PS_TOKEN_COMMA:
41-
READ_NEXT_TOKEN
42+
READ_NEXT_TOKEN(false)
4243
break;
4344
case PS_TOKEN_RIGHT_PARENTHESIS:
44-
READ_NEXT_TOKEN
45+
READ_NEXT_TOKEN(false)
4546
loop = false;
4647
break;
4748
default:
@@ -55,11 +56,11 @@ static ps_ast_node *ps_parse_program_parameters(ps_compiler *compiler)
5556
/**
5657
* Parse program declaration:
5758
* PROGRAM IDENTIFIER [ '(' [ IDENTIFIER [ ',' IDENTIFIER ]* ] ')'] ';'
58-
* identifiers are ignored
59+
* BLOCK '.'
5960
*/
6061
ps_ast_node *ps_parse_program(ps_compiler *compiler)
6162
{
62-
PARSE_BEGIN("PROGRAM", "")
63+
PARSE_BEGIN_AST(ps_ast_block, "PROGRAM", "")
6364
uint16_t line = lexer->buffer->current_line;
6465
uint16_t column = lexer->buffer->current_column;
6566

@@ -68,21 +69,22 @@ ps_ast_node *ps_parse_program(ps_compiler *compiler)
6869

6970
// 'PROGRAM'
7071
EXPECT_TOKEN(PS_TOKEN_PROGRAM)
71-
READ_NEXT_TOKEN
72+
READ_NEXT_TOKEN(NULL)
7273

7374
// IDENTIFIER
7475
EXPECT_TOKEN(PS_TOKEN_IDENTIFIER)
7576
COPY_IDENTIFIER(identifier)
76-
READ_NEXT_TOKEN
77+
READ_NEXT_TOKEN(NULL)
7778

7879
// Skip optional parameters enclosed in parentheses
79-
ps_parse_program_parameters(compiler);
80-
if (compiler->error != PS_ERROR_NONE)
80+
if (!ps_parse_program_parameters(compiler))
8181
TRACE_ERROR("PARAMETERS")
82+
83+
// ;
8284
EXPECT_TOKEN(PS_TOKEN_SEMI_COLON)
83-
READ_NEXT_TOKEN
85+
READ_NEXT_TOKEN(NULL)
8486

85-
// Register program in symbol table and visit its block
87+
// Register program in symbol table of new environment
8688
if (!ps_compiler_enter_environment(compiler, identifier))
8789
TRACE_ERROR("ENTER ENVIRONMENT")
8890
symbol_program = ps_symbol_alloc(PS_SYMBOL_KIND_PROGRAM, identifier, NULL);
@@ -115,7 +117,7 @@ ps_ast_node *ps_parse_program(ps_compiler *compiler)
115117
}
116118

117119
/**
118-
* Parse uses clause (module names after USES)
120+
* Parse/skip uses clause (module names after USES)
119121
*/
120122
static ps_ast_node *ps_parse_uses_clause(ps_compiler *compiler)
121123
{
@@ -126,14 +128,14 @@ static ps_ast_node *ps_parse_uses_clause(ps_compiler *compiler)
126128
{
127129
if (lexer->current_token.type != PS_TOKEN_IDENTIFIER)
128130
RETURN_ERROR(PS_ERROR_EXPECTED_IDENTIFIER)
129-
READ_NEXT_TOKEN
131+
READ_NEXT_TOKEN(NULL)
130132
switch (lexer->current_token.type)
131133
{
132134
case PS_TOKEN_COMMA:
133-
READ_NEXT_TOKEN
135+
READ_NEXT_TOKEN(NULL)
134136
break;
135137
case PS_TOKEN_SEMI_COLON:
136-
READ_NEXT_TOKEN
138+
READ_NEXT_TOKEN(NULL)
137139
loop = false;
138140
break;
139141
default:
@@ -146,11 +148,11 @@ static ps_ast_node *ps_parse_uses_clause(ps_compiler *compiler)
146148

147149
ps_ast_node *ps_parse_uses(ps_compiler *compiler)
148150
{
149-
PARSE_BEGIN("USES", "")
151+
PARSE_BEGIN_AST(ps_ast_node, "USES", "")
150152

151153
if (lexer->current_token.type == PS_TOKEN_USES)
152154
{
153-
READ_NEXT_TOKEN
155+
READ_NEXT_TOKEN(NULL)
154156
ast = ps_parse_uses_clause(compiler);
155157
if (NULL == ast)
156158
TRACE_ERROR("USES CLAUSE")

0 commit comments

Comments
 (0)