commit aef0e3d

uint  ·  2026-10-23 21:04:51 +0000 UTC
parent 4e72e5c
Reorder functions, rename some of them, add expression handler
2 files changed,  +69, -41
M expl.c
M expl.h
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