public void addNodes(VarList p) { int i; for (i=0;i<p.Length();i++) { nodes.add(p.FindByIndex(i)); } }
public void parse_and_compile() { prolog(); tree = new VarList(); IDictionaryEnumerator libEnum = lib.get_enum(); while ( libEnum.MoveNext() ) { Var procvar = new Var(); LibFunc lfunc = (LibFunc)libEnum.Value; procvar.setName(lfunc.nameShort); procvar.setType(Var.VAR_BLOCK); procvar.setTypeId(Tok.TOK_VOID); procvar.nodes = new VarList(); for (int i = 0; i < lfunc.typeParams.Count; i++ ) { Var param = new Var(); param.setName("PAR_"+i); param.setType(Var.VAR_PARAM); param.setTypeId((int)lfunc.typeParams[i]); procvar.nodes.add(param); } tree.add(procvar); } io.ReadChar(); tok.scan(); declarations(tree); while (tok.NotEOF()) { stmt(tree, null, null); } io.Message("compiled successfuly"); io.TreeDraw(tree); epilog(); }
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 simple_var(VarList curtree) { Var var = new Var(); var.setName(tok.getValue()); var.setClassId(Tok.T_DEFCLASS); try { curtree.add(var); } catch { io.Abort("PL0107: invalid variable declaration"); } io.Message(tok+"[Var]"); tok.scan(); }
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(); }
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()); } } }
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 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; }
void goto_stmt(VarList curtree) { String label1; if (tok.getId() == Tok.TOK_GO) { io.Message(tok+"[GO]"); tok.scan(); if (tok.getId() != Tok.TOK_TO) io.Abort("PL0125: TO expected"); } io.Message(tok+"[GOTO]"); tok.scan(); switch (tok.getId()) { case Tok.TOK_IDENT: label1 = "L@@"+tok.getValue(); if ((curtree.FindByName(label1) != null) && (curtree.FindByName(label1).getType() == Var.VAR_LABEL)) { emit.Branch("br", label1); io.Message(tok+"[Label]"); } else { io.Abort("PL0126: undefined label"); } break; case Tok.TOK_DIGITS: io.Message(tok+"[Source Line]"); break; default: io.Abort("PL0127: GOTO without direction"); break; } tok.scan(); }
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); }
void decl_stmt(VarList curtree) { VarList vars = new VarList(); io.Message(tok+"[DECLARE]"); tok.scan(); switch (tok.getId()) { case Tok.TOK_1_LBRACKET: param(vars); break; case Tok.TOK_IDENT: simple_var(vars); break; case Tok.TOK_DIGITS: break; } if (tok.getId() == Tok.TOK_1_LBRACKET) { io.Message(tok+"[(]"); tok.scan(); if (tok.getId() != Tok.TOK_DIGITS) io.Abort("PL0113: constant expected"); io.Message(tok+"[Constant]"); vars.setNodesGranularity(System.Convert.ToInt32(tok.getValue())); tok.scan(); if (tok.getId() != Tok.TOK_1_RBRACKET) io.Abort("PL0114: ')' 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: vars.setNodesType(Var.VAR_LOCAL); vars.setNodesTypeId(tok.getId()); try { curtree.mergeNodes(vars); } catch { io.Abort("PL0107: invalid variable declaration"); } io.Message(tok+"[Type]"); tok.scan(); break; default: io.Abort("PL0115: type specifier expected"); break; } }
void declarations(VarList curtree) { while ((tok.getId() == Tok.TOK_DCL) || (tok.getId() == Tok.TOK_DECLARE)) { decl_stmt(curtree); null_stmt(); } }
void call_stmt(VarList curtree) { io.Message(tok+"[CALL]"); tok.scan(); if (tok.getId() != Tok.TOK_IDENT) io.Abort("PL0131: ident after CALL expected"); io.Message(tok+"[Ident]"); Var e = call_construct(tok.getValue()); emit.Call(e); if (e.getTypeId() != Tok.TOK_VOID) emit.Insn("pop"); tok.scan(); }
void var_list(VarList curtree) { Var var1 = new Var(); var1.setName(tok.getValue()); try { curtree.add(var1); } catch { io.Abort("PL0107: invalid variable declaration"); } io.Message(tok+"[Var]"); tok.scan(); while ((tok.getId() == Tok.TOK_1_COMMA) || (tok.getId() == Tok.TOK_IDENT)) { if (tok.getFirstChar() != ',') io.Abort("PL0108: ',' or ')' expected"); io.Message(tok+"[Comma]"); tok.scan(); if (tok.getId() != Tok.TOK_IDENT) io.Abort("PL0109: ident expected"); var1 = new Var(); var1.setName(tok.getValue()); try { curtree.add(var1); } catch { io.Abort("PL0107: invalid variable declaration"); } io.Message(tok+"[Var]"); tok.scan(); } }
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 stmt(VarList curtree, String ilabel, String olabel) { Var e = new Var(); currenttree = curtree; if (io.EOF()) io.Abort("PL0142: expected statement but end of file encountered"); if ((tok.getId() != Tok.TOK_PROC) && (tok.getId() != Tok.TOK_PROCEDURE)) if (last_label != null) { emit.Label("L@@"+last_label); last_label = null; } switch (tok.getId()) { case Tok.TOK_RETURN: ret_stmt(ilabel, olabel); null_stmt(); break; case Tok.TOK_IDENT: ident_stmt(curtree); break; case Tok.TOK_CALL: call_stmt(curtree); null_stmt(); break; case Tok.TOK_DO: do_stmt(curtree); null_stmt(); break; case Tok.TOK_GO: case Tok.TOK_GOTO: goto_stmt(curtree); null_stmt(); break; case Tok.TOK_PROCEDURE: case Tok.TOK_PROC: proc_decl(curtree, last_label); null_stmt(); break; case Tok.TOK_IF: if_stmt(curtree, ilabel, olabel); break; case Tok.TOK_DCL: case Tok.TOK_DECLARE: io.Abort("PL0143: wild declaration found"); break; case Tok.TOK_UNKNOWN: io.Abort("PL0144: unknown construction"); break; case Tok.TOK_END: case Tok.TOK_ELSE: case Tok.TOK_THEN: break; default: io.Abort("PL0145: wild symbol found"); break; } }
public void LocalVars(VarList v) { NextInsn(0); localvars = v; icur.setIType(IAsm.I_LOCALDEF); }
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())); } }
public void setNodes(VarList p) { nodes = p; }
void if_stmt(VarList curtree, String olabel, String ilabel) { String label1; String label2; io.Message(tok+"[IF]"); tok.scan(); bool_expr(0); label1 = new_label(); label2 = String.Copy(label1); emit.Branch("brfalse", label1); if (tok.getId() != Tok.TOK_THEN) io.Abort("PL0130: THEN expected"); io.Message(tok+"[THEN]"); tok.scan(); stmt(curtree, olabel, ilabel); if (tok.getId() == Tok.TOK_ELSE) { io.Message(tok+"[ELSE]"); label2 = new_label(); emit.Branch("br", label2); emit.Label(label1); tok.scan(); stmt(curtree, olabel, ilabel); } emit.Label(label2); }
public override void TreeDraw(VarList tree) { }
void param(VarList curtree) { io.Message(tok+"[(]"); tok.scan(); var_list(curtree); if (tok.getId() != Tok.TOK_1_RBRACKET) io.Abort("PL0110: ')' expected"); io.Message(tok+"[)]"); tok.scan(); }
public virtual void TreeDraw(VarList tree) { }