backend: Add abstract syntax tree groundwork
Signed-off-by: Ian Moffett <ian@mirocom.org>
This commit is contained in:
38
backend/ast.c
Normal file
38
backend/ast.c
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Mirocom Laboratories
|
||||||
|
* Provided under the BSD-3 clause
|
||||||
|
*
|
||||||
|
* Abstract:
|
||||||
|
* This file implements abstract syntaxt tree creation
|
||||||
|
* logic.
|
||||||
|
* Author:
|
||||||
|
* Ian M. Moffett <ian@mirocom.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "backend/ast.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
ast_node_alloc(struct quip_state *state, ast_type_t type, struct ast_node **res)
|
||||||
|
{
|
||||||
|
struct ast_node *node;
|
||||||
|
|
||||||
|
if (res == NULL) {
|
||||||
|
errno = -EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
node = ptrbox_malloc(&state->ptrbox, (sizeof(*node)));
|
||||||
|
if (node == NULL) {
|
||||||
|
errno = -ENOMEM;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
node->left = NULL;
|
||||||
|
node->right = NULL;
|
||||||
|
node->data = NULL;
|
||||||
|
*res = node;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
56
include/backend/ast.h
Normal file
56
include/backend/ast.h
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2026, Mirocom Laboratories
|
||||||
|
* Provided under the BSD-3 clause
|
||||||
|
*
|
||||||
|
* Abstract:
|
||||||
|
* This file provides abstract syntax tree related
|
||||||
|
* definitions.
|
||||||
|
* Author:
|
||||||
|
* Ian M. Moffett <ian@mirocom.org>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BACKEND_AST_H
|
||||||
|
#define BACKEND_AST_H 1
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include "common/state.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Represents an abstract syntax tree
|
||||||
|
*
|
||||||
|
* @AST_TYPE_NONE: This node has node associated type
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
AST_TYPE_NONE,
|
||||||
|
AST_TYPE_CC,
|
||||||
|
} ast_type_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Represents an element within the source
|
||||||
|
*
|
||||||
|
* @left: Left node
|
||||||
|
* @right: Right node
|
||||||
|
*/
|
||||||
|
struct ast_node {
|
||||||
|
struct ast_node *left;
|
||||||
|
struct ast_node *right;
|
||||||
|
union {
|
||||||
|
const char *s;
|
||||||
|
void *data;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Allocate an AST node of a specific type
|
||||||
|
*
|
||||||
|
* @state: Quip state machine
|
||||||
|
* @type: AST node type
|
||||||
|
* @res: AST node result is written here
|
||||||
|
*
|
||||||
|
* Returns zero on success
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int ast_node_alloc(struct quip_state *state, ast_type_t type, struct ast_node **res);
|
||||||
|
|
||||||
|
#endif /* !BACKEND_AST_H */
|
||||||
Reference in New Issue
Block a user