commit aef0e3d
uint
·
2026-10-23 21:04:51 +0000 UTC
parent 4e72e5c
Reorder functions, rename some of them, add expression handler
M
expl.c
+67,
-41
1@@ -15,12 +15,16 @@ typedef struct {
2 } parser;
3
4 static expl_node* atom(parser* p);
5-static expl_node* node_new(expl_type type);
6-static void node_free(expl_node* node);
7-static void skip_whitespace(parser* p);
8+static expl_node* expression(parser* p);
9+static expl_node* list(parser* p);
10 static expl_node* string(parser* p);
11+
12+static void skipspace(parser* p);
13 static char* _strndup(const char* src, size_t len);
14
15+static expl_node* node_new(expl_type type);
16+static void node_free(expl_node* node);
17+
18 static expl_node*
19 atom(parser* p)
20 {
21@@ -57,49 +61,25 @@ atom(parser* p)
22 }
23
24 static expl_node*
25-node_new(expl_type type)
26+expression(parser* p)
27 {
28- expl_node* node = malloc(sizeof(*node));
29- if (!node)
30+ skipspace(p);
31+ switch (p->src[p->pos]) {
32+ case '"':
33+ return string(p);
34+ case '(':
35+ case ')':
36+ case '\0':
37+ p->err = EXPL_ERR_UNEXPECTED_TOKEN;
38 return NULL;
39-
40- node->type = type;
41- node->value = NULL;
42- node->child = NULL;
43- node->next = NULL;
44-
45- return node;
46-}
47-
48-static void
49-node_free(expl_node* node)
50-{
51- if (!node)
52- return;
53-
54- if (node->value)
55- free(node->value);
56-
57- node_free(node->child);
58- node_free(node->next);
59-
60- free(node);
61+ default:
62+ return atom(p);
63+ }
64 }
65
66-static void
67-skip_whitespace(parser* p)
68+static expl_node*
69+list(parser* p)
70 {
71- while (isspace((unsigned char)p->src[p->pos]) || current_char(p, ';')) {
72- /* comment */
73- if (parser_current_char(p, ';')) {
74- while (!parser_current_char(p, '\n') && !parser_current_char(p, '\0'))
75- p->pos++;
76- }
77-
78- /* whitespace */
79- else
80- p->pos++;
81- }
82 }
83
84 static expl_node*
85@@ -144,6 +124,22 @@ string(parser* p)
86 return node;
87 }
88
89+static void
90+skipspace(parser* p)
91+{
92+ while (isspace((unsigned char)p->src[p->pos]) || current_char(p, ';')) {
93+ /* comment */
94+ if (current_char(p, ';')) {
95+ while (!current_char(p, '\n') && !current_char(p, '\0'))
96+ p->pos++;
97+ }
98+
99+ /* whitespace */
100+ else
101+ p->pos++;
102+ }
103+}
104+
105 static char*
106 _strndup(const char* src, size_t len)
107 {
108@@ -157,6 +153,36 @@ _strndup(const char* src, size_t len)
109 return str;
110 }
111
112+static expl_node*
113+node_new(expl_type type)
114+{
115+ expl_node* node = malloc(sizeof(*node));
116+ if (!node)
117+ return NULL;
118+
119+ node->type = type;
120+ node->value = NULL;
121+ node->child = NULL;
122+ node->next = NULL;
123+
124+ return node;
125+}
126+
127+static void
128+node_free(expl_node* node)
129+{
130+ if (!node)
131+ return;
132+
133+ if (node->value)
134+ free(node->value);
135+
136+ node_free(node->child);
137+ node_free(node->next);
138+
139+ free(node);
140+}
141+
142 int
143 main(void)
144 {
M
expl.h
+2,
-0
1@@ -13,6 +13,8 @@ typedef enum {
2 EXPL_ERR_NONE,
3 EXPL_ERR_EXPECTED_ATOM,
4 EXPL_ERR_EXPECTED_STRING,
5+ EXPL_ERR_EXPECTED_LIST,
6+ EXPL_ERR_UNEXPECTED_TOKEN,
7 EXPL_ERR_OUT_OF_MEMORY,
8
9 EXPL_ERR_COUNT