91 lines
2.0 KiB
Java
Executable File
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;
|
|
}
|
|
|
|
};
|