Prism Ruby parser
Loading...
Searching...
No Matches
Macros | Functions
node.h File Reference

Functions related to nodes in the AST. More...

#include "prism/compiler/exported.h"
#include "prism/compiler/nonnull.h"
#include "prism/ast.h"
Include dependency graph for node.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define PM_NODE_LIST_FOREACH(list, index, node)    for (size_t index = 0; index < (list)->size && ((node) = (list)->nodes[index]); index++)
 Loop through each node in the node list, writing each node to the given pm_node_t pointer.
 

Functions

PRISM_EXPORTED_FUNCTION const char * pm_node_type (pm_node_type_t node_type)
 Returns a string representation of the given node type.
 
PRISM_EXPORTED_FUNCTION void pm_visit_node (const pm_node_t *node, bool(*visitor)(const pm_node_t *node, void *data), void *data) PRISM_NONNULL(1)
 Visit each of the nodes in this subtree using the given visitor callback.
 
PRISM_EXPORTED_FUNCTION void pm_visit_child_nodes (const pm_node_t *node, bool(*visitor)(const pm_node_t *node, void *data), void *data) PRISM_NONNULL(1)
 Visit the children of the given node with the given callback.
 

Detailed Description

Functions related to nodes in the AST.

Function Documentation

◆ pm_node_type()

PRISM_EXPORTED_FUNCTION const char * pm_node_type ( pm_node_type_t  node_type)

Returns a string representation of the given node type.

Parameters
node_typeThe node type to convert to a string.
Returns
A string representation of the given node type.

◆ pm_visit_node()

PRISM_EXPORTED_FUNCTION void pm_visit_node ( const pm_node_t node,
bool(*)(const pm_node_t *node, void *data)  visitor,
void *  data 
)

Visit each of the nodes in this subtree using the given visitor callback.

The callback function will be called for each node in the subtree. If it returns false, then that node's children will not be visited. If it returns true, then the children will be visited. The data parameter is treated as an opaque pointer and is passed to the visitor callback for consumers to use as they see fit.

As an example:

#include "prism.h"
bool visit(const pm_node_t *node, void *data) {
size_t *indent = (size_t *) data;
for (size_t i = 0; i < *indent * 2; i++) putc(' ', stdout);
printf("%s\n", pm_node_type(node->type));
size_t next_indent = *indent + 1;
size_t *next_data = &next_indent;
pm_visit_child_nodes(node, visit, next_data);
return false;
}
int main(void) {
const char *source = "1 + 2; 3 + 4";
size_t size = strlen(source);
pm_parser_t *parser = pm_parser_new(arena, (const uint8_t *) source, size, options);
size_t indent = 0;
pm_node_t *node = pm_parse(parser);
size_t *data = &indent;
pm_visit_node(node, visit, data);
pm_parser_free(parser);
pm_options_free(options);
pm_arena_free(arena);
return EXIT_SUCCESS;
}
struct pm_arena_t pm_arena_t
An opaque pointer to an arena that is used for allocations.
Definition arena.h:18
PRISM_EXPORTED_FUNCTION PRISM_NODISCARD pm_arena_t * pm_arena_new(void)
Returns a newly allocated and initialized arena.
PRISM_EXPORTED_FUNCTION void pm_arena_free(pm_arena_t *arena) PRISM_NONNULL(1)
Frees both the held memory and the arena itself.
pm_node_type
This enum represents every type of node in the Ruby syntax tree.
Definition ast.h:586
PRISM_EXPORTED_FUNCTION void pm_visit_child_nodes(const pm_node_t *node, bool(*visitor)(const pm_node_t *node, void *data), void *data) PRISM_NONNULL(1)
Visit the children of the given node with the given callback.
PRISM_EXPORTED_FUNCTION void pm_visit_node(const pm_node_t *node, bool(*visitor)(const pm_node_t *node, void *data), void *data) PRISM_NONNULL(1)
Visit each of the nodes in this subtree using the given visitor callback.
struct pm_options_t pm_options_t
The options that can be passed to the parser.
Definition options.h:26
PRISM_EXPORTED_FUNCTION void pm_options_free(pm_options_t *options) PRISM_NONNULL(1)
Free both the held memory of the given options struct and the struct itself.
PRISM_EXPORTED_FUNCTION PRISM_NODISCARD pm_options_t * pm_options_new(void)
Allocate a new options struct.
struct pm_parser_t pm_parser_t
The parser used to parse Ruby source.
Definition parser.h:22
PRISM_EXPORTED_FUNCTION PRISM_NODISCARD pm_parser_t * pm_parser_new(pm_arena_t *arena, const uint8_t *source, size_t size, const pm_options_t *options) PRISM_NONNULL(1)
Allocate and initialize a parser with the given start and end pointers.
PRISM_EXPORTED_FUNCTION void pm_parser_free(pm_parser_t *parser) PRISM_NONNULL(1)
Free both the memory held by the given parser and the parser itself.
PRISM_EXPORTED_FUNCTION pm_node_t * pm_parse(pm_parser_t *parser) PRISM_NONNULL(1)
Initiate the parser with the given parser.
The main header file for the prism parser.
This is the base structure that represents a node in the syntax tree.
Definition ast.h:1070
pm_node_type_t type
This represents the type of the node.
Definition ast.h:1075
Parameters
nodeThe root node to start visiting from.
visitorThe callback to call for each node in the subtree.
dataAn opaque pointer that is passed to the visitor callback.

◆ pm_visit_child_nodes()

PRISM_EXPORTED_FUNCTION void pm_visit_child_nodes ( const pm_node_t node,
bool(*)(const pm_node_t *node, void *data)  visitor,
void *  data 
)

Visit the children of the given node with the given callback.

This is the default behavior for walking the tree that is called from pm_visit_node if the callback returns true.

Parameters
nodeThe node to visit the children of.
visitorThe callback to call for each child node.
dataAn opaque pointer that is passed to the visitor callback.