librdesc
Loading...
Searching...
No Matches
rdesc.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2025-2026 Metehan Selvi <me@metehanselvi.com>
2//
3// SPDX-License-Identifier: LGPL-2.1-or-later
4
10#ifndef RDESC_H
11#define RDESC_H
12
13#include "detail.h"
14
15#include <stdbool.h>
16#include <stdint.h>
17#include <stddef.h>
18
20#define RDESC_VERSION_MAJOR 0
22#define RDESC_VERSION_MINOR 2
24#define RDESC_VERSION_PATCH 0
26#define RDESC_VERSION_PRE_RELEASE "rc.2"
27
28
40
42struct rdesc {
45 /* Grammar production rules. */
46 const struct rdesc_grammar *grammar;
47
48 /* Size in bytes allocated for each token's semantic information. */
49 size_t seminfo_size;
50
51 /* - Error Recovery -
52 *
53 * Extra space for holding a token in case of memory allocation error.
54 * Token will be copied to those fields for retry in next pump call.
55 */
56 bool has_saved_tk;
57 uint16_t saved_tk;
58 void *saved_seminfo;
59
60 /* - Navigation - */
61 size_t cur /* (current) Nonterminal being expanded; may not be
62 * the top element. */;
63 uint16_t top_unwind /* Stack's top node's unwind distance. */;
64
65 /* Destructor method for tokens the parser owns. */
66 void (*token_destroyer)(uint16_t, void *);
67
68 /* Token stack used to store tokens temporarily during nonterminal
69 * backtracking. */
70 struct rdesc_stack *token_stack;
71
72 /* Underlying concrete syntax tree. */
73 struct rdesc_stack *cst_stack;
74
76};
77
79struct rdesc_node;
80
81
82#ifdef __cplusplus
83extern "C" {
84#endif
85
87const char *rdesc_version(void);
88
99int rdesc_init(struct rdesc *parser,
100 const struct rdesc_grammar *grammar,
101 size_t seminfo_size,
102 void (*token_destroyer)(uint16_t id, void *seminfo)) _rdesc_wur;
103
107void rdesc_destroy(struct rdesc *parser);
108
114int rdesc_start(struct rdesc *parser, uint16_t start_symbol) _rdesc_wur;
115
119void rdesc_reset(struct rdesc *parser);
120
138enum rdesc_result rdesc_pump(struct rdesc *parser,
139 uint16_t id,
140 void *seminfo) _rdesc_wur;
141
149 enum rdesc_result rdesc_resume(struct rdesc *parser) _rdesc_wur;
150
156struct rdesc_node *rdesc_root(struct rdesc *parser);
157
158#ifdef __cplusplus
159}
160#endif
161
162
163#endif
int rdesc_start(struct rdesc *parser, uint16_t start_symbol) _rdesc_wur
Sets start symbol for the next match.
int rdesc_init(struct rdesc *parser, const struct rdesc_grammar *grammar, size_t seminfo_size, void(*token_destroyer)(uint16_t id, void *seminfo)) _rdesc_wur
Initializes a new parser.
void rdesc_reset(struct rdesc *parser)
Resets the parser to its initial state.
enum rdesc_result rdesc_pump(struct rdesc *parser, uint16_t id, void *seminfo) _rdesc_wur
Drives the parsing process, the pump.
void rdesc_destroy(struct rdesc *parser)
Frees memory allocated by the parser and destroys the parser instance.
const char * rdesc_version(void)
rdesc version
enum rdesc_result rdesc_resume(struct rdesc *parser) _rdesc_wur
Resume parsing without providing a new token.
struct rdesc_node * rdesc_root(struct rdesc *parser)
Returns the root of the CST.
rdesc_result
Parse operation result codes.
Definition rdesc.h:30
@ RDESC_ENOMEM
Definition rdesc.h:32
@ RDESC_READY
Definition rdesc.h:34
@ RDESC_NOMATCH
Definition rdesc.h:38
@ RDESC_CONTINUE
Definition rdesc.h:36
Grammar definition.
Definition grammar.h:50
Default implementation of the stack.
Definition stack.c:36
Recursive descent parser state.
Definition rdesc.h:42