Package com.lastcalc.engines

Source Code of com.lastcalc.engines.ParseStep

/*******************************************************************************
* LastCalc - The last calculator you'll ever need
* Copyright (C) 2011, 2012 Uprizer Labs LLC
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE.  See the GNU Affero General Public License for more
* details.
******************************************************************************/
package com.lastcalc.engines;

import com.lastcalc.TokenList;
import com.lastcalc.parsers.*;
import com.lastcalc.parsers.Parser.ParseResult;
import com.lastcalc.parsers.UserDefinedParserParser.UserDefinedParser;

public class ParseStep implements Comparable<ParseStep> {
  public final TokenList input;

  public final ParseResult result;

  public final Parser parser;

  public final ParseStep previous;

  public final int depth;

  public final double scoreBias;

  public ParseStep(final TokenList input, final Parser parser, final ParseResult result, final ParseStep previous,
      final double score) {
    this.input = input;
    this.parser = parser;
    scoreBias = (previous == null ? 0 : previous.scoreBias) + score;
    this.result = result;
    this.previous = previous;
    if (previous != null) {
      depth = previous.depth + 1;
    } else {
      depth = 0;
    }
  }

  @Override
  public String toString() {
    return getScore() + "\t" + parser.getClass().getSimpleName() + "\t" + input + "\t" + result.output;
  }

  @Override
  public int compareTo(final ParseStep other) {
    if (getScore() < other.getScore())
      return -1;
    else if (getScore() > other.getScore())
      return 1;
    else if (hashCode() < other.hashCode())
      return -1;
    else if (hashCode() > other.hashCode())
      return 1;
    else
      return 0;
  }

  private double cachedScore = Double.MAX_VALUE;

  private double getScore() {
    if (cachedScore == Double.MAX_VALUE) {
      cachedScore = scoreBias + getScore(result.output) - (0.0001 * depth);
    }
    return cachedScore;
  }

  public static double getScore(final Object token) {
    double score = 0;
    if (token instanceof TokenList) {
      for (final Object t : ((TokenList) token)) {
        if (t instanceof String) {
          score++;
        } else if (t instanceof Number) {
          score += 0.8;
        } else {
          score += 0.5;
        }
      }
    }
    return score;
  }

  public boolean isMinimal() {
    if (result.output.size() == 1 && !(result.output.get(0) instanceof String)) {
      if (result.output.get(0) instanceof UserDefinedParser) {
        final UserDefinedParser udp = (UserDefinedParser) result.output.get(0);
        // Handle a common case
        if (udp.getTemplate().indexOf("if") != -1)
          return false;
        else
          return true;
      } else
        return true;
    } else
      return false;
  }
}
TOP

Related Classes of com.lastcalc.engines.ParseStep

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.