blob: 7cc53eef5f71d92b760dd07a69fbd291a63cac4e (
plain)
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
|
package bjc.dicelang.expr;
import java.util.Scanner;
import bjc.data.Tree;
import bjc.funcdata.ListEx;
import bjc.utils.parserutils.TreeConstructor;
/**
* REPL for expressions.
* @author student
*
*/
public class ExprREPL {
/**
* Main method.
*
* @param args
* Unused CLI args.
*/
public static void main(final String[] args) {
/* Create our objects. */
final Tokens toks = new Tokens();
final Lexer lex = new Lexer();
/* Prepare our input source. */
final Scanner scan = new Scanner(System.in);
/* Read initial command. */
System.out.print("Enter a math expression (blank line to quit): ");
String ln = scan.nextLine().trim();
/* Enter REPL loop. */
while(!ln.equals("")) {
/* Print raw command. */
System.out.println("Raw command: " + ln);
System.out.println();
/* Lex command to infix tokens. */
final Token[] infixTokens = lex.lexString(ln, toks);
System.out.println("Lexed tokens: ");
for(final Token tok : infixTokens) {
System.out.println("\t" + tok);
}
/* Print out infix expression. */
System.out.print("Lexed expression: ");
for(final Token tok : infixTokens) {
System.out.print(tok.toExpr() + " ");
}
/* Space stages. */
System.out.println();
System.out.println();
/* Shunt infix tokens to postfix tokens. */
final ListEx<Token> postfixTokens = Shunter.shuntTokens(infixTokens);
System.out.println("Lexed tokens: ");
for(final Token tok : postfixTokens) {
System.out.println("\t" + tok);
}
/* Print out postfix tokens. */
System.out.print("Shunted expression: ");
for(final Token tok : postfixTokens) {
System.out.print(tok.toExpr() + " ");
}
/* Space stages. */
System.out.println();
System.out.println();
/*
* Construct a tree from the list of postfixed tokens.
*/
final Tree<Token> ast = TreeConstructor.constructTree(postfixTokens,
tok -> tok.typ.isOperator);
/*
* Print the tree, then the canonical expression for it.
*/
System.out.println("Parsed tree");
System.out.println(ast.toString());
System.out.println("\nCanonical expr: " + Parser.toCanonicalExpr(ast));
/* Space stages. */
System.out.println();
System.out.println();
/* Prompt for a new expression. */
System.out.print("Enter a math expression (blank line to quit): ");
/* Read it. */
ln = scan.nextLine().trim();
}
/* Cleanup after ourselves. */
scan.close();
}
}
|