ljr/wcmtools/s2/danga/s2/NodeSet.java

91 lines
2.0 KiB
Java
Executable File

package danga.s2;
public class NodeSet extends Node
{
String key;
NodeExpr value;
public static boolean canStart (Tokenizer toker) throws Exception
{
if (toker.peek().equals(TokenKeyword.SET))
return true;
return false;
}
public static Node parse (Tokenizer toker) throws Exception
{
NodeText nkey;
NodeSet ns = new NodeSet();
ns.setStart(ns.requireToken(toker, TokenKeyword.SET));
nkey = (NodeText) NodeText.parse(toker);
ns.addNode(nkey);
ns.requireToken(toker, TokenPunct.ASSIGN);
ns.value = (NodeExpr) NodeExpr.parse(toker);
ns.addNode(ns.value);
ns.requireToken(toker, TokenPunct.SCOLON);
ns.key = nkey.getText();
return ns;
}
public void asS2 (Indenter o)
{
o.tabwrite("set ");
o.write(Backend.quoteString(key));
o.write(" = ");
value.asS2(o);
o.writeln(";");
}
public void check (Layer l, Checker ck) throws Exception
{
Type ltype = ck.propertyType(key);
ck.setInFunction(false);
// check to see that the thing we're setting exists
if (ltype == null) {
throw new Exception("Can't set non-existent property '" + key + "' at " +
getFilePos());
}
Type rtype = value.getType(ck, ltype);
if (! ltype.equals(rtype)) {
throw new Exception("Property value is of wrong type at "+getFilePos());
}
// simple case... assigning a primitive
if (ltype.isPrimitive()) {
// TODO: check that value.isLiteral()
// TODO: check value's type matches
return;
}
Type base = new Type(ltype.baseType());
if (base.isPrimitive()) {
return;
} else if (ck.getClass(ltype.baseType()) == null) {
throw new Exception("Can't set property of unknown type at "+
getFilePos());
}
}
public void asPerl (BackendPerl bp, Indenter o)
{
o.tabwrite("register_set("+
bp.getLayerIDString() + "," +
bp.quoteString(key) + ",");
value.asPerl(bp, o);
o.writeln(");");
return;
}
};