From 899efcc5442804e312b6d98aa248ac3601da06d3 Mon Sep 17 00:00:00 2001 From: "Benjamin J. Culkin" Date: Mon, 4 Jun 2018 16:49:22 -0300 Subject: Update --- src/main/java/bjc/rgens/parser/RGrammarSet.java | 2 +- src/main/java/bjc/rgens/parser/Rule.java | 33 ++++++++++++++++++++-- .../bjc/rgens/parser/elements/CaseElement.java | 19 +++++++++++-- 3 files changed, 47 insertions(+), 7 deletions(-) (limited to 'src/main/java/bjc') 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 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); } } -- cgit v1.2.3