From 97845332cfc08d01d897b5f8802d70d01c773711 Mon Sep 17 00:00:00 2001 From: bculkin2442 Date: Mon, 6 Feb 2017 10:29:18 -0500 Subject: Grammar feature update You can now do more things with grammars --- .../main/java/bjc/utils/gen/WeightedGrammar.java | 132 +++++++++++++++------ 1 file changed, 96 insertions(+), 36 deletions(-) (limited to 'BJC-Utils2/src/main') diff --git a/BJC-Utils2/src/main/java/bjc/utils/gen/WeightedGrammar.java b/BJC-Utils2/src/main/java/bjc/utils/gen/WeightedGrammar.java index 90b37f8..dbec7d0 100644 --- a/BJC-Utils2/src/main/java/bjc/utils/gen/WeightedGrammar.java +++ b/BJC-Utils2/src/main/java/bjc/utils/gen/WeightedGrammar.java @@ -1,7 +1,10 @@ package bjc.utils.gen; import java.util.Random; +import java.util.function.BiFunction; import java.util.function.Function; +import java.util.function.Supplier; +import java.util.function.Predicate; import bjc.utils.data.IPair; import bjc.utils.data.Pair; @@ -40,12 +43,34 @@ public class WeightedGrammar { */ protected IMap> subgrammars; + /** + * Rules that require special handling + */ + private IMap>> specialRules; + + /** + * Predicate for marking special tokens + */ + + private Predicate specialMarker; + + /** + * Action for special tokens + */ + private BiFunction, IList> specialAction; + + /** + * Action to reset grammar + */ + private Runnable resetSpecial; + /** * Create a new weighted grammar. */ public WeightedGrammar() { rules = new FunctionalMap<>(); subgrammars = new FunctionalMap<>(); + specialRules = new FunctionalMap<>(); } /** @@ -65,6 +90,24 @@ public class WeightedGrammar { rng = source; } + public void configureSpecial(Predicate marker, + BiFunction, IList> action, + Runnable reset) { + specialMarker = marker; + specialAction = action; + resetSpecial = reset; + } + + public void addSpecialRule(E ruleName, Supplier> cse) { + if(ruleName == null) { + throw new NullPointerException("Rule name must not be null"); + } else if (cse == null) { + throw new NullPointerException("Case must not be null"); + } + + specialRules.put(ruleName, cse); + } + /** * Add a case to an already existing rule. * @@ -248,8 +291,8 @@ public class WeightedGrammar { * @return A randomly generated sentance from the specified initial * rule. */ - public IList generateGenericValues(E initRule, Function tokenTransformer, T spacer) { - if (initRule == null) { + public IList generateGenericValues(E initRules, Function tokenTransformer, T spacer) { + if (initRules == null) { throw new NullPointerException("Initial rule must not be null"); } else if (tokenTransformer == null) { throw new NullPointerException("Transformer must not be null"); @@ -259,42 +302,55 @@ public class WeightedGrammar { IList returnedList = new FunctionalList<>(); - if (subgrammars.containsKey(initRule)) { - subgrammars.get(initRule) - .generateGenericValues(initRule, tokenTransformer, spacer) - .forEach(rulePart -> { - returnedList.add(rulePart); - returnedList.add(spacer); - }); - } else if (rules.containsKey(initRule)) { - rules.get(initRule) - .generateValue().forEach(rulePart -> { - if(rulePart.matches("\\[\\S+\\]") { - generateGenericValues(rulePart, tokenTransformer, spacer) - .forEach(generatedRulePart -> { - returnedList.add(generatedRulePart); - returnedList.add(spacer); - }); - } else { - T transformedToken = tokenTransformer.apply(initRule); - - if (transformedToken == null) { - throw new NullPointerException("Transformer created null token"); - } - - returnedList.add(transformedToken); - returnedList.add(spacer); - } - }); - } else { - T transformedToken = tokenTransformer.apply(initRule); + IList genRules = new FunctionalList(initRules); - if (transformedToken == null) { - throw new NullPointerException("Transformer created null token"); + if(specialMarker != null) { + if(specialMarker.test(initRules)) { + genRules = specialAction.apply(initRules, this); } + } + + for(E initRule : genRules.toIterable()) { + if(specialRules.containsKey(initRule)) { + for(E rulePart : specialRules.get(initRule).get().toIterable()) { + Iterable generatedRuleParts = generateGenericValues( + rulePart, tokenTransformer, spacer).toIterable(); + + for(T generatedRulePart : generatedRuleParts) { + returnedList.add(generatedRulePart); + returnedList.add(spacer); + } + } + } else if (subgrammars.containsKey(initRule)) { + Iterable ruleParts = subgrammars.get(initRule).generateGenericValues( + initRule, tokenTransformer, spacer).toIterable(); + + for(T rulePart : ruleParts) { + returnedList.add(rulePart); + returnedList.add(spacer); + } + } else if (rules.containsKey(initRule)) { + Iterable ruleParts = rules.get(initRule).generateValue().toIterable(); - returnedList.add(transformedToken); - returnedList.add(spacer); + for(E rulePart : ruleParts) { + Iterable generatedRuleParts = + generateGenericValues(rulePart, tokenTransformer, spacer).toIterable(); + + for(T generatedRulePart : generatedRuleParts) { + returnedList.add(generatedRulePart); + returnedList.add(spacer); + } + } + } else { + T transformedToken = tokenTransformer.apply(initRule); + + if (transformedToken == null) { + throw new NullPointerException("Transformer created null token"); + } + + returnedList.add(transformedToken); + returnedList.add(spacer); + } } return returnedList; @@ -312,7 +368,11 @@ public class WeightedGrammar { * rule. */ public IList generateListValues(E initRule, E spacer) { - return generateGenericValues(initRule, strang -> strang, spacer); + IList retList = generateGenericValues(initRule, strang -> strang, spacer); + + resetSpecial.run(); + + return retList; } /** -- cgit v1.2.3