Package cs227b.teamIago.parser

Source Code of cs227b.teamIago.parser.Parser

package cs227b.teamIago.parser;
import java.util.ArrayList;
import java.util.List;

import cs227b.teamIago.resolver.Atom;
import cs227b.teamIago.resolver.ExpList;
import cs227b.teamIago.resolver.Expression;
import cs227b.teamIago.resolver.Implication;
import cs227b.teamIago.resolver.Predicate;
import cs227b.teamIago.resolver.Variable;
import cs227b.teamIago.resolver.OrOp;
import cs227b.teamIago.resolver.DistinctOp;
import cs227b.teamIago.resolver.AndOp;
import cs227b.teamIago.resolver.NotOp;


/*
* Parser.java
* Created on Apr 20, 2005
*
*/

/**
* @author mike
*
*/
@SuppressWarnings({"rawtypes"})
public class Parser {
public static void main(String args[]){
  //String filename = "data\\tictactoe.gdl";
  //ExpList e = parse(filename);
}

public static ExpList parseFile(String filename){
  String strContent = Axioms.loadStringFromFile(filename);
  Axioms a = new Axioms();
  a.parseFromString(strContent);
  ArrayList stmts = a.Statements;
 
  ExpList explist = parseExpList(stmts);
  return explist;
}

public static ExpList parseDesc(String desc){
  Axioms a = new Axioms();
  a.parseFromString(desc);
  ArrayList stmts = a.Statements;
 
  ExpList explist = parseExpList(stmts);
  return explist;
}

static ExpList parseExpList(List stmts){
  ExpList res=new ExpList();
  for (int i=0;i<stmts.size();i++)
    res.add(parseExpression(stmts.get(i)))
  return res;
}

// Takes inputs like ((mark 3 2) noop )
static public ExpList parseExpList(String gdl){
        gdl = gdl.trim();
        gdl = gdl.substring(1, gdl.length()-1).trim();
  Axioms a = new Axioms();
  a.parseFromString(gdl);
  ArrayList stmts = a.Statements;
 
  ExpList explist = parseExpList(stmts);
  return explist;
   
   
    /*
  gdl = gdl.trim();
  gdl = gdl.substring(1, gdl.length()-1).trim();
  StringBuffer sb = new StringBuffer();
  int depth=0;
  ArrayList statements = new ArrayList();
  for (int i=0;i<gdl.length();i++){
    char c = gdl.charAt(i);
    sb.append(c);
    if (c=='(')
      depth++;
    else if (c==')')
      depth--;
    if ((c=='(' && depth==1 && i!=0)|| (depth==0 && i==gdl.length()-1 )){
      String st = sb.toString().trim();
      statements.add(st);
      sb = new StringBuffer();
    }
    if (c==')' && depth==0){
      String stmtStr = sb.toString().trim();
      if (stmtStr.length()==0)
        continue;
      Statement s = new Statement();
      s.parse(new Tokenizer(stmtStr));
      statements.add(s);
      sb = new StringBuffer();
    }
  }
  return parseExpList(statements);
    */
}
/**
* Takes in either Statements
* Can also take in Strings, which will parse to Atoms.
*
* This is because of how we parsed to Statements.
* @param _s
* @return
*/
public static Expression parseExpression(Object _s){
  if (_s instanceof ArrayList)
    _s = ((ArrayList)_s).get(0);
  if (_s instanceof String){
    if (((String)_s).startsWith("?"))
      return new Variable(new Atom((String)_s));
    return new Atom((String)_s);
  }
  Statement s = (Statement) _s;
  String opt = s.operator.toUpperCase();
  Expression res=null;
 
  // TYPES OF EXPRESSIONS
  // 1. Implication
  if (opt.equals("<=")){ // type implication
    Expression consequence = parseExpression(s.members.get(0));
    ExpList premises = parseExpList(s.members.subList(1, s.members.size()));
    res = new Implication(consequence, premises);
  } else if (opt.equals("=>")){ // type implication
    Expression consequence = parseExpression(s.members.get(s.members.size()-1));
    ExpList premises = parseExpList(s.members.subList(0, s.members.size()-1));
    res = new Implication(consequence, premises);
  }
  else if (opt.equals("OR") && s.members.size() >= 2)
  {
//    if (s.members.size() < 2)
//    {
//      System.err.println("Parse error: No handling for OR of arity < 2.");
//      System.exit(-1);
//    }
//    else
      res = new OrOp(parseExpList(s.members));
  }
  else if (opt.equals("AND") && s.members.size() >= 2)
  {
//    if (s.members.size() < 2)
//    {
//      System.err.println("Parse error: No handling for AND of arity < 2.");
//      System.exit(-1);
//    }
//    else
      res = new AndOp(parseExpList(s.members));
  }
  else if (opt.equals("DISTINCT") && s.members.size() == 2)
  {
//    if (s.members.size() != 2)
//    {
//      System.err.println("Parse error: No handling for non-binary DISTINCT.");
//      System.exit(-1);
//    }
//    else
      res = new DistinctOp(
        parseExpression(s.members.get(0)),
        parseExpression(s.members.get(1)));
  }
  else if (opt.equals("NOT") && s.members.size() == 1)
  {
//    if (s.members.size() != 1)
//    {
//      System.err.println("Parse error: No handling for non-unary NOT.");
//      System.exit(-1);
//    }
//    else
      res = new NotOp(parseExpression(s.members.get(0)));
  }
  // 2. Associations
  else {
    res = new Predicate(opt, parseExpList(s.members));
  }
  return res;
}
static Variable parseVariable(String str){
  Variable v=null;
  v = new Variable(new Atom(str));
  return v;
}
static Atom parseAtom(String str){
  Atom a = null;
  a = new Atom(str);
  return a;
}
}
TOP

Related Classes of cs227b.teamIago.parser.Parser

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.