Some improvements
This commit is contained in:
parent
90f84950d2
commit
ecf43c0279
3 changed files with 15 additions and 21 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue