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
|
#include <stdlib.h>
#include "parse.h"
#include "lexer.h"
line_t init_line(prop_t proposition, just_t justification) {
line_t line;
line.proposition = proposition;
line.justification = justification;
return line;
}
lineSet_t init_lineset(line_t* lines, int count) {
lineSet_t lineSet;
lineSet.lines = lines;
lineSet.count = count;
return lineSet;
}
int count_lines(char* content) {
int i = 0;
while (*content != '\0') {
if (*content == '\n') {
i++;
}
content++;
}
return i;
}
lineSet_t parse_lines(char* content, int lineCount) {
line_t* lines = malloc(sizeof(line_t) * lineCount);
for (int i = 0; i < lineCount; i++) {
/* parse the line */
lines[i] = parse_line(content);
/* advance to the next line */
while (*content != '\n') {
content++;
}
content++;
}
return init_lineset(lines, lineCount);
}
line_t parse_line(char* content) {
tokenSet_t ts = lex_line(content);
int i = 0;
while (ts.tokens[i].type != JUSTIFICATION) {
i++;
}
int* seek = calloc(sizeof(int), 1);
prop_t prop = parse_proposition(init_tokenset(ts.tokens, i), seek);
just_t just;
return init_line(prop, just);
}
prop_t parse_proposition(tokenSet_t tokenSet, int* seek) {
prop_t prop;
if (tokenSet.tokens[*seek].type == OPEN_PAREN) {
(*seek)++;
prop = parse_proposition(tokenSet, seek);
}
else {
prop = init_simple_prop(tokenSet.tokens[*seek].value);
(*seek)++;
}
/* check if we were reading a simple prop, or if there is a relation */
if (*seek == tokenSet.count || tokenSet.tokens[*seek].type == CLOSE_PAREN) {
return prop;
}
else {
tokenType_t rel = tokenSet.tokens[*seek].type;
(*seek)++;
prop_t* prop1p = malloc(sizeof(prop_t));
*prop1p = prop;
prop_t* prop2p = malloc(sizeof(prop_t));
*prop2p = parse_proposition(tokenSet, seek);
prop_t metaProp = init_prop(prop1p, prop2p, rel);
return metaProp;
}
}
|