summaryrefslogtreecommitdiff
path: root/dice-lang/src/bjc/dicelang/v1/examples/DiceLanguageTest.java
blob: 9a13b783bc9831e55b664f7595d7ab6d73cde8d3 (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
package bjc.dicelang.v1.examples;

import bjc.dicelang.v1.DiceExpressionParser;
import bjc.dicelang.v1.IDiceExpression;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.function.BiConsumer;

/**
 * Test of dice language
 *
 * @author ben
 *
 */
public class DiceLanguageTest {
	private static Map<String, BiConsumer<String, DiceLanguageState>> acts;

	static {
		acts = new HashMap<>();

		acts.put("roll", DiceLanguageTest::rollReference);
		acts.put("env", DiceLanguageTest::printEnv);
	}

	/**
	 * Main method
	 *
	 * @param args
	 *                Unused CLI args
	 */
	public static void main(String[] args) {
		Scanner scn = new Scanner(System.in);
		int i = 0;

		System.out.print("dice-lang-" + i + "> ");
		String ln = scn.nextLine();

		DiceExpressionParser dep = new DiceExpressionParser();
		Map<String, IDiceExpression> env = new HashMap<>();
		DiceLanguageState state = new DiceLanguageState(dep, env);

		while(!ln.equalsIgnoreCase("quit")) {
			String header = ln.split(" ")[0];

			if(acts.containsKey(header)) {
				acts.get(header).accept(ln, state);
			} else {
				IDiceExpression exp = DiceExpressionParser.parse(ln, env);

				System.out.println("\tParsed: " + exp.toString());
				System.out.println("\tSample Roll: " + exp.roll());

				env.put("last", exp);
			}

			i++;

			System.out.print("dice-lang-" + i + "> ");
			ln = scn.nextLine();
		}

		System.out.println("Bye.");
		scn.close();
	}

	/**
	 * @param ln
	 *                Unused parameter, kept to comply with expected type
	 *                sig
	 */
	private static void printEnv(String ln, DiceLanguageState stat) {
		System.out.println("Printing enviroment for debugging purposes.");

		stat.doWith((dep, env) -> env.forEach(
				(key, exp) -> System.out.println("\tKey: " + key + "\tExp: " + exp.toString())));
	}

	private static void rollReference(String ln, DiceLanguageState stat) {
		String[] strangs = ln.split(" ");

		System.out.println("\tRolling dice expression " + strangs[1] + " " + strangs[2] + " times.");

		int nRolls = Integer.parseInt(strangs[2]);

		IDiceExpression dexp = stat.merge((dep, env) -> env.get(strangs[1]));

		for(int i = 1; i <= nRolls; i++) {
			int roll = dexp.roll();

			System.out.println("\tRolled " + roll);
		}
	}
}