All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.unlaxer.parser.elementary.WordParser Maven / Gradle / Ivy

package org.unlaxer.parser.elementary;

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.UnaryOperator;

import org.unlaxer.CodePointIndex;
import org.unlaxer.CodePointLength;
import org.unlaxer.CursorRange;
import org.unlaxer.Name;
import org.unlaxer.Source;
import org.unlaxer.StringSource;
import org.unlaxer.Token;
import org.unlaxer.TokenKind;
import org.unlaxer.context.ParseContext;
import org.unlaxer.parser.TerminalSymbol;
import org.unlaxer.util.Slicer;


public class WordParser extends AbstractTokenParser implements TerminalSymbol{
	
	private static final long serialVersionUID = 77970028727135376L;
	public final Source word;
	public final boolean ignoreCase;
	
	public WordParser(String word) {
		this(null , word, false);
	}
	
	public WordParser(Name name,String word) {
		this(name, word, false);
	}
	
	public WordParser(String word, boolean ignoreCase) {
		this(null,word,ignoreCase);
	}

	public WordParser(Name name , String word, boolean ignoreCase) {
		this(name , StringSource.createDetachedSource(word) , ignoreCase);
	}
	
  public WordParser(Source word) {
    this(null , word, false);
  }
  
  public WordParser(Name name,Source word) {
    this(name, word, false);
  }
  
  public WordParser(Source word, boolean ignoreCase) {
    this(null,word,ignoreCase);
  }

	
  public WordParser(Name name , Source word, boolean ignoreCase) {
    super(name);
    this.word = word;
    this.ignoreCase = ignoreCase;
  }


	@Override
	public Token getToken(ParseContext parseContext, TokenKind tokenKind,boolean invertMatch) {
	  
		
		CodePointLength length = word.codePointLength();
		
		
		if(length.isZero()) {
			return new Token(tokenKind ,
			  parseContext.peek(parseContext.getConsumedPosition(), new CodePointLength(0))
				, this
			);
		}
		
		Source peeked = parseContext.peek(tokenKind , length);
		
		return 
			equals(word,peeked) ^ invertMatch ?
			new Token(tokenKind , peeked, this):
			Token.empty(tokenKind ,parseContext.getCursor(TokenKind.consumed), this);
	}
	
	boolean equals(Source targetString , Source baseString){
		return ignoreCase ? 
				targetString.equalsIgnoreCase(baseString):
				targetString.equals(baseString);
	}
	
	public WordParser slice(Consumer slicerEffector){
		Slicer slicer = new Slicer(word);
		slicerEffector.accept(slicer);
		return new WordParser(slicer.get(),ignoreCase);
	}

	
	public WordParser slice(BeginSpecifier beginSpecifier , EndSpecifier endSpecifier){
		return slice(beginSpecifier, endSpecifier,false);
	}
	
	public WordParser slice(
			BeginSpecifier beginSpecifier ,
			EndSpecifier endSpecifier,
			boolean reverse){
		
		return new WordParser(
				new Slicer(word).begin(beginSpecifier).end(endSpecifier).reverse(reverse) ,
				ignoreCase);
	}
	
	public WordParser slice(
			RangeSpecifier rangeSpecifier){
		return slice(rangeSpecifier, false);
	}
	
	public WordParser slice(
			RangeSpecifier rangeSpecifier,
			boolean reverse){
		
		return new WordParser(
				new Slicer(word).range(rangeSpecifier).reverse(reverse) ,
				ignoreCase);
	}
	
	public WordParser effect(WordEffector wordEffector){
		return new WordParser(wordEffector.apply(word) , ignoreCase);
	}
	
	public interface BeginSpecifier extends Function{};
	public interface EndSpecifier extends Function{};
	public interface RangeSpecifier extends Function{}; 
	public interface WordEffector extends UnaryOperator{}
	
	public String toString() {
		return "wordParser("+word+")";
	}; 
	
	
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy