public void Visit(NVarDefList node) { foreach (NVarDef varDef in node) { semanticAnalyzer.AddGlobalVariable(new VariableSym(varDef.AnchorToken, VariableSymKind.REGULAR)); } }
// Appends NFunDef to nFunDefList public void FunDef(NFunDefList nFunDefList) { NFunDef nFunDef = new NFunDef() { AnchorToken = Expect(TokenCategory.IDENTIFIER) }; NParameterList nParameterList = new NParameterList(); Expect(TokenCategory.PARENTHESIS_LEFT); if (CurrentToken == TokenCategory.IDENTIFIER) { nParameterList.Add(new NParameter() { AnchorToken = Expect(TokenCategory.IDENTIFIER) }); while (CurrentToken == TokenCategory.COMMA) { Expect(TokenCategory.COMMA); nParameterList.Add(new NParameter() { AnchorToken = Expect(TokenCategory.IDENTIFIER) }); } } Expect(TokenCategory.PARENTHESIS_RIGHT); Expect(TokenCategory.CURLY_BRACE_LEFT); NVarDefList nVarDefList = (NVarDefList)VarDefList(); NStmtList nStmtList = (NStmtList)StmtList(); Expect(TokenCategory.CURLY_BRACE_RIGHT); nFunDef.Add(nParameterList); nFunDef.Add(nVarDefList); nFunDef.Add(nStmtList); nFunDefList.Add(nFunDef); }
//----------------------------------------------------------- public void Visit(NVarDefList node) { Console.WriteLine($"+++++++++++++++ NVARDEFLSIT ++++++++++++++++"); //Console.WriteLine($"n0: ${node.GetType()}"); variablePosition = 0; VisitChildren(node); }
// Returns NVarDefList public Node VarDefList() { NVarDefList nVarDefList = new NVarDefList(); while (CurrentToken == TokenCategory.VAR) { VarDef(nVarDefList); } return(nVarDefList); }
public string Visit(NVarDefList nVarDefList) { string retVal = ""; foreach (NVarDef nVarDef in nVarDefList) { retVal += Visit((dynamic)nVarDef); } return(retVal); }
//----------------------------------------------------------- public string Visit(NProgram nProgram) { NVarDefList nVarDefList = (NVarDefList)nProgram[0]; NFunDefList nFunDefList = (NFunDefList)nProgram[1]; return("// Code generated by the int64 compiler.\n\n" + ".assembly 'int64' {}\n\n" + ".assembly extern 'int64lib' {}\n\n" + ".class public 'Int64Program' extends ['mscorlib']'System'.'Object' {\n" + Visit((dynamic)nVarDefList) + Visit((dynamic)nFunDefList) + "}\n"); }
//----------------------------------------------------------- public void Visit(NVarDefList node) { Console.WriteLine($"+++++++++++++++ NVARDEFLSIT ++++++++++++++++"); //Console.WriteLine($"n0: ${node.GetType()}"); variablePosition = 0; if (pasones == 3) { var final = (Table[nombreFuncion].locTable).Count; var contExtra = 1; if (nombreFuncion == "main") { File.AppendAllText(lePatheo, @".entrypoint .locals init ( "); } else { File.AppendAllText(lePatheo, @" .locals init ( "); } foreach (var XXX in Table[nombreFuncion].locTable) { if (final == contExtra) { File.AppendAllText(lePatheo, $@"{XXX.Value.name}"); } else { File.AppendAllText(lePatheo, $@"{XXX.Value.name}, "); } contExtra++; } File.AppendAllText(lePatheo, @") "); } else { VisitChildren(node); } }
// Appends NVarDef to nVarDefList public void VarDef(NVarDefList nVarDefList) { NVarDef nVarDef = new NVarDef(); Expect(TokenCategory.VAR); nVarDef.AnchorToken = Expect(TokenCategory.IDENTIFIER); nVarDefList.Add(nVarDef); while (CurrentToken == TokenCategory.COMMA) { Expect(TokenCategory.COMMA); NVarDef otherNVarDef = new NVarDef(); otherNVarDef.AnchorToken = Expect(TokenCategory.IDENTIFIER); nVarDefList.Add(otherNVarDef); } Expect(TokenCategory.SEMICOLON); }
//----------------------------------------------------------- public void Visit(NVarDefList node) { Console.WriteLine($"+++++++++++++++ NVARDEFLSIT ++++++++++++++++"); //Console.WriteLine($"n0: ${node.GetType()}"); variablePosition = 0; File.AppendAllText(lePatheo, @".locals init ( "); VisitChildren(node); File.AppendAllText(lePatheo, @") "); }
// Returns NProgram public Node Program() { NProgram nProgram = new NProgram(); NVarDefList nVarDefList = new NVarDefList(); NFunDefList nFunDefList = new NFunDefList(); while (firstOfProgram.Contains(CurrentToken)) { if (CurrentToken == TokenCategory.VAR) { VarDef(nVarDefList); } else if (CurrentToken == TokenCategory.IDENTIFIER) { FunDef(nFunDefList); } else if (CurrentToken == TokenCategory.EOF) { break; } else { throw new SyntaxError(firstOfProgram, tokenStream.Current); } } if (!firstOfProgram.Contains(CurrentToken)) { throw new SyntaxError(new HashSet <TokenCategory>() { TokenCategory.IDENTIFIER, TokenCategory.VAR, TokenCategory.EOF } , tokenStream.Current); } nProgram.Add(nVarDefList); nProgram.Add(nFunDefList); return(nProgram); }