metal/java_expressions.php - view - 1.27
<?php
if(!defined("METAL_JAVA_EXPRESSIONS_BINDINGS_INCLUDED"))
{
define("METAL_JAVA_EXPRESSIONS_BINDINGS_INCLUDED",1);
/*
* java_expressions.php
*
* @(#) $Header: /opt2/mlemos/cvs/metal/metal/java_expressions.php,v 1.27 2003/03/02 08:46:29 mlemos Exp $
*
*/
class java_expressions_class extends metal_language_bindings_class
{
Function Execute(&$compiler,&$context,&$class,$function,&$message)
{
switch($function)
{
case "value":
switch($message["type"])
{
case "ARRAY":
case "HASH":
$elements=count($message["elements"]);
if($elements>0)
{
$compiler->SetElementError($context->file,$context->path,$message["type"]." is not a supported $function type");
return(0);
}
$message["value"]=($message["type"]=="ARRAY" ? "new Vector()" : "new Hashtable()");
break;
default:
$compiler->SetElementError($context->file,$context->path,$message["type"]." is not a supported $function type");
return(0);
}
break;
case "arrayreset":
if(!$compiler->StartScope($context,$scope,"local"))
return(0);
$context->result[]=array(
"Data"=>"{",
"Type"=>"COMMAND"
);
$context->result[]=array(
"Data"=>1,
"Type"=>"INDENT"
);
$variable=array(
"Prefix"=>"vector",
"Type"=>"ARRAY"
);
if(!$compiler->AllocateTemporaryVariable($context,$variable))
return(0);
$vector=$variable["Declaration"];
$context->result[]=array(
"Data"=>"Vector ".$vector."=new Vector(".strval(count($message["elements"])).");",
"Type"=>"COMMAND"
);
$context->result[]=array(
"Data"=>"",
"Type"=>"COMMAND"
);
for($element=0;$element<count($message["elements"]);$element++)
{
$value=$message["elements"][$element];
$type=$message["types"][$element];
switch($type)
{
case "STRING":
break;
case "INTEGER":
$value="new Integer($value)";
break;
case "FLOAT":
$value="new Double($value)";
break;
case "BOOLEAN":
$value="new Boolean($value)";
break;
case "ARRAY":
break;
case "HASH":
break;
case "OBJECT":
case "ANY":
break;
default:
$compiler->SetElementError($context->file,$context->path,"$type is not a supported $function type");
return(0);
}
$context->result[]=array(
"Data"=>$vector.".setElementAt($value,$element);",
"Type"=>"COMMAND"
);
}
$context->result[]=array(
"Data"=>$message["array"].".setElementAt(".$message["index"].",".$vector.");",
"Type"=>"COMMAND"
);
$context->result[]=array(
"Data"=>1,
"Type"=>"OUTDENT"
);
$context->result[]=array(
"Data"=>"}",
"Type"=>"COMMAND"
);
if(!$compiler->EndScope($context,$scope))
return(0);
break;
case "hashreset":
if(!$compiler->StartScope($context,$scope,"local"))
return(0);
$context->result[]=array(
"Data"=>"{",
"Type"=>"COMMAND"
);
$context->result[]=array(
"Data"=>1,
"Type"=>"INDENT"
);
$variable=array(
"Prefix"=>"hashtable",
"Type"=>"HASH"
);
if(!$compiler->AllocateTemporaryVariable($context,$variable))
return(0);
$hashtable=$variable["Declaration"];
$context->result[]=array(
"Data"=>"Hashtable ".$hashtable."=new Hashtable(".strval(count($message["elements"])/2).");",
"Type"=>"COMMAND"
);
$context->result[]=array(
"Data"=>"",
"Type"=>"COMMAND"
);
for($element=0;$element<count($message["elements"]);$element+=2)
{
$value=$message["elements"][$element+1];
$type=$message["types"][$element+1];
switch($type)
{
case "STRING":
break;
case "INTEGER":
$value="new Integer($value)";
break;
case "FLOAT":
$value="new Double($value)";
break;
case "BOOLEAN":
$value="new Boolean($value)";
break;
case "ARRAY":
break;
case "HASH":
break;
case "OBJECT":
case "ANY":
break;
default:
$compiler->SetElementError($context->file,$context->path,"$type is not a supported $function type");
return(0);
}
$context->result[]=array(
"Data"=>$hashtable.".put(".$message["elements"][$element].",$value);",
"Type"=>"COMMAND"
);
}
$context->result[]=array(
"Data"=>$message["hash"].".put(".$message["index"].",".$hashtable.");",
"Type"=>"COMMAND"
);
$context->result[]=array(
"Data"=>1,
"Type"=>"OUTDENT"
);
$context->result[]=array(
"Data"=>"}",
"Type"=>"COMMAND"
);
if(!$compiler->EndScope($context,$scope))
return(0);
break;
case "length":
$context->result[]=array(
"Data"=>array(
"Value"=>$message["string"].".length()",
"Type"=>"INTEGER",
"Side"=>"RIGHT"
),
"Type"=>"EXPRESSION"
);
break;
case "substring":
$context->result[]=array(
"Data"=>array(
"Value"=>$message["string"].".substring(".$message["position"].(IsSet($message["length"]) ? ",".$message["position"]."+".$message["length"] : "").")",
"Type"=>"STRING",
"Side"=>"RIGHT"
),
"Type"=>"EXPRESSION"
);
break;
case "code":
$context->result[]=array(
"Data"=>array(
"Value"=>"(int)(".$message["character"].".charAt(0))",
"Type"=>"INTEGER",
"Side"=>"RIGHT"
),
"Type"=>"EXPRESSION"
);
break;
case "group":
$context->result[]=array(
"Data"=>array(
"Value"=>"(".$message["expression"].")",
"Type"=>$message["type"],
"Side"=>"RIGHT"
),
"Type"=>"EXPRESSION"
);
break;
case "convert":
switch($message["type"])
{
case "INTEGER":
if(strcmp($message["targettype"],"INTEGER"))
$expression_value="java.lang.Integer.parseInt(".$message["expression"].")";
break;
case "STRING":
switch($message["targettype"])
{
case "STRING":
break;
case "BOOLEAN":
$expression_value="(".$message["expression"]." ? \"1\" : \"0\")";
break;
case "INTEGER":
case "FLOAT":
default:
$expression_value="java.lang.String.valueOf(".$message["expression"].")";
break;
}
break;
case "BOOLEAN":
if(strcmp($message["targettype"],"BOOLEAN"))
$expression_value="(java.lang.Integer.parseInt(".$message["expression"].")!=0)";
break;
case "FLOAT":
if(strcmp($message["targettype"],"FLOAT"))
$expression_value="(java.lang.Integer.parseDouble(".$message["expression"].")!=0.0)";
break;
default:
$compiler->SetElementError($context->file,$context->path,"it is not supported to convert a ".$message["targettype"]." expression to ".$message["type"]);
return(0);
}
$context->result[]=array(
"Data"=>array(
"Value"=>$expression_value,
"Type"=>$message["type"],
"Side"=>"RIGHT"
),
"Type"=>"EXPRESSION"
);
break;
case "concatenate":
$string=(IsSet($message["string"]) ? $message["string"] : $message["buffer"]."[0]");
$context->result[]=array(
"Data"=>$string."=".$string.".concat(".$message["append"].");",
"Type"=>"COMMAND"
);
break;
case "increment":
case "decrement":
$context->result[]=array(
"Data"=>$message["expression"].($function=="increment" ? "++;" : "--;"),
"Type"=>"COMMAND"
);
break;
case "incrementbuffer":
case "decrementbuffer":
$context->result[]=array(
"Data"=>$message["expression"]."[0]".($function=="incrementbuffer" ? "++;" : "--;"),
"Type"=>"COMMAND"
);
break;
case "lowercase":
$context->result[]=array(
"Data"=>array(
"Value"=>$message["string"].".toLowerCase()",
"Type"=>"STRING",
"Side"=>"RIGHT"
),
"Type"=>"EXPRESSION"
);
break;
case "uppercase":
$context->result[]=array(
"Data"=>array(
"Value"=>$message["string"].".toUpperCase()",
"Type"=>"STRING",
"Side"=>"RIGHT"
),
"Type"=>"EXPRESSION"
);
break;
case "utf8encode":
$exception=array(
"Throws"=>"java.io.UnsupportedEncodingException"
);
if(!$compiler->DeclareException($context,$exception))
return(0);
$context->result[]=array(
"Data"=>$message["encoded"]."=new String(".$message["data"].".getBytes(\"UTF8\"));",
"Type"=>"COMMAND"
);
break;
case "utf8decode":
$exception=array(
"Throws"=>"java.io.UnsupportedEncodingException"
);
if(!$compiler->DeclareException($context,$exception))
return(0);
$context->result[]=array(
"Data"=>$message["decoded"]."=new String(".$message["data"].".getBytes(),\"UTF8\");",
"Type"=>"COMMAND"
);
break;
case "setentry":
case "entry":
case "entryindex":
case "entrydefined":
case "undefineentry":
switch($function)
{
case "setentry":
$value=$message["value"];
switch($message["type"])
{
case "STRING":
break;
case "INTEGER":
$value="new Integer($value)";
break;
case "FLOAT":
$value="new Double($value)";
break;
case "BOOLEAN":
$value="new Boolean($value)";
break;
case "ARRAY":
break;
case "HASH":
break;
case "OBJECT":
case "ANY":
break;
default:
$compiler->SetElementError($context->file,$context->path,$message["type"]." is not a supported $function type");
return(0);
}
$context->result[]=array(
"Data"=>$message["array"].($message["hash"] ? ".put(".$message["index"].",$value);" : ".setElementAt($value,".$message["index"].");"),
"Type"=>"COMMAND"
);
break;
case "entry":
case "entryindex":
$value=$message["array"].($message["hash"] ? ".get(".$message["index"].")" : ".elementAt(".$message["index"].")");
switch($message["type"])
{
case "STRING":
$value="((String)$value)";
break;
case "INTEGER":
$value="((Integer)$value).intValue()";
break;
case "FLOAT":
$value="((Double)$value).doubleValue()";
break;
case "BOOLEAN":
$value="((Boolean)$value).booleanValue()";
break;
case "ARRAY":
$value="((Vector)$value)";
break;
case "HASH":
$value="((Hashtable)$value)";
break;
case "OBJECT":
case "ANY":
break;
default:
$compiler->SetElementError($context->file,$context->path,$message["type"]." is not a supported $function type");
return(0);
}
$context->result[]=array(
"Data"=>array(
"Value"=>$value,
"Type"=>$message["type"],
"Side"=>$function=="entry" ? "RIGHT" : "LEFT"
),
"Type"=>"EXPRESSION"
);
break;
case "entrydefined":
$context->result[]=array(
"Data"=>array(
"Value"=>$message["array"].($message["hash"] ? ".containsKey(".$message["index"].")" : ".size()>".$message["index"]),
"Type"=>"BOOLEAN",
"Side"=>"RIGHT"
),
"Type"=>"EXPRESSION"
);
break;
case "undefineentry":
$context->result[]=array(
"Data"=>$message["array"].($message["hash"] ? ".remove(".$message["index"].")" : ".removeElementAt(".$message["index"].")").";",
"Type"=>"COMMAND"
);
break;
}
break;
case "count":
$context->result[]=array(
"Data"=>array(
"Value"=>$message["array"].".size()",
"Type"=>"INTEGER",
"Side"=>"RIGHT"
),
"Type"=>"EXPRESSION"
);
break;
case "reset":
$context->result[]=array(
"Data"=>$message["cursor"]."=(Object)".$message["hash"].".keys();",
"Type"=>"COMMAND"
);
case "next":
$variable=array(
"Name"=>$message["cursor"]
);
if(!$compiler->QueryVariable($context,$variable))
return(0);
if($variable["Declared"])
{
if($variable["Type"]!="OBJECT")
{
$compiler->SetElementError($context->file,$context->path,"cursor variable \"".$message["cursor"]."\" has already been declared as being of the type ".$variable["Type"]);
return(0);
}
}
else
{
$variable["Type"]="OBJECT";
if(!$compiler->DeclareVariable($context,$variable))
return(0);
}
$cursor=$variable["Declaration"];
if(IsSet($message["end"]))
{
$context->result[]=array(
"Data"=>$message["end"]."=!((java.util.Enumeration)$cursor).hasMoreElements();",
"Type"=>"COMMAND"
);
$context->result[]=array(
"Data"=>$message["key"]."=".$message["end"]." ? null : (String)((java.util.Enumeration)$cursor).nextElement();",
"Type"=>"COMMAND"
);
}
else
{
$context->result[]=array(
"Data"=>$message["key"]."=((java.util.Enumeration)".$message["cursor"].").hasMoreElements() ? (String)((java.util.Enumeration)".$message["cursor"].").nextElement() : null;",
"Type"=>"COMMAND"
);
}
break;
case "not":
$context->result[]=array(
"Data"=>array(
"Value"=>"!".$message["expression"],
"Type"=>"BOOLEAN",
"Side"=>"RIGHT"
),
"Type"=>"EXPRESSION"
);
break;
case "conditional":
$context->result[]=array(
"Data"=>array(
"Value"=>"((".$message["condition"].") ? ".$message[$message["not"] ? "else" : "then"]." : ".$message[$message["not"] ? "then" : "else"].")",
"Type"=>$message["type"],
"Side"=>"RIGHT"
),
"Type"=>"EXPRESSION"
);
break;
case "void":
$context->result[]=array(
"Data"=>$message["expression"].";",
"Type"=>"COMMAND"
);
break;
case "set":
$context->result[]=array(
"Data"=>$message["left"]."=".$message["right"].";",
"Type"=>"COMMAND"
);
break;
case "setbuffer":
switch($message["type"])
{
case "STRING":
$context->result[]=array(
"Data"=>$message["left"]."[0]=".$message["right"].";",
"Type"=>"COMMAND"
);
break;
default:
$compiler->SetElementError($context->file,$context->path,$message["type"]." is not a supported \"$function\" expression type for language ".$compiler->language["name"]);
return(0);
}
break;
case "buffervalue":
$context->result[]=array(
"Data"=>array(
"Value"=>$message["buffer"]."[0]",
"Type"=>$message["type"],
"Side"=>"RIGHT"
),
"Type"=>"EXPRESSION"
);
break;
default:
$compiler->SetElementError($context->file,$context->path,"bindings for function \"$function\" are not implemented for language ".$compiler->language["name"]);
return(0);
}
return(1);
}
};
}
?>
|