void assign_stmt(VarList curtree) // Should be rewrited { VarList vars = new VarList(); int i; var_list(vars); if (tok.getId() != Tok.TOK_1_EQUALS) { io.Abort("PL0121: '=' expected"); } for (i = 0; i < vars.Length(); i++) { if (curtree.FindByName(vars.FindByIndex(i).getName()) == null) { io.Abort("PL0122: undeclared variable"); } } io.Message(tok + "[Equals]"); tok.scan(); bool_expr(0); for (i = 0; i < vars.Length(); i++) { emit.Store(curtree.FindByName(vars.FindByIndex(i).getName())); if (i < vars.Length() - 1) { emit.Load(curtree.FindByName(vars.FindByIndex(0).getName())); } } }
public VarList getNodes(int Type) { VarList val = new VarList(); int i; for (i = 0; i < nodes.Length(); i++) { if ((nodes.FindByIndex(i).type & Type) != 0) { val.add(nodes.FindByIndex(i)); } } return(val); }
public void addNodes(VarList p) { int i; for (i=0;i<p.Length();i++) { nodes.add(p.FindByIndex(i)); } }
public void addNodes(VarList p) { int i; for (i = 0; i < p.Length(); i++) { add(p.FindByIndex(i)); } }
public void FuncBegin(IAsm a) { Var func = a.getVar(); Type funcsig = genDataTypeSig(a.getVar()); VarList paramlist = func.getParams(); Type[] paramTypes = null; if (paramlist.Length() > 0) { int max = paramlist.Length(); paramTypes = new Type[max]; for (int i = 0; i < max; i++) { Var e = paramlist.FindByIndex(i); paramTypes[i] = genDataTypeSig(e); } } emethod = eclass.DefineMethod(func.getName(), MethodAttributes.Static | MethodAttributes.Public, funcsig, paramTypes); func.setMethodBuilder(emethod); for (int i = 0; i < paramlist.Length(); i++) { emethod.DefineParameter(i + 1, 0, paramlist.FindByIndex(i).getName()); } il = emethod.GetILGenerator(); if (func.getName().ToLower().Equals("main")) { appbuild.SetEntryPoint(emethod); } // emodule.SetUserEntryPoint(emethod); labelhash = new Hashtable(); }
public void Call(IAsm a) { Var func = a.getVar(); LibFunc lfunc; String funcsig = genDataTypeSig(a.getVar()); VarList x = func.getParams(); String paramsig = ""; if (x.Length() > 0) { int max = x.Length(); StringBuilder t = new StringBuilder(Io.MAXSTR); for (int i = 0; i < max; i++) { Var e = x.FindByIndex(i); t.Append(genDataTypeSig(e)); if (i < max - 1) { t.Append(","); } } paramsig = t.ToString(); } StringBuilder sb = new StringBuilder(Io.MAXSTR); sb.Append("\tcall "); sb.Append(funcsig); sb.Append(" "); lfunc = lib.lookup_func(a.getVar().getName()); if (lfunc != null) { sb.Append(lfunc.nameFull); } else { sb.Append(io.GetClassname()); sb.Append("::"); sb.Append(func.getName()); sb.Append("("); sb.Append(paramsig); sb.Append(")"); } sb.Append("\t\t\t\t\t//"); sb.Append(a.getICount()); sb.Append("\r\n"); io.Out(sb.ToString()); }
public void LocalVars(VarList v) { int max = v.Length(); for (int i = 0; i < max; i++) { Var e = v.FindByIndex(i); Type et = genDataTypeSig(e); LocalBuilder t = il.DeclareLocal(et); if (io.getGenDebug()) { t.SetLocalSymInfo(e.getName()); } e.setLocalToken(t); } localvars = v; }
public void FuncBegin(IAsm a) { Var func = a.getVar(); String funcsig = genDataTypeSig(a.getVar()); VarList x = func.getParams(); String paramsig = ""; if (x.Length() > 0) { int max = x.Length(); StringBuilder t = new StringBuilder(Io.MAXSTR); for (int i = 0; i < max; i++) { Var e = x.FindByIndex(i); t.Append(genDataTypeSig(e)); if (i < max - 1) { t.Append(","); } } paramsig = t.ToString(); } StringBuilder sb = new StringBuilder(Io.MAXSTR); sb.Append("\t.method public "); sb.Append("static "); sb.Append(funcsig); sb.Append(" "); sb.Append(func.getName()); sb.Append("("); sb.Append(paramsig); sb.Append(") {\r\n"); io.Out(sb.ToString()); if (func.getName().ToLower().Equals("main")) { io.Out("\t.entrypoint\r\n"); } }
public void LocalVars(VarList v) { StringBuilder sb = new StringBuilder(Io.MAXSTR); sb.Append("\t.locals ("); int max = v.Length(); for (int i = 0; i < max; i++) { Var e = v.FindByIndex(i); String stype = ""; switch (e.getTypeId()) { case Tok.TOK_FIXED: stype = "int32"; break; case Tok.TOK_FLOAT: stype = "float32"; break; case Tok.TOK_COMPLEX: stype = "float64"; break; case Tok.TOK_REAL: stype = "float32"; break; case Tok.TOK_BINARY: stype = "int16"; break; case Tok.TOK_DECIMAL: stype = "int32"; break; default: io.Abort("PL0406: could not find type for local"); break; } sb.Append(stype); if (i < max - 1) { sb.Append(","); } } sb.Append(")\r\n"); io.Out(sb.ToString()); }
public void mergeNodes(VarList p) { int i; for (i = 0; i < p.Length(); i++) { Var varSrc = p.FindByIndex(i); Var varTrg = FindByName(varSrc.getName()); if ((varTrg != null) && (varTrg.getType() != Var.VAR_PARAM)) { add(varSrc); } else if (varTrg == null) { add(varSrc); } else { FindByName(varSrc.getName()).setTypeId(varSrc.getTypeId()); FindByName(varSrc.getName()).setGranularity(varSrc.getGranularity()); } } }
void assign_stmt(VarList curtree) { // Should be rewrited VarList vars = new VarList(); int i; var_list(vars); if (tok.getId() != Tok.TOK_1_EQUALS) io.Abort("PL0121: '=' expected"); for (i = 0; i < vars.Length(); i ++) { if (curtree.FindByName(vars.FindByIndex(i).getName()) == null) io.Abort("PL0122: undeclared variable"); } io.Message(tok+"[Equals]"); tok.scan(); bool_expr(0); for (i = 0; i < vars.Length(); i ++) { emit.Store(curtree.FindByName(vars.FindByIndex(i).getName())); if (i < vars.Length() -1) emit.Load(curtree.FindByName(vars.FindByIndex(0).getName())); } }
void ident_stmt(VarList curtree) { Tok s = new Tok(null); VarList vars = new VarList(); Var V; int gotType = Tok.TOK_BINARY; s.setValue(tok.getValue()); s.setId(tok.getId()); tok.scan(); switch (tok.getId()) { case Tok.TOK_1_EQUALS: if (curtree.FindByName(s.getValue()) == null) io.Abort("PL0137: undeclared variable"); V = new Var(); V.setName(s.getValue()); vars.add(V); io.Message(s+"[Variable]"); io.Message(tok+"[Equals]"); tok.scan(); gotType = bool_expr(0); typeCheckAssign(gotType, curtree.FindByName(vars.FindByIndex(0).getName()).getTypeId()); null_stmt(); break; case Tok.TOK_1_COMMA: io.Message(s+"[Variable]"); if (curtree.FindByName(s.getValue()) == null) io.Abort("PL0137: undeclared variable"); V = new Var(); V.setName(s.getValue()); vars.add(V); while (tok.getId() != Tok.TOK_1_EQUALS) { if (tok.getFirstChar() != ',') io.Abort("PL0138: ',' or '=' expected"); io.Message(tok+"[Comma]"); tok.scan(); if (tok.getId() != Tok.TOK_IDENT) io.Abort("PL0139: ident expected"); if (curtree.FindByName(tok.getValue()) == null) io.Abort("PL0137: undeclared variable"); V = new Var(); V.setName(tok.getValue()); vars.add(V); io.Message(tok+"[Variable]"); tok.scan(); } io.Message(tok+"[Assign]"); tok.scan(); gotType = bool_expr(0); typeCheckAssign(gotType, curtree.FindByName(vars.FindByIndex(0).getName()).getTypeId()); null_stmt(); break; case Tok.TOK_1_REL: label(s); break; default: io.Abort("PL0140: not found expected token ':', ',' or '='"); break; } for (int i = 0; i < vars.Length(); i ++) { typeCheckAssign(gotType, curtree.FindByName(vars.FindByIndex(i).getName()).getTypeId()); emit.Store(curtree.FindByName(vars.FindByIndex(i).getName())); if (i < vars.Length() -1) emit.Load(curtree.FindByName(vars.FindByIndex(0).getName())); } }
void do_stmt(VarList curtree) { bool needBranch = true; String label1 = new_label(); // loop start String label2 = new_label(); // loop end String label3 = new_label(); String label4 = new_label(); Var procvar = new Var(); procvar.setName(curtree.genName()); procvar.setType(Var.VAR_BLOCK); procvar.nodes = new VarList(); for (int i=0; i<curtree.Length(); i++) if ((curtree.FindByIndex(i).type & (Var.VAR_LOCAL|Var.VAR_PARAM|Var.VAR_LABEL)) != 0) procvar.add(curtree.FindByIndex(i)); io.Message(tok+"[DO]"); tok.scan(); switch (tok.getId()) { case Tok.TOK_WHILE: io.Message(tok+"[WhileStatement]"); emit.Label(label1); tok.scan(); bool_expr(0); null_stmt(); emit.Branch("brfalse", label2); break; case Tok.TOK_IDENT: // TODO assign_stmt(curtree); if (tok.getId() != Tok.TOK_TO) io.Abort("PL0123: TO expected"); tok.scan(); bool_expr(0); null_stmt(); break; case Tok.TOK_CASE: io.Message(tok+"[CaseStatement]"); tok.scan(); break; case Tok.TOK_1_SEMI: io.Message(tok+"[;]"); needBranch = false; tok.scan(); break; } do { stmt(procvar.nodes, label2, label1); } while (tok.getId() != Tok.TOK_END); if (needBranch) emit.Branch("br", label1); if (tok.getId() != Tok.TOK_END) io.Abort("PL0124: END expected"); io.Message(tok+"[END]"); tok.scan(); curtree.add(procvar); if (needBranch) emit.Label(label2); }
public void LocalVars(VarList v) { int max = v.Length(); for (int i = 0; i < max; i++) { Var e = v.FindByIndex(i); Type et = genDataTypeSig(e); LocalBuilder t = il.DeclareLocal(et); if (io.getGenDebug()) t.SetLocalSymInfo(e.getName()); e.setLocalToken(t); } localvars = v; }
void ident_stmt(VarList curtree) { Tok s = new Tok(null); VarList vars = new VarList(); Var V; int gotType = Tok.TOK_BINARY; s.setValue(tok.getValue()); s.setId(tok.getId()); tok.scan(); switch (tok.getId()) { case Tok.TOK_1_EQUALS: if (curtree.FindByName(s.getValue()) == null) { io.Abort("PL0137: undeclared variable"); } V = new Var(); V.setName(s.getValue()); vars.add(V); io.Message(s + "[Variable]"); io.Message(tok + "[Equals]"); tok.scan(); gotType = bool_expr(0); typeCheckAssign(gotType, curtree.FindByName(vars.FindByIndex(0).getName()).getTypeId()); null_stmt(); break; case Tok.TOK_1_COMMA: io.Message(s + "[Variable]"); if (curtree.FindByName(s.getValue()) == null) { io.Abort("PL0137: undeclared variable"); } V = new Var(); V.setName(s.getValue()); vars.add(V); while (tok.getId() != Tok.TOK_1_EQUALS) { if (tok.getFirstChar() != ',') { io.Abort("PL0138: ',' or '=' expected"); } io.Message(tok + "[Comma]"); tok.scan(); if (tok.getId() != Tok.TOK_IDENT) { io.Abort("PL0139: ident expected"); } if (curtree.FindByName(tok.getValue()) == null) { io.Abort("PL0137: undeclared variable"); } V = new Var(); V.setName(tok.getValue()); vars.add(V); io.Message(tok + "[Variable]"); tok.scan(); } io.Message(tok + "[Assign]"); tok.scan(); gotType = bool_expr(0); typeCheckAssign(gotType, curtree.FindByName(vars.FindByIndex(0).getName()).getTypeId()); null_stmt(); break; case Tok.TOK_1_REL: label(s); break; default: io.Abort("PL0140: not found expected token ':', ',' or '='"); break; } for (int i = 0; i < vars.Length(); i++) { typeCheckAssign(gotType, curtree.FindByName(vars.FindByIndex(i).getName()).getTypeId()); emit.Store(curtree.FindByName(vars.FindByIndex(i).getName())); if (i < vars.Length() - 1) { emit.Load(curtree.FindByName(vars.FindByIndex(0).getName())); } } }
void proc_decl(VarList curtree, String label) { Var procvar = new Var(); procvar.setName(label); procvar.setType(Var.VAR_BLOCK); procvar.setTypeId(Tok.TOK_VOID); if (label == null) { io.Abort("PL0116: PROC declaration needs LABEL"); } io.Message(tok + "[PROC]"); tok.scan(); procvar.nodes = new VarList(); if (tok.getId() == Tok.TOK_1_LBRACKET) { param(procvar.nodes); procvar.setNodesType(Var.VAR_PARAM); } switch (tok.getId()) { case Tok.TOK_RETURNS: io.Message(tok + "[RETURNS]"); tok.scan(); if (tok.getId() != Tok.TOK_1_LBRACKET) { io.Abort("PL0104: ')' expected."); } io.Message(tok + "[(]"); tok.scan(); switch (tok.getId()) { case Tok.TOK_FIXED: case Tok.TOK_FLOAT: case Tok.TOK_COMPLEX: case Tok.TOK_REAL: case Tok.TOK_BINARY: case Tok.TOK_DECIMAL: io.Message(tok + "[Type]"); procvar.setTypeId(tok.getId()); break; default: io.Abort("PL0115: type specifier expected"); break; } tok.scan(); if (tok.getId() != Tok.TOK_1_RBRACKET) { io.Abort("PL0114: ')' expected"); } io.Message(tok + "[)]"); tok.scan(); break; case Tok.TOK_RECURSIVE: io.Message(tok + "[RECURSIVE]"); if (label.ToUpper() == "MAIN") { io.Abort("PL0146: MAIN can not be RECURSIVE"); } tok.scan(); break; } null_stmt(); emit.FuncBegin(procvar); declarations(procvar.nodes); VarList prms = procvar.getParams(); if (prms != null) { for (int i = 0; i < prms.Length(); i++) { if (prms.FindByIndex(i).getTypeId() == 0) { io.Abort("PL0117: undeclared parameter"); } } } if (procvar.getLocals() != null) { emit.LocalVars(procvar.getLocals()); } try { curtree.add(procvar); } catch { io.Abort("PL0120: invalid procedure declaration"); } do { stmt(procvar.nodes, label, null); } while (tok.getId() != Tok.TOK_END); if (tok.getId() != Tok.TOK_END) { io.Abort("PL0118: END expected"); } io.Message(tok + "[END]"); tok.scan(); if (tok.getValue() != label) { io.Abort("PL0119: unclosed PROC"); } io.Message(tok + "[Label]"); tok.scan(); emit.Ret(); emit.FuncEnd(); if (io.getGenList()) { emit.LIST(); } emit.IL(); emit.Finish(); }
void do_stmt(VarList curtree) { bool needBranch = true; String label1 = new_label(); // loop start String label2 = new_label(); // loop end String label3 = new_label(); String label4 = new_label(); Var procvar = new Var(); procvar.setName(curtree.genName()); procvar.setType(Var.VAR_BLOCK); procvar.nodes = new VarList(); for (int i = 0; i < curtree.Length(); i++) { if ((curtree.FindByIndex(i).type & (Var.VAR_LOCAL | Var.VAR_PARAM | Var.VAR_LABEL)) != 0) { procvar.add(curtree.FindByIndex(i)); } } io.Message(tok + "[DO]"); tok.scan(); switch (tok.getId()) { case Tok.TOK_WHILE: io.Message(tok + "[WhileStatement]"); emit.Label(label1); tok.scan(); bool_expr(0); null_stmt(); emit.Branch("brfalse", label2); break; case Tok.TOK_IDENT: // TODO assign_stmt(curtree); if (tok.getId() != Tok.TOK_TO) { io.Abort("PL0123: TO expected"); } tok.scan(); bool_expr(0); null_stmt(); break; case Tok.TOK_CASE: io.Message(tok + "[CaseStatement]"); tok.scan(); break; case Tok.TOK_1_SEMI: io.Message(tok + "[;]"); needBranch = false; tok.scan(); break; } do { stmt(procvar.nodes, label2, label1); } while (tok.getId() != Tok.TOK_END); if (needBranch) { emit.Branch("br", label1); } if (tok.getId() != Tok.TOK_END) { io.Abort("PL0124: END expected"); } io.Message(tok + "[END]"); tok.scan(); curtree.add(procvar); if (needBranch) { emit.Label(label2); } }
public void LocalVars(VarList v) { StringBuilder sb = new StringBuilder(Io.MAXSTR); sb.Append("\t.locals ("); int max = v.Length(); for (int i = 0; i < max; i++) { Var e = v.FindByIndex(i); String stype = ""; switch (e.getTypeId()) { case Tok.TOK_FIXED: stype = "int32"; break; case Tok.TOK_FLOAT: stype = "float32"; break; case Tok.TOK_COMPLEX: stype = "float64"; break; case Tok.TOK_REAL: stype = "float32"; break; case Tok.TOK_BINARY: stype = "int16"; break; case Tok.TOK_DECIMAL: stype = "int32"; break; default: io.Abort("PL0406: could not find type for local"); break; } sb.Append(stype); if (i < max-1) sb.Append(","); } sb.Append(")\r\n"); io.Out(sb.ToString()); }
public void mergeNodes(VarList p) { int i; for (i=0; i<p.Length(); i++) { Var varSrc = p.FindByIndex(i); Var varTrg = FindByName(varSrc.getName()); if ((varTrg != null) && (varTrg.getType() != Var.VAR_PARAM)) add(varSrc); else if (varTrg == null) { add(varSrc); } else { FindByName(varSrc.getName()).setTypeId(varSrc.getTypeId()); FindByName(varSrc.getName()).setGranularity(varSrc.getGranularity()); } } }