/*
* Statement.java
* Created on Apr 7, 2005
*
*/
package cs227b.teamIago.parser;
import java.util.ArrayList;
//import java.util.StringTokenizer;
/**
* @author mike
* STATEMENT ::== LPAREN OPERATOR (LISTOF STATEMENTS or LITERALS) RPAREN
*/
public class Statement {
String operator;
ArrayList members = new ArrayList();
/**
* Recursively/Polymorphically print out the statement
*/
static void expand(Statement s) {
System.err.println(s.operator);
for (int i = 0; i < s.members.size(); i++)
System.err.println("\t" + s.members.get(i));
System.err.println("");
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("(").append(operator);
for (int i = 0; i < members.size(); i++)
{
Object oi = members.get(i);
String si = oi.toString();
sb.append(" ").append(si);
}
sb.append(")");
return sb.toString();
}
/**
* Fill the statement instance by recursively parsing token stream
* @param tk
* @return
*/
boolean parse(Tokenizer tk){
int start = tk.x;
String tok = tk.next();
if(tok==null) return false;
boolean parseSuccess;
if (!(tok.equals("("))){
tk.x = start;
return false;
}
operator = tk.next(); // operator
if(operator==null) return false;
if (operator.equals("(")){
// Syntax error in source
// System.err.println("Error: List as function name at line " + tk.sourceLine());
// System.exit(-1);
throw new RuntimeException("Syntax Error: List as function name at line " + tk.sourceLine());
}
if (operator.equals(")")){
// Syntax error in source
// System.err.println("Error: No operator in list at line " + tk.sourceLine());
// System.exit(-1);
throw new RuntimeException("Syntax Error: No operator in list at line " + tk.sourceLine());
}
Statement s = new Statement();
while((parseSuccess=s.parse(tk)) || isLiteral(tk)){
if(parseSuccess)
members.add(s);
else{
tok=tk.next();
if(tok==null) return false;
members.add(tok);
}
s = new Statement();
}
tok=tk.next();
if(tok==null) return false;
if (!(tok.equals(")"))){
tk.x = start;
return false;
}
return true;
}
boolean isLiteral(Tokenizer tk) {
int start=tk.x;
String tok = tk.next();
if (tok !=null && !tok.equals("(") && !tok.equals(")")){
tk.x=start;
return true;
}
else{
tk.x=start;
return false;
}
}
}