aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-11-16 22:28:14 +0000
committerMichael Williamson <mike@zwobble.org>2016-11-16 22:28:14 +0000
commit9118a7ff1db7c740bad4f196d094c41f5a3a3629 (patch)
tree4e864b7cb704489414306cb50ff894869f5555c4 /src
parent9ee8ca4cb369f02096da7514222d1002801b1d9a (diff)
Simplify tokenising
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/styles/parsing/DocumentMatcherParser.java14
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/styles/parsing/HtmlPathParser.java18
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/styles/parsing/StyleMapParser.java2
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/styles/parsing/StyleMappingTokeniser.java13
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenIterator.java27
-rw-r--r--src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenType.java11
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/MammothTests.java2
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/styles/parsing/StyleMappingTokeniserTests.java18
8 files changed, 49 insertions, 56 deletions
diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/DocumentMatcherParser.java b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/DocumentMatcherParser.java
index ce14630..ab9ff8d 100644
--- a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/DocumentMatcherParser.java
+++ b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/DocumentMatcherParser.java
@@ -57,12 +57,11 @@ public class DocumentMatcherParser {
}
private static Optional<String> parseStyleName(TokenIterator<TokenType> tokens) {
- if (tokens.peekTokenType() == TokenType.OPEN_SQUARE_BRACKET) {
- tokens.skip();
+ if (tokens.trySkip(TokenType.SYMBOL, "[")) {
tokens.skip(TokenType.IDENTIFIER, "style-name");
- tokens.skip(TokenType.EQUALS);
+ tokens.skip(TokenType.SYMBOL, "=");
String value = TokenParser.parseString(tokens);
- tokens.skip(TokenType.CLOSE_SQUARE_BRACKET);
+ tokens.skip(TokenType.SYMBOL, "]");
return Optional.of(value);
} else {
return Optional.empty();
@@ -70,12 +69,11 @@ public class DocumentMatcherParser {
}
private static Optional<NumberingLevel> parseNumbering(TokenIterator<TokenType> tokens) {
- if (tokens.peekTokenType() == TokenType.COLON) {
- tokens.skip();
+ if (tokens.trySkip(TokenType.SYMBOL, ":")) {
boolean isOrdered = parseListType(tokens);
- tokens.skip(TokenType.OPEN_PAREN);
+ tokens.skip(TokenType.SYMBOL, "(");
String level = new BigInteger(tokens.nextValue(TokenType.INTEGER)).subtract(BigInteger.ONE).toString();
- tokens.skip(TokenType.CLOSE_PAREN);
+ tokens.skip(TokenType.SYMBOL, ")");
return Optional.of(new NumberingLevel(level, isOrdered));
} else {
return Optional.empty();
diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/HtmlPathParser.java b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/HtmlPathParser.java
index ef975f6..b384ef7 100644
--- a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/HtmlPathParser.java
+++ b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/HtmlPathParser.java
@@ -13,8 +13,7 @@ import static org.zwobble.mammoth.internal.util.Maps.map;
public class HtmlPathParser {
public static HtmlPath parse(TokenIterator<TokenType> tokens) {
- if (tokens.peekTokenType() == TokenType.BANG) {
- tokens.skip(TokenType.BANG);
+ if (tokens.trySkip(TokenType.SYMBOL, "!")) {
return HtmlPath.IGNORE;
} else {
return parseHtmlPathElements(tokens);
@@ -27,9 +26,9 @@ public class HtmlPathParser {
if (tokens.peekTokenType() == TokenType.IDENTIFIER) {
HtmlPathElement element = parseElement(tokens);
elements.add(element);
- while (tokens.peekTokenType() == TokenType.WHITESPACE && tokens.peekTokenType(1) == TokenType.GREATER_THAN) {
+ while (tokens.peekTokenType() == TokenType.WHITESPACE && tokens.isNext(1, TokenType.SYMBOL, ">")) {
tokens.skip(TokenType.WHITESPACE);
- tokens.skip(TokenType.GREATER_THAN);
+ tokens.skip(TokenType.SYMBOL, ">");
tokens.skip(TokenType.WHITESPACE);
elements.add(parseElement(tokens));
}
@@ -52,8 +51,7 @@ public class HtmlPathParser {
private static List<String> parseTagNames(TokenIterator<TokenType> tokens) {
List<String> tagNames = new ArrayList<>();
tagNames.add(tokens.nextValue(TokenType.IDENTIFIER));
- while (tokens.peekTokenType() == TokenType.CHOICE) {
- tokens.skip();
+ while (tokens.trySkip(TokenType.SYMBOL, "|")) {
tagNames.add(tokens.nextValue(TokenType.IDENTIFIER));
}
return tagNames;
@@ -69,20 +67,20 @@ public class HtmlPathParser {
private static boolean parseIsFresh(TokenIterator<TokenType> tokens) {
return tokens.tryParse(() -> {
- tokens.skip(TokenType.COLON);
+ tokens.skip(TokenType.SYMBOL, ":");
tokens.skip(TokenType.IDENTIFIER, "fresh");
});
}
private static String parseSeparator(TokenIterator<TokenType> tokens) {
boolean isSeparator = tokens.tryParse(() -> {
- tokens.skip(TokenType.COLON);
+ tokens.skip(TokenType.SYMBOL, ":");
tokens.skip(TokenType.IDENTIFIER, "separator");
});
if (isSeparator) {
- tokens.skip(TokenType.OPEN_PAREN);
+ tokens.skip(TokenType.SYMBOL, "(");
String value = TokenParser.parseString(tokens);
- tokens.skip(TokenType.CLOSE_PAREN);
+ tokens.skip(TokenType.SYMBOL, ")");
return value;
} else {
return "";
diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/StyleMapParser.java b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/StyleMapParser.java
index c8dc221..002a5aa 100644
--- a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/StyleMapParser.java
+++ b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/StyleMapParser.java
@@ -46,7 +46,7 @@ public class StyleMapParser {
BiConsumer<StyleMapBuilder, HtmlPath> documentMatcher = DocumentMatcherParser.parse(tokens);
tokens.skip(TokenType.WHITESPACE);
- tokens.skip(TokenType.ARROW);
+ tokens.skip(TokenType.SYMBOL, "=>");
HtmlPath htmlPath = parseHtmlPath(tokens);
diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/StyleMappingTokeniser.java b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/StyleMappingTokeniser.java
index 1eec870..704ba86 100644
--- a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/StyleMappingTokeniser.java
+++ b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/StyleMappingTokeniser.java
@@ -13,20 +13,11 @@ public class StyleMappingTokeniser {
list(
RegexTokeniser.rule(TokenType.IDENTIFIER, "([a-zA-Z][a-zA-Z0-9\\-]*)"),
RegexTokeniser.rule(TokenType.CLASS_NAME, "(\\.(?:[a-zA-Z0-9\\-]|\\\\.)+)"),
- RegexTokeniser.rule(TokenType.COLON, ":"),
- RegexTokeniser.rule(TokenType.GREATER_THAN, ">"),
+ RegexTokeniser.rule(TokenType.SYMBOL, ":|>|=>|=|\\(|\\)|\\[|\\]|\\||!"),
RegexTokeniser.rule(TokenType.WHITESPACE, "\\s+"),
- RegexTokeniser.rule(TokenType.ARROW, "=>"),
- RegexTokeniser.rule(TokenType.EQUALS, "="),
- RegexTokeniser.rule(TokenType.OPEN_PAREN, "\\("),
- RegexTokeniser.rule(TokenType.CLOSE_PAREN, "\\)"),
- RegexTokeniser.rule(TokenType.OPEN_SQUARE_BRACKET, "\\["),
- RegexTokeniser.rule(TokenType.CLOSE_SQUARE_BRACKET, "\\]"),
RegexTokeniser.rule(TokenType.STRING, stringPrefix + "'"),
RegexTokeniser.rule(TokenType.UNTERMINATED_STRING, stringPrefix),
- RegexTokeniser.rule(TokenType.INTEGER, "([0-9]+)"),
- RegexTokeniser.rule(TokenType.CHOICE, "\\|"),
- RegexTokeniser.rule(TokenType.BANG, "!")
+ RegexTokeniser.rule(TokenType.INTEGER, "([0-9]+)")
)
);
List<Token<TokenType>> tokens = tokeniser.tokenise(line);
diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenIterator.java b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenIterator.java
index f79974d..7ac7643 100644
--- a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenIterator.java
+++ b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenIterator.java
@@ -11,16 +11,31 @@ public class TokenIterator<T> {
this.index = 0;
}
- public T peekTokenType() {
- return tokens.get(index).getTokenType();
+ public boolean isNext(int offset, T tokenType, String value) {
+ int tokenIndex = index + offset;
+ if (tokenIndex < tokens.size()) {
+ Token<T> token = tokens.get(tokenIndex);
+ return token.getTokenType().equals(tokenType) && token.getValue().equals(value);
+ } else {
+ return false;
+ }
}
- public T peekTokenType(int count) {
- return peekToken(count).getTokenType();
+ public boolean isNext(T tokenType, String value) {
+ return isNext(0, tokenType, value);
}
- public Token<T> peekToken(int count) {
- return tokens.get(index + count);
+ public boolean trySkip(T tokenType, String value) {
+ if (isNext(tokenType, value)) {
+ skip();
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public T peekTokenType() {
+ return tokens.get(index).getTokenType();
}
public Token<T> next(T type) {
diff --git a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenType.java b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenType.java
index f17b85e..17442b5 100644
--- a/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenType.java
+++ b/src/main/java/org/zwobble/mammoth/internal/styles/parsing/TokenType.java
@@ -4,19 +4,10 @@ public enum TokenType {
WHITESPACE,
IDENTIFIER,
CLASS_NAME,
- COLON,
- GREATER_THAN,
- ARROW,
- EQUALS,
- OPEN_PAREN,
- CLOSE_PAREN,
- OPEN_SQUARE_BRACKET,
- CLOSE_SQUARE_BRACKET,
+ SYMBOL,
STRING,
UNTERMINATED_STRING,
INTEGER,
- CHOICE,
- BANG,
EOF,
UNKNOWN
}
diff --git a/src/test/java/org/zwobble/mammoth/tests/MammothTests.java b/src/test/java/org/zwobble/mammoth/tests/MammothTests.java
index 3bab856..8454a3d 100644
--- a/src/test/java/org/zwobble/mammoth/tests/MammothTests.java
+++ b/src/test/java/org/zwobble/mammoth/tests/MammothTests.java
@@ -213,7 +213,7 @@ public class MammothTests {
assertThat(
exception.getMessage(),
equalTo(
- "error reading style map at line 2, character 14: expected token of type STRING but was of type CLOSE_SQUARE_BRACKET\n\n" +
+ "error reading style map at line 2, character 14: expected token of type STRING but was of type SYMBOL\n\n" +
"p[style-name=] =>\n" +
" ^"));
}
diff --git a/src/test/java/org/zwobble/mammoth/tests/styles/parsing/StyleMappingTokeniserTests.java b/src/test/java/org/zwobble/mammoth/tests/styles/parsing/StyleMappingTokeniserTests.java
index a7edf9f..0e0c920 100644
--- a/src/test/java/org/zwobble/mammoth/tests/styles/parsing/StyleMappingTokeniserTests.java
+++ b/src/test/java/org/zwobble/mammoth/tests/styles/parsing/StyleMappingTokeniserTests.java
@@ -52,7 +52,7 @@ public class StyleMappingTokeniserTests {
@Test
public void arrowsAreTokenised() {
- assertTokens("=>=>", isToken(TokenType.ARROW, "=>"), isToken(TokenType.ARROW, "=>"));
+ assertTokens("=>=>", isToken(TokenType.SYMBOL, "=>"), isToken(TokenType.SYMBOL, "=>"));
}
@Test
@@ -62,42 +62,42 @@ public class StyleMappingTokeniserTests {
@Test
public void colonsAreTokenised() {
- assertTokens("::", isToken(TokenType.COLON, ":"), isToken(TokenType.COLON, ":"));
+ assertTokens("::", isToken(TokenType.SYMBOL, ":"), isToken(TokenType.SYMBOL, ":"));
}
@Test
public void greaterThansAreTokenised() {
- assertTokens(">>", isToken(TokenType.GREATER_THAN, ">"), isToken(TokenType.GREATER_THAN, ">"));
+ assertTokens(">>", isToken(TokenType.SYMBOL, ">"), isToken(TokenType.SYMBOL, ">"));
}
@Test
public void equalsAreTokenised() {
- assertTokens("==", isToken(TokenType.EQUALS, "="), isToken(TokenType.EQUALS, "="));
+ assertTokens("==", isToken(TokenType.SYMBOL, "="), isToken(TokenType.SYMBOL, "="));
}
@Test
public void openParensAreTokenised() {
- assertTokens("((", isToken(TokenType.OPEN_PAREN, "("), isToken(TokenType.OPEN_PAREN, "("));
+ assertTokens("((", isToken(TokenType.SYMBOL, "("), isToken(TokenType.SYMBOL, "("));
}
@Test
public void closeParensAreTokenised() {
- assertTokens("))", isToken(TokenType.CLOSE_PAREN, ")"), isToken(TokenType.CLOSE_PAREN, ")"));
+ assertTokens("))", isToken(TokenType.SYMBOL, ")"), isToken(TokenType.SYMBOL, ")"));
}
@Test
public void openSquareBracketsAreTokenised() {
- assertTokens("[[", isToken(TokenType.OPEN_SQUARE_BRACKET, "["), isToken(TokenType.OPEN_SQUARE_BRACKET, "["));
+ assertTokens("[[", isToken(TokenType.SYMBOL, "["), isToken(TokenType.SYMBOL, "["));
}
@Test
public void closeSquareBracketsAreTokenised() {
- assertTokens("]]", isToken(TokenType.CLOSE_SQUARE_BRACKET, "]"), isToken(TokenType.CLOSE_SQUARE_BRACKET, "]"));
+ assertTokens("]]", isToken(TokenType.SYMBOL, "]"), isToken(TokenType.SYMBOL, "]"));
}
@Test
public void choicesAreTokenised() {
- assertTokens("||", isToken(TokenType.CHOICE, "|"), isToken(TokenType.CHOICE, "|"));
+ assertTokens("||", isToken(TokenType.SYMBOL, "|"), isToken(TokenType.SYMBOL, "|"));
}
@Test