From 4809072030d5ce659f38d9756213fca1db1e7f6c Mon Sep 17 00:00:00 2001 From: "Benjamin J. Culkin" Date: Mon, 4 Jun 2018 21:12:47 -0300 Subject: Declaration follows use Simple/expanding variables are now marked with a $, as they are when used. Additionally, some debugging help was added --- src/main/java/bjc/rgens/parser/RGrammar.java | 2 +- src/main/java/bjc/rgens/parser/RGrammarParser.java | 2 ++ src/main/java/bjc/rgens/parser/Rule.java | 5 +++++ src/main/java/bjc/rgens/parser/RuleCase.java | 8 +++++++- src/main/java/bjc/rgens/parser/elements/CaseElement.java | 4 ++-- .../java/bjc/rgens/parser/elements/ExpVariableCaseElement.java | 2 +- src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java | 4 ++-- 7 files changed, 20 insertions(+), 7 deletions(-) (limited to 'src/main/java/bjc/rgens') diff --git a/src/main/java/bjc/rgens/parser/RGrammar.java b/src/main/java/bjc/rgens/parser/RGrammar.java index 1d33dfe..bd289e9 100755 --- a/src/main/java/bjc/rgens/parser/RGrammar.java +++ b/src/main/java/bjc/rgens/parser/RGrammar.java @@ -159,7 +159,7 @@ public class RGrammar { if(rl.doRecur()) { RuleCase start = rules.get(fromRule).getCase(state.rnd); - System.err.printf("\tFINE: Generating case %d (from %s)\n", start.serial, fromRule); + System.err.printf("\tFINE: Generating %s (from %s)\n", start, fromRule); generateCase(start, state); diff --git a/src/main/java/bjc/rgens/parser/RGrammarParser.java b/src/main/java/bjc/rgens/parser/RGrammarParser.java index ecca7ca..c807f5f 100755 --- a/src/main/java/bjc/rgens/parser/RGrammarParser.java +++ b/src/main/java/bjc/rgens/parser/RGrammarParser.java @@ -493,6 +493,8 @@ public class RGrammarParser { serialUpper = Integer.parseInt(partToAdd.substring(partToAdd.lastIndexOf(".") + 1, partToAdd.length() - 1)); doSerial = true; + } else if(partToAdd.matches("\\<[^\\>]+\\>")) { + throw new GrammarException("Unknown parser meta-rule " + partToAdd); } else { CaseElement elm = CaseElement.createElement(partToAdd); diff --git a/src/main/java/bjc/rgens/parser/Rule.java b/src/main/java/bjc/rgens/parser/Rule.java index d0e5ec9..3e7d884 100755 --- a/src/main/java/bjc/rgens/parser/Rule.java +++ b/src/main/java/bjc/rgens/parser/Rule.java @@ -38,6 +38,7 @@ public class Rule { private final static Random BASE = new Random(); + private int serial = 1; /** * Create a new grammar rule. * @@ -83,6 +84,8 @@ public class Rule { } cse.belongsTo = name; + cse.debugName = String.format("%s-%d", name, serial); + serial += 1; cases.addProbability(weight, cse); } @@ -141,6 +144,8 @@ public class Rule { for(IPair cse : cases) { RuleCase cs = cse.getRight(); cs.belongsTo = name; + cs.debugName = String.format("%s-%d", name, serial); + serial += 1; this.cases.addProbability(cse.getLeft(), cs); } diff --git a/src/main/java/bjc/rgens/parser/RuleCase.java b/src/main/java/bjc/rgens/parser/RuleCase.java index 3581d54..3481f37 100755 --- a/src/main/java/bjc/rgens/parser/RuleCase.java +++ b/src/main/java/bjc/rgens/parser/RuleCase.java @@ -14,6 +14,8 @@ import bjc.utils.funcdata.IList; * @author EVE */ public abstract class RuleCase { + public String debugName; + public final int serial; private static int nextSerial = 0; @@ -99,7 +101,11 @@ public abstract class RuleCase { } public String toString() { - return String.format("Case %d of %s", hashCode(), belongsTo); + if(debugName != null) { + return String.format("Case %d (%s) of %s", serial, debugName, belongsTo); + } else { + return String.format("Case %d (%s-%d) of %s", serial, belongsTo, serial, belongsTo); + } } } diff --git a/src/main/java/bjc/rgens/parser/elements/CaseElement.java b/src/main/java/bjc/rgens/parser/elements/CaseElement.java index 8f3a8d4..103c00a 100755 --- a/src/main/java/bjc/rgens/parser/elements/CaseElement.java +++ b/src/main/java/bjc/rgens/parser/elements/CaseElement.java @@ -87,7 +87,7 @@ public abstract class CaseElement { //System.out.printf("\t\tTRACE: special body is '%s'\n", specialBody); - if (specialBody.matches("\\S+:=\\S+")) { + if (specialBody.matches("\\$\\S+:=\\S+")) { /* Handle expanding variable definitions. */ String[] parts = specialBody.split(":="); @@ -104,7 +104,7 @@ public abstract class CaseElement { * valid rule name, since it gets used as one. */ return new ExpVariableCaseElement(parts[0], parts[1]); - } else if (specialBody.matches("\\S+=\\S+")) { + } else if (specialBody.matches("\\$\\S+=\\S+")) { /* Handle regular variable definitions. */ String[] parts = specialBody.split("="); diff --git a/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java b/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java index 5c66e9f..58c5479 100755 --- a/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java +++ b/src/main/java/bjc/rgens/parser/elements/ExpVariableCaseElement.java @@ -21,7 +21,7 @@ public class ExpVariableCaseElement extends VariableCaseElement { if(rl.doRecur()) { RuleCase destCase = state.rules.get(varDef).getCase(); - System.err.printf("\tFINE: Generating case %d (from %s)\n", destCase.serial, varDef); + System.err.printf("\tFINE: Generating %s (from %s)\n", destCase, varDef); state.gram.generateCase(destCase, newState); diff --git a/src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java b/src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java index 7bab6bf..66c0296 100755 --- a/src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java +++ b/src/main/java/bjc/rgens/parser/elements/RuleCaseElement.java @@ -31,13 +31,13 @@ public abstract class RuleCaseElement extends StringCaseElement { newState.swapGrammar(dst); /* :Postprocessing */ - newState.contents = new StringBuilder(dst.generate(actName, state.rnd, state.vars)); + newState.contents = new StringBuilder(dst.generate(actName, state.rnd, state.vars, state.rlVars)); } else if (state.rules.containsKey(actName)) { Rule rl = state.rules.get(actName); if(rl.doRecur()) { RuleCase cse = rl.getCase(state.rnd); - System.err.printf("\tFINE: Generating case %d (from %s)\n", cse.serial, actName); + System.err.printf("\tFINE: Generating %s (from %s)\n", cse, actName); state.gram.generateCase(cse, newState); -- cgit v1.2.3