Skip to content

Commit

Permalink
Merge pull request #16 from jdrem/states-out-of-order-#15
Browse files Browse the repository at this point in the history
Allow states to be out of order. #15
  • Loading branch information
jdrem committed Dec 6, 2019
2 parents 7c61b5d + 2404cf5 commit 16cb511
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 2 deletions.
13 changes: 11 additions & 2 deletions src/main/java/net/remgant/tools/parser/Parser.java
Original file line number Diff line number Diff line change
Expand Up @@ -53,10 +53,17 @@ static class State {

protected void addState(int state, Predicate<Token> predicate, int nextState, ParserAction action) {
if (stateList.size() < state + 1) {
if (stateList.size() < state + 1)
for (int i=0; i<state + 1; i++)
stateList.add(null);
List<State> list = new ArrayList<>();
stateList.add(state, list);
stateList.set(state, list);
}
List<State> list = stateList.get(state);
if (list == null) {
list = new ArrayList<>();
stateList.set(state, list);
}
list.add(new State(state, predicate, nextState, action));
}

Expand All @@ -67,8 +74,10 @@ protected Parser() {
init();
}

protected void printStateDiagram(@SuppressWarnings("SameParameterValue") PrintStream out) {
public void printStateDiagram(@SuppressWarnings("SameParameterValue") PrintStream out) {
for (List<State> l : stateList) {
if (l == null)
continue;
for (State s : l) {
String ts;
if (Token.tokenMap.containsKey(s.predicate))
Expand Down
54 changes: 54 additions & 0 deletions src/test/java/net/remgant/tools/parser/test/OutOfSeqStateTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package net.remgant.tools.parser.test;

import net.remgant.tools.parser.Parser;
import net.remgant.tools.parser.ParserException;
import net.remgant.tools.parser.ParserResult;
import net.remgant.tools.parser.Token;
import org.junit.Test;

import java.util.Collections;

public class OutOfSeqStateTest {
@Test
public void testSkipStates() throws ParserException {
Parser parser = new Parser() {
@Override
protected void init() {
addState(0, Token.MATCH_ANY, 1, null);
addState(1, Token.MATCH_ANY, 100, null);
addState(100, Token.MATCH_ANY, 999, null);
terminalStates = Collections.singleton(999);
}

@Override
public ParserResult parse(String source) throws ParserException {
init();
return super.parse(source);
}
};
parser.parse("a b c");
parser.printStateDiagram(System.out);
}

@Test
public void testOutOfOrderStates() throws ParserException {
Parser parser = new Parser() {
@Override
protected void init() {
addState(0, Token.MATCH_ANY, 1, null);
addState(2, Token.MATCH_ANY, 3, null);
addState(1, Token.MATCH_ANY, 2, null);
addState(3, Token.MATCH_ANY, 999, null);
terminalStates = Collections.singleton(999);
}

@Override
public ParserResult parse(String source) throws ParserException {
init();
return super.parse(source);
}
};

parser.parse("a b c d");
}
}

0 comments on commit 16cb511

Please sign in to comment.