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

View file

@ -10,13 +10,22 @@ public abstract class Grammar {
protected abstract Rule commentRule(); 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) { protected boolean whitespace(final char c) {
return Character.isWhitespace(c); return Character.isWhitespace(c);
} }
public Optional<ParseTree> parse(final String text) { 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); return startRule().apply(ctx);
} }
} }

View file

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

View file

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