summaryrefslogtreecommitdiff
path: root/src/main/java/bjc/rgens/parser/Rule.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/bjc/rgens/parser/Rule.java')
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/Rule.java134
1 files changed, 134 insertions, 0 deletions
diff --git a/src/main/java/bjc/rgens/parser/Rule.java b/src/main/java/bjc/rgens/parser/Rule.java
new file mode 100755
index 0000000..7043e0f
--- /dev/null
+++ b/src/main/java/bjc/rgens/parser/Rule.java
@@ -0,0 +1,134 @@
+package bjc.rgens.parser;
+
+import bjc.utils.funcdata.FunctionalList;
+import bjc.utils.funcdata.IList;
+
+import java.util.Random;
+
+/**
+ * A rule in a randomized grammar.
+ *
+ * @author EVE
+ */
+public class Rule {
+ /** The name of this grammar rule. */
+ public final String name;
+
+ /* The cases for this rule. */
+ private IList<RuleCase> cases;
+
+ /**
+ * Create a new grammar rule.
+ *
+ * @param ruleName
+ * The name of the grammar rule.
+ *
+ * @throws IllegalArgumentException
+ * If the rule name is invalid.
+ */
+ public Rule(String ruleName) {
+ if (ruleName == null) {
+ throw new NullPointerException("Rule name must not be null");
+ } else if (ruleName.equals("")) {
+ throw new IllegalArgumentException("The empty string is not a valid rule name");
+ }
+
+ name = ruleName;
+
+ cases = new FunctionalList<>();
+ }
+
+ /**
+ * Adds a case to the rule.
+ *
+ * @param cse
+ * The case to add.
+ */
+ public void addCase(RuleCase cse) {
+ if (cse == null) {
+ throw new NullPointerException("Case must not be null");
+ }
+
+ cases.add(cse);
+ }
+
+ /**
+ * Get a random case from this rule.
+ *
+ * @return
+ * A random case from this rule.
+ */
+ public RuleCase getCase() {
+ return cases.randItem();
+ }
+
+ /**
+ * Get a random case from this rule.
+ *
+ * @param rnd
+ * The random number generator to use.
+ *
+ * @return
+ * A random case from this rule.
+ */
+ public RuleCase getCase(Random rnd) {
+ return cases.randItem(rnd::nextInt);
+ }
+
+ /**
+ * Get all the cases of this rule.
+ *
+ * @return
+ * All the cases in this rule.
+ */
+ public IList<RuleCase> getCases() {
+ return cases;
+ }
+
+ /**
+ * Replace the current list of cases with a new one.
+ *
+ * @param cases
+ * The new list of cases.
+ */
+ public void replaceCases(IList<RuleCase> cases) {
+ this.cases = cases;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+
+ int result = 1;
+ result = prime * result + ((cases == null) ? 0 : cases.hashCode());
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+
+ if (obj == null) return false;
+
+ if (!(obj instanceof Rule)) return false;
+
+ Rule other = (Rule) obj;
+
+ if (cases == null) {
+ if (other.cases != null) return false;
+ } else if (!cases.equals(other.cases)) return false;
+
+ if (name == null) {
+ if (other.name != null) return false;
+ } else if (!name.equals(other.name)) return false;
+
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("Rule [ruleName='%s', ruleCases=%s]", name, cases);
+ }
+}