org.unlaxer.parser.elementary.WildCardInterleaveParser Maven / Gradle / Ivy
package org.unlaxer.parser.elementary;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;
import org.unlaxer.Range;
import org.unlaxer.RangedString;
import org.unlaxer.Token;
import org.unlaxer.TokenKind;
import org.unlaxer.parser.Parser;
import org.unlaxer.parser.Parsers;
import org.unlaxer.parser.combinator.Choice;
import org.unlaxer.parser.combinator.ChoiceInterface;
import org.unlaxer.parser.combinator.LazyZeroOrMore;
import org.unlaxer.util.annotation.TokenExtractor;
public abstract class WildCardInterleaveParser extends LazyZeroOrMore{
abstract List interleaveParsers();
@Override
public Supplier getLazyParser() {
Parsers parsers = new Parsers(interleaveParsers());
parsers.add(Parser.get(WildCardCharacterParser.class));
return ()-> new Choice(parsers);
}
@TokenExtractor
public List getParsedWithConcattedCharcter(Token thisParserParsed) {
List concatted = new ArrayList<>();
List flatten = thisParserParsed.filteredChildren;
StringBuilder characters = new StringBuilder();
Integer current = null;
for (Token token : flatten) {
token = ChoiceInterface.choiced(token);
if(token.parser instanceof SingleCharacterParser) {
if(current == null) {
current = token.tokenRange.startIndexInclusive;
}
token.tokenString.ifPresent(characters::append);
}else {
if(characters.length()>0) {
Token token2 = new Token(
TokenKind.consumed,
new RangedString(new Range(current , token.tokenRange.endIndexExclusive), characters.toString()),
Parser.get(WildCardStringParser.class)
);
concatted.add(token2);
characters = new StringBuilder();
current = null;
}
concatted.add(token);
}
}
return concatted;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy