Skip to content

Commit

Permalink
Improve RegexInterpreter
Browse files Browse the repository at this point in the history
  • Loading branch information
Kota Mizushima committed Dec 19, 2016
1 parent 44446e2 commit 67cf54b
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 3 deletions.
Expand Up @@ -5,6 +5,7 @@
public class AstNode {
public interface RVisitor<R, C> {
public R visitRGrouped(RGrouped node, C context);
public R visitRAny(RAny node, C context);
public R visitRString(RString node, C context);
public R visitRChoice(RChoice node, C context);
public R visitRSequence(RSequence node, C context);
Expand All @@ -30,6 +31,15 @@ public <R, C> R accept(RVisitor<R, C> visitor, C context) {
return visitor.visitRString(this, context);
}
}
public static class RAny extends RExpression {
public RAny() {
}

@Override
public <R, C> R accept(RVisitor<R, C> visitor, C context) {
return visitor.visitRAny(this, context);
}
}
public static class RChoice extends RExpression {
private final RExpression lhs, rhs;

Expand Down
Expand Up @@ -17,6 +17,11 @@ public AstNode.RExpression visitRString(AstNode.RString node, Void context) {
return node;
}

@Override
public AstNode.RExpression visitRAny(AstNode.RAny node, Void context) {
return node;
}

@Override
public AstNode.RExpression visitRChoice(AstNode.RChoice node, Void context) {
return new AstNode.RChoice(
Expand Down Expand Up @@ -74,6 +79,17 @@ public Boolean visitRString(AstNode.RString node, SuccessfullContinuation contex
}
}

@Override
public Boolean visitRAny(AstNode.RAny node, SuccessfullContinuation context) {
String slice = input.substring(cursor);
if(slice.length() > 0) {
cursor++;
return context.invoke();
} else {
return false;
}
}

@Override
public Boolean visitRChoice(AstNode.RChoice node, SuccessfullContinuation context) {
final int start = cursor;
Expand Down
Expand Up @@ -44,7 +44,7 @@ public Rule<AstNode.RExpression> repeatable() {

public Rule<AstNode.RExpression> primary() {
return rule(() ->
grouped().or(single()).or(escaped())
grouped().or(single()).or(escaped()).or(rany())
);
}

Expand All @@ -64,9 +64,14 @@ public Rule<AstNode.RExpression> escaped() {
string("\\").cat(meta()).map(t -> new AstNode.RString(t.item2()))
);
}
public Rule<AstNode.RExpression> rany() {
return rule(() ->
string(".").map(__ -> new AstNode.RAny())
);
}
public Rule<String> meta() {
return rule(() ->
set('|', '*', '+', '(', ')', '\\')
set('|', '*', '+', '(', ')', '.', '\\')
);
}
}
2 changes: 1 addition & 1 deletion src/test/java/com/github/kmizu/jcombinator/AllTests.java
Expand Up @@ -4,6 +4,6 @@
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({PrimitiveTest.class, ChainlTest.class})
@Suite.SuiteClasses({PrimitiveTest.class, ChainlTest.class, RegexTest.class})
public class AllTests {
}
36 changes: 36 additions & 0 deletions src/test/java/com/github/kmizu/jcombinator/RegexTest.java
@@ -0,0 +1,36 @@
package com.github.kmizu.jcombinator;

import com.github.kmizu.jcombinator.showcase.regex.RegexInterpreter;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

import static org.junit.Assert.*;

@RunWith(JUnit4.class)
public class RegexTest {
private RegexInterpreter i;
@Before
public void initializeInterpreter() {
i = new RegexInterpreter();
}
@Test
public void testPrimitives() {
assertTrue(i.matches("a", "a"));
assertFalse(i.matches("b", "a"));
assertFalse(i.matches("a", "b"));
assertTrue(i.matches(".", "a"));
assertTrue(i.matches(".", "b"));
}

@Test
public void testSequence() {
assertTrue(i.matches("ab", "ab"));
assertTrue(i.matches("bc", "bc"));
assertTrue(i.matches(".a", "xa"));
assertTrue(i.matches(".a", "ya"));
assertTrue(i.matches(".a", "za"));
assertFalse(i.matches(".a", "xb"));
}
}

0 comments on commit 67cf54b

Please sign in to comment.