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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
#include "../cnp.h"
#define READ_INTO_CPA(N, U, L, I, VA, VI, CP) do { \
U = new_utf8(N, L); \
I = get_info((str *)U, 0); \
VA = MYALLOC(NUM, 2); \
VI = 0; \
for (NUM index = 0; \
I.value >= 0 && index < str_length((str *) U); \
index += I.step, VI++) { \
I = get_info((str *)U, index); \
*(VA+VI) = I.value; \
} \
CP = MYALLOC(cpa, 1); \
CP->array = VA; \
CP->size = VI; \
add_to_list(names, CP); \
destroy_str((str *)U, 1); \
} while (0)
#define READ_TNT_STRING(LEFT, FORMAT, LEN, ...) do { \
tnt_string = new_tnt_string(FORMAT, LEN, __VA_ARGS__); \
if (!tnt_string) { \
fleprintf("left = %d, f = %s, l = %d, " \
"cannot create tnt string\n", \
LEFT, FORMAT, LEN); \
map_list(rules, destroy_rule_and_free_all); \
destroy_list(rules, 0); \
map_list(names, destroy_cpa_and_free_all); \
destroy_list(names, 0); \
return 1; \
} \
rule = new_rule(LEFT, tnt_string); \
add_to_list(rules, rule); \
} while (0)
int
main(int UNUSED argc, char ** UNUSED argv)
{
/* have a grammar for testing */
List *tnt_string = NULL;
Rule *rule = NULL;
List *rules = new_list();
List *names = new_list();
char *name = MYALLOC(char, 2);
*(name+1) = 0;
*name = 'B';
utf8* uname = NULL;
str_info info = EMPTY_STR_INFO;
NUM *varray = NULL;
NUM vindex = 0;
cpa *cpap = NULL;
READ_INTO_CPA(name, uname, 1, info, varray, vindex, cpap);
name = MYALLOC(char, 3);
*(name+1) = 0;
*name = 'U';
READ_INTO_CPA(name, uname, 1, info, varray, vindex, cpap);
/* name = MYALLOC(char, 2);
* *(name+1) = 0;
* *name = 'F';
*
* READ_INTO_CPA(name, uname, 1, info, varray, vindex, cpap);
*
* name = MYALLOC(char, 2);
* *(name+1) = 0;
* *name = 'D';
*
* READ_INTO_CPA(name, uname, 1, info, varray, vindex, cpap); */
READ_TNT_STRING(0, "nn", 2, (NT) 1, (NT) 0);
rule = new_rule(0, new_list());
add_to_list(rules, rule);
READ_TNT_STRING(1, "t", 1, (T) '>');
READ_TNT_STRING(1, "t", 1, (T) '<');
READ_TNT_STRING(1, "t", 1, (T) '+');
READ_TNT_STRING(1, "t", 1, (T) '-');
READ_TNT_STRING(1, "t", 1, (T) ',');
READ_TNT_STRING(1, "t", 1, (T) '.');
READ_TNT_STRING(1, "tnt", 3, (T) '[', (NT) 0, (T) ']');
Grammar *g = new_grammar();
build_grammar(g, rules, names);
print_grammar(g);
utf8 *string = new_utf8("[,[.[+]]-]", 10);
printf("\nPrinting the input...\n%s\n", get_data((str *) string));
Environment *env = cnp_parse(g, (str *) string);
if (env) {
if (!(env_error_p(env))) {
printf("Successfully parsed the input:\n");
bsr_print(env_bsrp(env), env_grammar(env), 1);
} else {
printf("There are errors!\n");
}
destroy_env(env);
}
destroy_grammar(g, 1);
destroy_list(rules, 1);
free(string);
return 0;
}
|