Some improvements

This commit is contained in:
Alberto Venturini 2021-07-11 21:38:27 +02:00
parent 90f84950d2
commit ecf43c0279
3 changed files with 15 additions and 21 deletions
parsley-grammar/src/main/java/com/albertoventurini/parsley/grammar

View file

@ -10,13 +10,22 @@ public abstract class Grammar {
protected abstract Rule commentRule();
/**
* Default whitespace predicate for grammars.
* @param c a character
* @return true if c is whitespace, false otherwise
*/
protected boolean whitespace(final char c) {
return Character.isWhitespace(c);
}
public Optional<ParseTree> parse(final String text) {
final var ctx = new GrammarContext(text, commentRule(), this::whitespace);
final var ctx = new GrammarContext(text, commentRule()) {
@Override
protected boolean isWhitespace(final char c) {
return whitespace(c);
}
};
return startRule().apply(ctx);
}
}

View file

@ -2,20 +2,15 @@ package com.albertoventurini.parsley.grammar;
import com.albertoventurini.parsley.grammar.rules.Rule;
import java.util.function.Predicate;
public class GrammarContext extends ParseContext {
public abstract class GrammarContext extends ParseContext {
private final Rule commentRule;
private final Predicate<Character> whitespacePredicate;
private boolean inComment;
GrammarContext(
final String string,
final Rule commentRule,
final Predicate<Character> whitespacePredicate) {
final Rule commentRule) {
super(string);
this.commentRule = commentRule;
this.whitespacePredicate = whitespacePredicate;
}
public void advanceToNextToken() {
@ -63,9 +58,5 @@ public class GrammarContext extends ParseContext {
}
}
private boolean isWhitespace(final char c) {
return whitespacePredicate.test(c);
// return Character.isWhitespace(c) || c == '\n';
// return c != '\n' && Character.isWhitespace(c);
}
protected abstract boolean isWhitespace(final char c);
}

View file

@ -1,7 +1,5 @@
package com.albertoventurini.parsley.grammar;
import java.util.Arrays;
class ParseContext {
private final char[] charArr;
private int cursor;
@ -51,17 +49,13 @@ class ParseContext {
}
public String substring(final int start, final int end) {
return String.valueOf(Arrays.copyOfRange(charArr, start, end));
return new String(charArr, start, end-start);
}
public String substring(final int start) {
return substring(start, cursor);
}
public String substring() {
return String.valueOf(Arrays.copyOfRange(charArr, cursor, charArr.length));
}
public boolean matches(final String s) {
if (cursor + s.length() > charArr.length) {
return false;