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())); } } }
int ident() { int Typecast = Tok.TOK_VOID; if (io.getNextChar() == '(') { io.Message(tok + "[Ident]"); Var e = call_construct(tok.getValue()); Typecast = e.getTypeId(); if (Typecast == Tok.TOK_VOID) { io.Abort("PL0147: using void function where expecting a value"); } emit.Call(e); tok.scan(); } else { if (currenttree.FindByName(tok.getValue()) == null) { io.Abort("PL0105: undeclared variable"); } Typecast = currenttree.FindByName(tok.getValue()).getTypeId(); emit.Load(currenttree.FindByName(tok.getValue())); io.Message(tok + "[Ident]"); tok.scan(); } return(Typecast); }
Var call_construct(string s) { Var procvar = new Var(); Var e; int i = 0; int parType = Tok.TOK_BINARY; e = tree.FindByName(s); if (e == null) { io.Abort("PL0132: invalid procedure call: undefined procedure"); } if (e.getType() != Var.VAR_BLOCK) { io.Abort("PL0133: invalid procedure call: not a procedure"); } tok.scan(); if (tok.getId() != Tok.TOK_1_LBRACKET) { io.Abort("PL0134: '(' expected"); } tok.scan(); if (tok.getId() != Tok.TOK_1_RBRACKET) { parType = bool_expr(0); typeCheckAssign(parType, e.getParams().FindByIndex(i).getTypeId()); i++; while (tok.getId() == Tok.TOK_1_COMMA) { tok.scan(); parType = bool_expr(0); typeCheckAssign(parType, e.getParams().FindByIndex(i).getTypeId()); i++; } if (tok.getId() != Tok.TOK_1_RBRACKET) { io.Abort("PL0135: ')' expected"); } } if (i != e.getParams().Length()) { io.Abort("PL0136: invalid procedure call: wrong number of parametrs"); } return(e); }
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 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 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(); }
public void Store(IAsm a) { if (a.getVar() == null) { io.ICE("store instruction with no variable ptr"); } Var e = localvars.FindByName(a.getVar().getName()); if (e == null) { e = a.getVar(); } int id = e.getClassId(); if (e.getLocalToken() != null) { LocalBuilder lt = (LocalBuilder)e.getLocalToken(); il.Emit(OpCodes.Stloc, lt); } else { if (e.getFieldBuilder() != null) { FieldBuilder fb = (FieldBuilder)e.getFieldBuilder(); if (id == Tok.T_STATIC) { il.Emit(OpCodes.Stsfld, fb); } else { il.Emit(OpCodes.Stfld, fb); } } else { int index = e.getIndex(); if (id == Tok.T_PARAM) { if (index <= 256) { il.Emit(OpCodes.Starg_S, index); } else { il.Emit(OpCodes.Starg, index); } } else { if (id == Tok.T_AUTO || id == Tok.T_DEFCLASS) { il.Emit(OpCodes.Stloc, index); } else { io.ICE("instruction load of unknown class (" + e.getClassId() + ")"); } } } } }
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())); } } }