ljr/wcmtools/s2/danga/s2/NodeArguments.java

107 lines
2.0 KiB
Java
Executable File

package danga.s2;
import java.util.LinkedList;
import java.util.ListIterator;
public class NodeArguments extends Node
{
public LinkedList args = new LinkedList();
public static NodeArguments makeEmptyArgs ()
{
NodeArguments n = new NodeArguments();
n.args = new LinkedList();
return n;
}
public void addArg (NodeExpr ne) {
args.add(ne);
}
public static Node parse (Tokenizer toker) throws Exception
{
NodeArguments n = new NodeArguments();
n.setStart(n.requireToken(toker, TokenPunct.LPAREN));
boolean loop = true;
while (loop) {
Token tp = toker.peek();
if (tp.equals(TokenPunct.RPAREN)) {
n.eatToken(toker);
loop = false;
} else {
Node expr = NodeExpr.parse(toker);
n.args.add(expr);
n.addNode(expr);
if (toker.peek().equals(TokenPunct.COMMA)) {
n.eatToken(toker);
}
}
}
return n;
}
public void asS2 (Indenter o)
{
o.write("(");
ListIterator li = args.listIterator(0);
boolean didFirst = false;
while (li.hasNext()) {
Node n = (Node) li.next();
if (didFirst) {
o.write(", ");
} else {
didFirst = true;
}
n.asS2(o);
}
o.write(")");
}
public void asPerl (BackendPerl bp, Indenter o) {
asPerl(bp, o, true);
}
public void asPerl (BackendPerl bp, Indenter o, boolean doCurlies)
{
if (doCurlies)
o.write("(");
ListIterator li = args.listIterator(0);
boolean didFirst = false;
while (li.hasNext()) {
Node n = (Node) li.next();
if (didFirst) {
o.write(", ");
} else {
didFirst = true;
}
n.asPerl(bp, o);
}
if (doCurlies)
o.write(")");
}
public String typeList (Checker ck) throws Exception
{
StringBuffer sb = new StringBuffer(50);
if (args.size() == 0) return sb.toString();
ListIterator li = args.listIterator();
boolean first = true;
while (li.hasNext()) {
NodeExpr n = (NodeExpr) li.next();
if (! first) sb.append(",");
first = false;
sb.append(n.getType(ck).toString());
}
return sb.toString();
}
};