1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
/*
* Copyright (c) 2025 Ian Marco Moffett and L5 engineers
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the project nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/types.h>
#include <sys/errno.h>
#include <sys/syslog.h>
#include <sys/param.h>
#include <np/lex.h>
#include <np/parse.h>
#include <os/np.h>
#define pr_trace(fmt, ...) printf("pirho.parse: " fmt, ##__VA_ARGS__)
#define pr_error(fmt, ...) printf("pirho.parse: error: " fmt, ##__VA_ARGS__)
/* Token to string conversion table */
static const char *stoktab[] = {
/* Reserved */
[TT_NONE] = "<TT_NONE>",
/* Symbols */
[TT_LPAREN] = "<TT_LPAREN>",
[TT_RPAREN] = "<TT_RPAREN>",
[TT_IDENT] = "<IDENTIFIER>",
[TT_COMMA] = "<TT_COMMA>",
[TT_STAR] = "<TT_STAR>",
[TT_MINUS] = "<TT_MINUS>",
[TT_PLUS] = "<TT_PLUS>",
[TT_SLASH] = "<TT_SLASH>",
[TT_EQUALS] = "<TT_EQUALS>",
[TT_GT] = "<TT_GREATER>",
[TT_LT] = "<TT_LESSTHAN>",
[TT_LBRACK] = "<TT_LBRACK>",
[TT_RBRACK] = "<TT_RBRACK>",
[TT_COLON] = "<TT_COLON>",
/* Types */
[TT_U8] = "<TT_U8>",
/* Values */
[TT_NUMBER] = "<TT_NUMBER>",
/* Keywords */
[TT_BEGIN] = "<TT_BEGIN>",
[TT_PROC] = "<TT_PROC>",
[TT_END] = "<TT_END>"
};
int
parse_work(struct np_work *work)
{
struct lex_token tok;
int error = 0;
if (work == NULL) {
pr_error("bad work argument\n");
return -EINVAL;
}
while (error == 0) {
error = lex_nom(work, &tok);
if (error < 0) {
return error;
}
/* Don't overflow the table */
if (tok.token > NELEM(stoktab)) {
pr_error("bad token %d\n", tok.token);
return -1;
}
/* Log the token */
printf("tok.type: %s\n", stoktab[tok.token]);
if (tok.token == TT_NUMBER) {
printf("tok.val: %d\n", tok.val);
}
}
return 0;
}
|