diff options
Diffstat (limited to 'src/main/java/bjc/rgens/parser/elements/InlineRuleCaseElement.java')
| -rw-r--r-- | src/main/java/bjc/rgens/parser/elements/InlineRuleCaseElement.java | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/src/main/java/bjc/rgens/parser/elements/InlineRuleCaseElement.java b/src/main/java/bjc/rgens/parser/elements/InlineRuleCaseElement.java index 6cb0ce3..ea22bb4 100644 --- a/src/main/java/bjc/rgens/parser/elements/InlineRuleCaseElement.java +++ b/src/main/java/bjc/rgens/parser/elements/InlineRuleCaseElement.java @@ -3,23 +3,38 @@ package bjc.rgens.parser.elements; import bjc.rgens.parser.GenerationState; import bjc.rgens.parser.RGrammarParser; +import bjc.utils.data.IPair; import bjc.utils.funcdata.FunctionalList; import bjc.utils.funcdata.IList; +import bjc.utils.gen.WeightedRandom; public class InlineRuleCaseElement extends CaseElement { - public final IList<CaseElement> elements; + public final WeightedRandom<CaseElement> elements; - public InlineRuleCaseElement(String... elements) { - this(RGrammarParser.parseElementString(elements).getLeft()); - } + public InlineRuleCaseElement(String... parts) { + super(true); + + this.elements = new WeightedRandom<>(); + + for(String part : parts) { + String[] partArr; + + if(part.contains("|")) { + partArr = part.split("\\|"); + } else { + partArr = new String[] {part}; + } - public InlineRuleCaseElement(IList<CaseElement> elements) { - super(ElementType.RULEREF); + IPair<IList<CaseElement>, Integer> par = RGrammarParser.parseElementString(partArr); + int prob = par.getRight(); - this.elements = elements; + for(CaseElement elm :par.getLeft()) { + elements.addProbability(prob, elm); + } + } } public void generate(GenerationState state) { - elements.randItem(state.rnd::nextInt).generate(state); + elements.generateValue(state.rnd).generate(state); } } |
