-
Notifications
You must be signed in to change notification settings - Fork 0
/
Parse.java
116 lines (116 loc) · 3.31 KB
/
Parse.java
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
import java.io.*;
import java.util.*;
// build a binary tree that captures the structure of an S-expression.
// The leaves of this tree are atoms.
class Parse {
public Lexical lexical;
public Printer printer;
public Evaluator evaluator;
public Typechecker typechecker;
public List<Sexp> sexpList = new ArrayList<Sexp>();
public Sexp sexp = new Sexp();
public Sexp sexp0 = sexp;
public Sexp d = new Sexp();
Parse(Lexical lex, Printer pri, Evaluator eva) {
this.lexical = lex;
this.printer = pri;
this.evaluator = eva;
typechecker = new Typechecker();
d.left = new Sexp();
d.left.left = new Sexp();
d.left.left.val = "NOTAFUNCTION";
d.left.right = new Sexp();
d.left.right.val = "NIL";
d.right = new Sexp();
d.right.val = "NIL";
Sexp sa = new Sexp();
sa.val = "NIL";
// System.out.println("dlist is:");
// Printer pt = new Printer();
// pt.launch(d);
}
// ParseStart will call ParseSexp and then will check for end of file.
// If the end is reached, the parser will terminate. If not, ParseStart will call itself.
void ParseStart() {
// sexpList.add(sexp);
// Printer pt1 = new Printer();
// System.out.println("after eval");
// pt1.launch(d);
sexp = ParseSexp(0);
if(sexp == null) {
System.exit(0);
}
// check end?
else if(sexp.val != null || sexp.left != null){
Sexp sa = new Sexp();
sa.val = "NIL";
// sexp = evaluator.eval(sexp, sa, d);
typechecker.check(sexp);
printer.launch(sexp);
ParseStart();
}
else {
ParseStart();
}
}
// get the next token. If it is not Atom or OpenParenthesis, an error will be reported. If it is Atom, the function returns. If it is OpenParenthesis, the function will call itself, then will get the next token, report an error if it is not Dot, call itself again, get the next token, and report an error if it is not ClosingParenthesis.
Sexp ParseSexp(int dir) {
String token = lexical.getNextToken();
Sexp tempSexp = new Sexp();
if(token == "EOF") {
return null;
}
else if(token == "EOL") {
System.out.print('\n');
return tempSexp;
// ParseSexp(0);
}
else if(token == "(") {
tempSexp.left = ParseSexp(1);
token = lexical.getNextToken();
// System.out.println(token);
if(token != ".") {
System.out.println("ERROR: here should be a '.' not" + token);
System.exit(1);
}
tempSexp.right = ParseSexp(2);
token = lexical.getNextToken();
// System.out.println(token);
if(token != ")") {
System.out.println("ERROR: here should be a ')'");
System.exit(1);
}
// System.out.println(tempSexp.)
return tempSexp;
}
else if(token.charAt(0) >= 'A' && token.charAt(0) <= 'Z') { // litera
if(dir == 0) {
tempSexp.isList = false;
tempSexp.kind = "literal";
tempSexp.val = token;
}
else if(dir == 1) { // add to left child
tempSexp.isList = false;
tempSexp.kind = "literal";
tempSexp.val = token;
}
else if(dir == 2) {
tempSexp.isList = (token == "NIL");
tempSexp.kind = token == "NIL" ? null : "literal";
tempSexp.val = token;
}
return tempSexp;
}
else if(token.charAt(0) >= '0' && token.charAt(0) <= '9') { // numeric
tempSexp.isList = false;
tempSexp.kind = "numeric";
tempSexp.val = token;
return tempSexp;
}
else{
System.out.println("ERROR: Invalid character" + token);
System.exit(1);
return tempSexp;
}
}
}