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 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 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(); }
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 label(Tok s) { Var var = new Var(); String label1 = "L@@" + s.getValue(); io.Message(s + "[Label]"); var.setName(label1); var.setType(Var.VAR_LABEL); try { currenttree.add(var); } catch { io.Abort("PL0111: invalid label declaration"); } if (tok.getId() != Tok.TOK_1_REL) { io.Abort("PL0112: ':' expected"); } io.Message(tok + "[:]"); last_label = s.getValue(); tok.scan(); }
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(); }
void label(Tok s) { Var var = new Var(); String label1 = "L@@"+s.getValue(); io.Message(s+"[Label]"); var.setName(label1); var.setType(Var.VAR_LABEL); try { currenttree.add(var); } catch { io.Abort("PL0111: invalid label declaration"); } if (tok.getId() != Tok.TOK_1_REL) io.Abort("PL0112: ':' expected"); io.Message(tok+"[:]"); last_label = s.getValue(); tok.scan(); }
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); }
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(); } }
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 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 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())); } } }