public Node fun_def() { //Console.WriteLine("fun_def"); var fun = new Fun_(); var r = Expect(TokenCategory.IDENTIFIER); fun.AnchorToken = r; Expect(TokenCategory.OPENP); if (CurrentToken != TokenCategory.CLOSEP) { fun.Add(param_list()); } Expect(TokenCategory.CLOSEP); Expect(TokenCategory.OPENB); if (CurrentToken == TokenCategory.VAR) { //Console.WriteLine("fun_def2"); fun.Add(var_def_list()); } //Console.WriteLine("aqui estoy"); fun.Add(stmt_list()); //Console.WriteLine("fun_def3"); Expect(TokenCategory.CLOSEB); //Console.WriteLine("fun_def4"); return(fun); }
public Node stmt_() { //Console.WriteLine("stmt"); Token r; switch (CurrentToken) { case TokenCategory.IF: //Console.WriteLine("stmt1"); Node If = new If_(); r = Expect(TokenCategory.IF); If.AnchorToken = r; Expect(TokenCategory.OPENP); If.Add(expr()); Expect(TokenCategory.CLOSEP); Expect(TokenCategory.OPENB); If.Add(stmt_list()); //Console.WriteLine("CLOSEB3"); Expect(TokenCategory.CLOSEB); If.Add(else_if_list()); If.Add(else_()); return(If); case TokenCategory.SWITCH: //Console.WriteLine("stmt2"); var Switch = new Switch_(); r = Expect(TokenCategory.SWITCH); Switch.AnchorToken = r; Expect(TokenCategory.OPENP); Switch.Add(expr()); Expect(TokenCategory.CLOSEP); Expect(TokenCategory.OPENB); Switch.Add(case_list()); Switch.Add(default_()); //Console.WriteLine("CLOSEB4"); Expect(TokenCategory.CLOSEB); return(Switch); case TokenCategory.WHILE: //Console.WriteLine("stmt3"); var While = new While_(); r = Expect(TokenCategory.WHILE); While.AnchorToken = r; Expect(TokenCategory.OPENP); While.Add(expr()); Expect(TokenCategory.CLOSEP); Expect(TokenCategory.OPENB); While.Add(stmt_list()); //Console.WriteLine("CLOSEB11"); Expect(TokenCategory.CLOSEB); return(While); /* case TokenCategory.OPENP: * Expect(TokenCategory.OPENP); * expr(); * Expect(TokenCategory.CLOSEP); * break;*/ case TokenCategory.DO: //OYE AQUI NO ES DO_WHILE??? //Console.WriteLine("stmt4"); var Do = new Do_(); r = Expect(TokenCategory.DO); Do.AnchorToken = r; Expect(TokenCategory.OPENB); Do.Add(stmt_list()); //Console.WriteLine("CLOSEB5"); Expect(TokenCategory.CLOSEB); var While_ = new While_(); var m = Expect(TokenCategory.WHILE); While_.AnchorToken = m; Expect(TokenCategory.OPENP); While_.Add(expr()); Do.Add(While_); Expect(TokenCategory.CLOSEP); //Console.WriteLine("semi4"); Expect(TokenCategory.SEMICOLON); return(Do); case TokenCategory.FOR: //Console.WriteLine("stmt5"); var For = new For_(); r = Expect(TokenCategory.FOR); For.AnchorToken = r; Expect(TokenCategory.OPENP); var Id = new Id_(); var n = Expect(TokenCategory.IDENTIFIER); Id.AnchorToken = n; For.Add(Id); Expect(TokenCategory.IN); For.Add(expr()); Expect(TokenCategory.CLOSEP); Expect(TokenCategory.OPENB); For.Add(stmt_list()); //Console.WriteLine("CLOSEB6"); Expect(TokenCategory.CLOSEB); return(For); case TokenCategory.BREAK: //Console.WriteLine("stmt6"); var Break = new Break_(); r = Expect(TokenCategory.BREAK); Break.AnchorToken = r; //Console.WriteLine("semi5"); Expect(TokenCategory.SEMICOLON); return(Break); case TokenCategory.CONTINUE: //Console.WriteLine("stmt7"); var Continue = new Continue_(); r = Expect(TokenCategory.CONTINUE); Continue.AnchorToken = r; //Console.WriteLine("semi6"); Expect(TokenCategory.SEMICOLON); return(Continue); case TokenCategory.RETURN: //Console.WriteLine("stmt8"); var Return = new Return_(); r = Expect(TokenCategory.RETURN); Return.AnchorToken = r; Return.Add(expr()); //Console.WriteLine("semi7"); Expect(TokenCategory.SEMICOLON); return(Return); case TokenCategory.SEMICOLON: //Console.WriteLine("stmt9"); var empty = new Empty_(); //Console.WriteLine("semi8"); r = Expect(TokenCategory.SEMICOLON); empty.AnchorToken = r; return(empty); case TokenCategory.IDENTIFIER: //Console.WriteLine("stmt10"); r = Expect(TokenCategory.IDENTIFIER); if (CurrentToken == TokenCategory.ASIGNATION) { //Console.WriteLine("stmt11"); var id = new Id_(); id.AnchorToken = r; Expect(TokenCategory.ASIGNATION); id.Add(expr()); //Console.WriteLine("semi2"); Expect(TokenCategory.SEMICOLON); return(id); } else if (CurrentToken == TokenCategory.OPENP) { //Console.WriteLine("stmt12"); var Fun = new Fun_(); Fun.AnchorToken = r; Expect(TokenCategory.OPENP); if (CurrentToken != TokenCategory.CLOSEP) { //Console.WriteLine("stmt13");////////////MODIFICADO////////////////////////////////////////// Fun.Add(expr_list()); } //Console.WriteLine("stmt14"); Expect(TokenCategory.CLOSEP); //Console.WriteLine("semi3"); Expect(TokenCategory.SEMICOLON); return(Fun); } else { throw new SyntaxError(TokenCategory.EQUAL, tokenStream.Current); } default: throw new SyntaxError(TokenCategory.IDENTIFIER, tokenStream.Current); } }
public string Visit(Fun_ node, int modo) { Console.WriteLine("aqui3"); if (modo == 1 || modo == 0) { this.currentFunc = node.AnchorToken.lexeme; var str = ""; if (currentFunc == "main") { str = str + "\t.method public static void '" + node.AnchorToken.lexeme + "'("; } else { str = str + "\t.method public static int64 '" + node.AnchorToken.lexeme + "'("; } int i = 0; if (node[i].GetType() == typeof(Id_list_)) { str = str + Visit((dynamic)node[i], 0); i = i + 1; } str = str + ") {\n"; if (currentFunc == "main") { str = str + "\t\t.entrypoint\n"; } if (node[i].GetType() == typeof(Var_def_list_)) { str = str + Visit((dynamic)node[i], 1); i = i + 1; } if (node[i].GetType() == typeof(Stmt_list_)) { str = str + Visit((dynamic)node[i], 0); i = i + 1; } str = str + "\t\tret\n\t}\n"; return(str); } else if (modo == 2) { var str = ""; Console.WriteLine("aqui55553"); var str2 = ""; var i = 0; Console.WriteLine(node.AnchorToken.lexeme + " klkk"); while (i < funcs[node.AnchorToken.lexeme]) { str2 = str2 + "int64"; if (funcs[node.AnchorToken.lexeme] > 1 && funcs[node.AnchorToken.lexeme] != i + 1) { str2 = str2 + ","; } i = i + 1; } foreach (var n in node) { str = str + Visit((dynamic)n, 4) + " "; } if (apifuncs.Contains(node.AnchorToken.lexeme)) { str = str + "\t\tcall int64 class ['int64lib']'Int64'.'Utils'::'" + node.AnchorToken.lexeme + "'(" + str2 + ")\n" + "\t\tpop\n"; } else { str = str + "\t\tcall int64 class 'program'::'" + node.AnchorToken.lexeme + "'(" + str2 + ")\n" + "\t\tpop\n"; } return(str); } return("Hola"); }
public void Visit(Fun_ node, int modo) { if (modo == 1 || modo == 2) { int n = 0; try{ currentFunc = node.AnchorToken.lexeme; if (!funcs.Contains(node.AnchorToken.lexeme)) { this.localvars[node.AnchorToken.lexeme] = new List <String>(); n = Visit((dynamic)node[0], 2); this.funcs[node.AnchorToken.lexeme] = n; } else { throw new SemanticError("repeated function " + "in row " + node.AnchorToken.row, node.AnchorToken); } } catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException e) { this.funcs[node.AnchorToken.lexeme] = n; } } else if (modo == 3) { currentFunc = node.AnchorToken.lexeme; try{ if (this.funcs[currentFunc] != 0) { Visit((dynamic)node[1], 4); Visit((dynamic)node[2], 5); } else { Visit((dynamic)node[0], 4); Visit((dynamic)node[1], 5); } } catch (Exception g) { //this.funcs[node.AnchorToken.lexeme] = n; if (g is Microsoft.CSharp.RuntimeBinder.RuntimeBinderException || g is System.ArgumentOutOfRangeException) { //WebId = Guid.Empty; return; } throw; } } else if (modo == 5) { try{ if (funcs.Contains(node.AnchorToken.lexeme)) { int n1 = 0; ////Console.WriteLine(node.AnchorToken.lexeme); foreach (var n in node[0]) { n1 = n1 + 1; ////Console.WriteLine(node.AnchorToken.lexeme); } ////Console.WriteLine(n1 + " " +node.AnchorToken.lexeme); if (funcs[node.AnchorToken.lexeme] != n1) { throw new SemanticError("wrong number of arguments", node.AnchorToken); } } else { throw new SemanticError("function not found", node.AnchorToken); } } catch (Exception g) { //this.funcs[node.AnchorToken.lexeme] = n; if (g is Microsoft.CSharp.RuntimeBinder.RuntimeBinderException || g is System.ArgumentOutOfRangeException) { //WebId = Guid.Empty; return; } throw; } } }