lang: ast: implement parsing of atoms

This commit is contained in:
2024-12-06 13:46:41 +00:00
parent 7ba0a05332
commit 2bd3e96427
4 changed files with 29 additions and 0 deletions

18
lang/ast/atom.c Normal file
View File

@@ -0,0 +1,18 @@
#include "ctx.h"
#include "node.h"
#include <stdio.h>
static void print(struct ivy_ast_node *node)
{
struct ivy_ast_atom_node *v = (struct ivy_ast_atom_node *)node;
printf("%s (%s)\n", ivy_ast_node_type_to_string(node->n_type),
v->n_content->t_str);
}
struct ast_node_type atom_node_ops = {
.n_print = print,
.n_state_size = sizeof(struct parser_state),
.n_node_size = sizeof(struct ivy_ast_atom_node),
};

View File

@@ -79,6 +79,14 @@ enum ivy_status arith_push_operand(
b_queue_push_back(&state->s_output_queue, &v->n_base.n_entry);
break;
}
case IVY_TOK_ATOM: {
struct ivy_ast_atom_node *v
= (struct ivy_ast_atom_node *)ast_node_create(
IVY_AST_ATOM);
v->n_content = tok;
b_queue_push_back(&state->s_output_queue, &v->n_base.n_entry);
break;
}
case IVY_TOK_STRING: {
struct ivy_ast_string_node *v
= (struct ivy_ast_string_node *)ast_node_create(

View File

@@ -24,6 +24,7 @@ struct ast_node_type expr_node_ops = {
TOK_PARSER(IDENT, arith_parse_ident),
TOK_PARSER(INT, arith_parse_operand),
TOK_PARSER(DOUBLE, arith_parse_operand),
TOK_PARSER(ATOM, arith_parse_operand),
TOK_PARSER(STRING, arith_parse_operand),
TOK_PARSER(SYMBOL, arith_parse_operator),
TOK_PARSER(LABEL, arith_parse_label),

View File

@@ -18,6 +18,7 @@ extern struct ast_node_type op_node_ops;
extern struct ast_node_type ident_node_ops;
extern struct ast_node_type int_node_ops;
extern struct ast_node_type double_node_ops;
extern struct ast_node_type atom_node_ops;
extern struct ast_node_type string_node_ops;
extern struct ast_node_type cascade_node_ops;
extern struct ast_node_type cond_group_node_ops;
@@ -42,6 +43,7 @@ static const struct ast_node_type *node_ops[] = {
[IVY_AST_IDENT] = &ident_node_ops,
[IVY_AST_INT] = &int_node_ops,
[IVY_AST_DOUBLE] = &double_node_ops,
[IVY_AST_ATOM] = &atom_node_ops,
[IVY_AST_STRING] = &string_node_ops,
[IVY_AST_CASCADE] = &cascade_node_ops,
[IVY_AST_COND_GROUP] = &cond_group_node_ops,