summaryrefslogtreecommitdiff
path: root/base/src/bjc/dicelang/expr/ExprREPL.java
blob: 49b9575d2a386b07e2009bf3e0c2d1c63d0786d3 (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
package bjc.dicelang.expr;

import java.util.Scanner;

import bjc.utils.data.ITree;
import bjc.utils.funcdata.IList;
import bjc.utils.parserutils.TreeConstructor;

public class ExprREPL {

	/*
	 * @TODO 10/08/17 Ben Culkin :MainSeperation
	 * 
	 * This main method should be moved to its own class.
	 */
	/**
	 * 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 IList<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 ITree<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();
	}

}