summaryrefslogtreecommitdiff
path: root/src/main/java/bjc/rgens/parser/GenerationState.java
blob: 38a25d5f37f453177c9482d0916954b9465af3d1 (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.rgens.parser;

import bjc.utils.data.IPair;
import bjc.utils.data.Pair;

import java.util.Map;
import java.util.Random;

/* 
 * The current state during generation.
 *
 */
public class GenerationState {
	/** The current string. */
	public StringBuilder contents;
	/** The RNG. */
	public Random rnd;

	/** The current grammar. */
	public RGrammar gram;
	/** The rules of the grammar. */
	public Map<String, Rule> rules;
	/** The rules imported from other grammars. */
	public Map<String, RGrammar> importRules;

	/** The current set of variables. */
	public Map<String, String> vars;
	public Map<String, IPair<RGrammar, Rule>> rlVars;

	/**
	 * Create a new generation state.
	 * 
	 * @param cont
	 *            The string being generated.
	 *
	 * @param rand
	 *            The RNG to use.
	 *
	 * @param vs
	 *            The variables to use.
	 */
	public GenerationState(StringBuilder cont, Random rand, Map<String, String> vs,
			Map<String, IPair<RGrammar, Rule>> rvs, RGrammar gram) {
		contents = cont;
		rnd      = rand;
		vars     = vs;
		rlVars   = rvs;

		this.gram = gram;
	
		this.rules = gram.getRules();
		this.importRules = gram.getImportRules();
	}

	public void swapGrammar(RGrammar gram) {
		if(this.gram == gram) return;

		this.gram = gram;

		rules = gram.getRules();
		
		importRules = gram.getImportRules();
	}

	public GenerationState newBuf() {
		return new GenerationState(new StringBuilder(), rnd, vars, rlVars, gram);
	}

	/*
	 * @TODO 6/5/18 Ben Culkin :ImportRefactor
	 * 
	 * Change this so that imports in almost all cases have to specify where
	 * they are importing the rule from, so as to make it clear which rules
	 * are imported, and which aren't
	 */
	public IPair<RGrammar, Rule> findRule(String ruleName, boolean allowImports) {
		if(rules.containsKey(ruleName)) {
			return new Pair<>(gram, rules.get(ruleName));
		}

		if(allowImports) return findImport(ruleName);

		return null;
	}

	public IPair<RGrammar, Rule> findImport(String ruleName) {
		if(importRules.containsKey(ruleName)) {
			RGrammar imp = importRules.get(ruleName);

			return new Pair<>(imp, imp.rules.get(ruleName));
		}

		return null;
	}
}