summaryrefslogtreecommitdiff
path: root/src/main/java/bjc
diff options
context:
space:
mode:
authorBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-06-04 16:49:22 -0300
committerBenjamin J. Culkin <bjculkin@mix.wvu.edu>2018-06-04 16:49:22 -0300
commit899efcc5442804e312b6d98aa248ac3601da06d3 (patch)
treebcab461c54260db7737db56b20661a9377e403cd /src/main/java/bjc
parent3b760ca916c6a88265e348d77ee1f6497dace0a4 (diff)
Update
Diffstat (limited to 'src/main/java/bjc')
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/RGrammarSet.java2
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/Rule.java33
-rwxr-xr-xsrc/main/java/bjc/rgens/parser/elements/CaseElement.java19
3 files changed, 47 insertions, 7 deletions
diff --git a/src/main/java/bjc/rgens/parser/RGrammarSet.java b/src/main/java/bjc/rgens/parser/RGrammarSet.java
index d734074..4be4790 100755
--- a/src/main/java/bjc/rgens/parser/RGrammarSet.java
+++ b/src/main/java/bjc/rgens/parser/RGrammarSet.java
@@ -76,7 +76,7 @@ public class RGrammarSet {
exportFrom.put(export.name, grammarName);
if(DEBUG)
- System.err.printf("\t\tDEBUG: %s exported from %s\n", export.name, grammarName);
+ System.err.printf("\t\tDEBUG: %s (%d cases) exported from %s\n", export.name, export.getCases().getSize(), grammarName);
}
/* Add exports to grammar. */
diff --git a/src/main/java/bjc/rgens/parser/Rule.java b/src/main/java/bjc/rgens/parser/Rule.java
index 4e43fd7..d0e5ec9 100755
--- a/src/main/java/bjc/rgens/parser/Rule.java
+++ b/src/main/java/bjc/rgens/parser/Rule.java
@@ -14,14 +14,30 @@ import java.util.Random;
*/
public class Rule {
/** The name of this grammar rule. */
- public final String name;
+ public String name;
/* The cases for this rule. */
private WeightedRandom<RuleCase> cases;
+ public static enum ProbType {
+ NORMAL,
+ DESCENDING,
+ BINOMIAL
+ }
+
+ public ProbType prob;
+
+ public int descentFactor;
+
+ public int target;
+ public int bound;
+ public int trials;
+
public int recurLimit = 5;
private int currentRecur;
+ private final static Random BASE = new Random();
+
/**
* Create a new grammar rule.
*
@@ -41,6 +57,8 @@ public class Rule {
name = ruleName;
cases = new WeightedRandom<>();
+
+ prob = ProbType.NORMAL;
}
/**
@@ -76,7 +94,7 @@ public class Rule {
* A random case from this rule.
*/
public RuleCase getCase() {
- return cases.generateValue();
+ return getCase(BASE);
}
/**
@@ -89,7 +107,16 @@ public class Rule {
* A random case from this rule.
*/
public RuleCase getCase(Random rnd) {
- return cases.generateValue(rnd);
+ switch(prob) {
+ case DESCENDING:
+ return cases.getDescent(descentFactor, rnd);
+ case BINOMIAL:
+ return cases.getBinomial(target, bound, trials, rnd);
+ case NORMAL:
+ return cases.generateValue(rnd);
+ default:
+ return cases.generateValue(rnd);
+ }
}
/**
diff --git a/src/main/java/bjc/rgens/parser/elements/CaseElement.java b/src/main/java/bjc/rgens/parser/elements/CaseElement.java
index f960c31..8f3a8d4 100755
--- a/src/main/java/bjc/rgens/parser/elements/CaseElement.java
+++ b/src/main/java/bjc/rgens/parser/elements/CaseElement.java
@@ -118,7 +118,6 @@ public abstract class CaseElement {
} else if (specialBody.matches("empty")) {
/* Literal blank, for empty cases. */
return new BlankCaseElement();
- } else if (specialBody.contains("|")) {
} else {
throw new IllegalArgumentException(String.format("Unknown special case part '%s'", specialBody));
}
@@ -131,7 +130,15 @@ public abstract class CaseElement {
return new RangeCaseElement(firstNum, secondNum);
} else if(rawCase.contains("|")) {
- return new InlineRuleCaseElement(specialBody.split("|"));
+ String[] elms = rawCase.split("\\|");
+
+ System.err.printf("\tTRACE: Split inline cases %s to ", rawCase);
+ for(String elm : elms) {
+ System.err.printf("%s, ", elm);
+ }
+ System.err.println();
+
+ return new InlineRuleCaseElement(elms);
} else if(csepart.contains("$")) {
/*
* @NOTE
@@ -147,7 +154,13 @@ public abstract class CaseElement {
} else {
return new NormalRuleReference(csepart);
}
- } else {
+ } else if(csepart.startsWith("%")) {
+ String rName = String.format("[%s]", csepart.substring(1));
+
+ System.err.printf("\tTRACE: short ref to %s (%s)\n", rName, csepart);
+
+ return new NormalRuleReference(rName);
+ } else{
return new LiteralCaseElement(csepart);
}
}