diff options
| author | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2018-06-07 20:37:51 -0300 |
|---|---|---|
| committer | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2018-06-07 20:37:51 -0300 |
| commit | 44a8d9d2d56a311293ec86ea40df7126748300a1 (patch) | |
| tree | cc53c34a97a403ddb4a8d112f09124ee42c4507a /src/main/java/bjc/rgens/parser/RGrammarParser.java | |
| parent | 7422af49fa5c4da57323abe676a99468d401c44b (diff) | |
Refactoring
The main refactoring here is removing the type field from the various
classes, but there are a few other smaller ones.
This also contains the grounds for a refactoring on variable use
Diffstat (limited to 'src/main/java/bjc/rgens/parser/RGrammarParser.java')
| -rwxr-xr-x | src/main/java/bjc/rgens/parser/RGrammarParser.java | 50 |
1 files changed, 44 insertions, 6 deletions
diff --git a/src/main/java/bjc/rgens/parser/RGrammarParser.java b/src/main/java/bjc/rgens/parser/RGrammarParser.java index c807f5f..a869179 100755 --- a/src/main/java/bjc/rgens/parser/RGrammarParser.java +++ b/src/main/java/bjc/rgens/parser/RGrammarParser.java @@ -1,7 +1,6 @@ package bjc.rgens.parser; -import bjc.rgens.parser.elements.CaseElement; -import bjc.rgens.parser.elements.SerialCaseElement; +import bjc.rgens.parser.elements.*; import bjc.utils.data.IPair; import bjc.utils.data.Pair; @@ -475,7 +474,9 @@ public class RGrammarParser { int serialLower = -1; int serialUpper = -1; + int chance = -1; boolean doSerial = false; + boolean doChance = false; for (String csepart : cses) { String partToAdd = csepart.trim(); @@ -493,6 +494,34 @@ public class RGrammarParser { serialUpper = Integer.parseInt(partToAdd.substring(partToAdd.lastIndexOf(".") + 1, partToAdd.length() - 1)); doSerial = true; + } else if(partToAdd.matches("\\<\\?\\d+\\>")) { + chance = Integer.parseInt(partToAdd.substring(2, partToAdd.length() - 1)); + + doChance = true; + } else if (partToAdd.matches("\\<\\<\\>")) { + CaseElement elm = caseParts.popLast(); + + if(repCount == 0) { + /* Skip no-reps */ + } else { + if(doChance) { + elm = new ChanceCaseElement(elm, chance); + + doChance = false; + } + + if(doSerial) { + elm = new SerialCaseElement(elm, serialLower, serialUpper); + + doSerial = false; + } + + for(int i = 1; i <= repCount; i++) { + caseParts.add(elm); + } + + repCount = 1; + } } else if(partToAdd.matches("\\<[^\\>]+\\>")) { throw new GrammarException("Unknown parser meta-rule " + partToAdd); } else { @@ -500,14 +529,23 @@ public class RGrammarParser { if(repCount == 0) { /* Skip no-reps */ - } else if(doSerial) { - caseParts.add(new SerialCaseElement(elm, serialLower, serialUpper)); - - doSerial = false; } else { + if(doChance) { + elm = new ChanceCaseElement(elm, chance); + + doChance = false; + } + + if(doSerial) { + elm = new SerialCaseElement(elm, serialLower, serialUpper); + + doSerial = false; + } + for(int i = 1; i <= repCount; i++) { caseParts.add(elm); } + } repCount = 1; |
