generateFlatMethod(fm,outmethod);
}
}
+ if (state.main!=null) {
+ outmethod.println("int main(int argc, const char *argv[]) {");
+ ClassDescriptor cd=typeutil.getClass(state.main);
+ Set mainset=cd.getMethodTable().getSet("main");
+ for(Iterator mainit=mainset.iterator();mainit.hasNext();) {
+ MethodDescriptor md=(MethodDescriptor)mainit.next();
+ if (md.numParameters()!=0)
+ continue;
+ if (!md.getModifiers().isStatic())
+ throw new Error("Error: Non static main");
+ outmethod.println(" "+cd.getSafeSymbol()+md.getSafeSymbol()+"_"+md.getSafeMethodDescriptor()+"();");
+ break;
+ }
+ outmethod.println("}");
+ }
outmethod.close();
}
if (current_node.numNext()==0) {
output.print(" ");
generateFlatNode(fm, current_node, output);
+ if (current_node.kind()!=FKind.FlatReturnNode) {
+ output.println(" return;");
+ }
current_node=null;
} else if(current_node.numNext()==1) {
output.print(" ");
output.println(generateTemp(fm, fln.getDst())+"=0;");
else if (fln.getType().getSymbol().equals(TypeUtil.StringClass))
output.println(generateTemp(fm, fln.getDst())+"=newstring(\""+FlatLiteralNode.escapeString((String)fln.getValue())+"\");");
- else
+ else if (fln.getType().isBoolean()) {
+ if (((Boolean)fln.getValue()).booleanValue())
+ output.println(generateTemp(fm, fln.getDst())+"=1;");
+ else
+ output.println(generateTemp(fm, fln.getDst())+"=0;");
+ } else
output.println(generateTemp(fm, fln.getDst())+"="+fln.getValue()+";");
}
private void generateFlatReturnNode(FlatMethod fm, FlatReturnNode frn, PrintWriter output) {
- output.println("return "+generateTemp(fm, frn.getReturnTemp())+";");
+ if (frn.getReturnTemp()!=null)
+ output.println("return "+generateTemp(fm, frn.getReturnTemp())+";");
+ else
+ output.println("return;");
}
private void generateFlatCondBranch(FlatMethod fm, FlatCondBranch fcb, String label, PrintWriter output) {
}
private NodePair flattenReturnNode(ReturnNode rntree) {
- TempDescriptor retval=TempDescriptor.tempFactory("ret_value", rntree.getReturnExpression().getType());
- NodePair cond=flattenExpressionNode(rntree.getReturnExpression(),retval);
+ TempDescriptor retval=null;
+ NodePair cond=null;
+ if (rntree.getReturnExpression()!=null) {
+ retval=TempDescriptor.tempFactory("ret_value", rntree.getReturnExpression().getType());
+ cond=flattenExpressionNode(rntree.getReturnExpression(),retval);
+ }
+
FlatReturnNode rnflat=new FlatReturnNode(retval);
- cond.getEnd().addNext(rnflat);
- return new NodePair(cond.getBegin(),rnflat);
+
+ if (cond!=null) {
+ cond.getEnd().addNext(rnflat);
+ return new NodePair(cond.getBegin(),rnflat);
+ } else
+ return new NodePair(rnflat,rnflat);
+
}
private NodePair flattenSubBlockNode(SubBlockNode sbn) {
}
void checkReturnNode(MethodDescriptor md, SymbolTable nametable, ReturnNode rn) {
- checkExpressionNode(md, nametable, rn.getReturnExpression(), md.getReturnType());
+ if (rn.getReturnExpression()!=null)
+ checkExpressionNode(md, nametable, rn.getReturnExpression(), md.getReturnType());
+ else
+ if (md.getReturnType()!=null&&!md.getReturnType().isVoid())
+ throw new Error("Need to return something for "+md);
}
void checkIfStatementNode(MethodDescriptor md, SymbolTable nametable, IfStatementNode isn) {
public class Main {
public static void main(String args[]) throws Exception {
String ClassLibraryPrefix="./ClassLibrary/";
- if (args.length<1) {
- System.out.println("Must input source file");
- System.exit(-1);
- }
State state=new State();
for(int i=0;i<args.length;i++) {
}
readSourceFile(state, ClassLibraryPrefix+"Object.java");
+ readSourceFile(state, ClassLibraryPrefix+"System.java");
BuildIR bir=new BuildIR(state);
bir.buildtree();