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

org.unlaxer.tinyexpression.parser.SideEffectExpressionParser Maven / Gradle / Ivy

package org.unlaxer.tinyexpression.parser;

import java.util.List;

import org.unlaxer.Token;
import org.unlaxer.parser.Parser;
import org.unlaxer.parser.Parsers;
import org.unlaxer.parser.ascii.LeftParenthesisParser;
import org.unlaxer.parser.ascii.RightParenthesisParser;
import org.unlaxer.parser.combinator.LazyChoice;
import org.unlaxer.parser.combinator.WhiteSpaceDelimitedLazyChain;
import org.unlaxer.parser.elementary.WordParser;
import org.unlaxer.tinyexpression.CalculationContext;
import org.unlaxer.tinyexpression.parser.JavaClassMethodParser.ClassNameAndIdentifier;

public class SideEffectExpressionParser extends WhiteSpaceDelimitedLazyChain implements Expression{
	
	private static final long serialVersionUID = 8228933717392969866L;
	
	
	public SideEffectExpressionParser() {
		super();
	}
	
	public static class SideEffectNameParser extends LazyChoice{

    private static final long serialVersionUID = -5885382161035099103L;
    
    List parsers;


    public SideEffectNameParser() {
      super();
    }
    
    @Override
    public void initialize() {
      parsers = 
        new Parsers(
          Parser.get(SideEffectName1Parser.class),
          Parser.get(SideEffectName2Parser.class)
        );
    }

    @Override
    public List getLazyParsers() {
      return parsers;
    }
  }
	
	public static class SideEffectName1Parser extends WhiteSpaceDelimitedLazyChain{

		private static final long serialVersionUID = -5885382161035099103L;
		
		List parsers;


		public SideEffectName1Parser() {
			super();
		}
		
		@Override
		public void initialize() {
			parsers = 
				new Parsers(
					Parser.get(()->new WordParser("with")),
					Parser.get(()->new WordParser("side")),
					Parser.get(()->new WordParser("effect"))
				);
		}

		@Override
		public List getLazyParsers() {
			return parsers;
		}
	}
	
	public static class SideEffectName2Parser extends WordParser{

    private static final long serialVersionUID = -5885382161035099103L;
    
    List parsers;


    public SideEffectName2Parser() {
      super("external");
    }
  }
	
	
	
	List parsers;

	
	@Override
	public void initialize() {
		parsers = 
			new Parsers(
				Parser.get(SideEffectNameParser.class),
				Parser.get(()->new WordParser(":")),
				Parser.get(JavaClassMethodParser.class),//2
				Parser.get(LeftParenthesisParser.class),
				Parser.get(SideEffectExpressionParameterParser.class),//4
				Parser.get(RightParenthesisParser.class)
			);
	}
	
	


	@Override
	public List getLazyParsers() {
		return parsers;
	}
	
	public static Token getMethodClause(Token thisParserParsed) {
		return thisParserParsed.filteredChildren.get(2);
	}
	
	public static Token getParametersClause(Token thisParserParsed) {
		return thisParserParsed.filteredChildren.get(4);
	}
	
	public static MethodAndParameters extract(Token token) {
		
		Token classMethod = token.filteredChildren.get(0);//TODO token.getChild(JavaClassMethodParser.class);
		
		ClassNameAndIdentifier extract = Parser.get(JavaClassMethodParser.class).extract(classMethod);
		
		Token parameter = token.filteredChildren.get(1);
		
		SideEffectExpressionParameterParser sideEffectExpressionParameterParser = 
				Parser.get(SideEffectExpressionParameterParser.class);
		
		List parameterTokens = sideEffectExpressionParameterParser.parameterTokens(parameter);
		
		return new MethodAndParameters(extract, parameterTokens);
	}
	
	public static class MethodAndParameters{
		public final ClassNameAndIdentifier classNameAndIdentifier;
		public final List parameterTokens;
		public final Class[] parameterTypes;
		public MethodAndParameters(ClassNameAndIdentifier classNameAndIdentifier, List parameterTokens) {
			super();
			this.classNameAndIdentifier = classNameAndIdentifier;
			this.parameterTokens = parameterTokens;
			parameterTypes = new Class[parameterTokens.size()+2];
			parameterTypes[0] = CalculationContext.class;
			parameterTypes[1] = float.class;
			int i = 2;
			for (Token token : parameterTokens) {
				Parser parser = token.parser;
				parameterTypes[i] =
				    parser instanceof StringVariableParser ? String.class :
            parser instanceof BooleanVariableParser ? boolean.class :
            parser instanceof NumberVariableParser ? float.class :
            parser instanceof NakedVariableParser ? float.class :
						parser instanceof Expression ? float.class :
						parser instanceof BooleanExpression ? boolean.class :
						parser instanceof StringExpression ? String.class :
						null;
				i++;
			}
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy