private string GenerateFunction(DefStatement defStatement) { var oldNameSpace = _currentNameSpace; _currentNameSpace = defStatement; var bodystatements = new StringBuilder(); bodystatements.Append($"push ebp\nmov ebp, esp\nsub esp, {defStatement.VarCounter * 4}\n"); foreach (var statement in defStatement.GetChildren()) { //Console.WriteLine(statement.GetType() + statement.Row.ToString() + ':' + statement.Column.ToString()); bodystatements.Append(GenerateCode(statement)); bodystatements.Append('\n'); } bodystatements.Append($"add esp, {defStatement.VarCounter * 4}\nmov esp, ebp\npop ebp\n"); bodystatements.Append($"ret {defStatement.Args.Count * 4}\n"); _currentNameSpace = oldNameSpace; _functionProtoNames.Add(string.Format(ProtoTemplate, defStatement.Name)); _functions.Add(string.Format(ProcTemplate, defStatement.Name, bodystatements.ToString())); return("\n"); }
public AsmGenerator(Ast Base) { _base = Base; _functions = new List <string>(); _statements = new List <string>(); _functionProtoNames = new List <string>(); _currentNameSpace = Base; }
private DefStatement ParseDef(Dictionary <string, int> varTable) { //Console.WriteLine(string.Join(", ", varTable.Keys)); var def = new DefStatement(_enumerator.Current.row, _enumerator.Current.column, varTable) { Name = this.Match(TokenKind.NAME).data, Args = this.MatchDefArgs() }; def.FuncList = new List <DefStatement>(_currentNameSpace.FuncList); _currentNameSpace.AddFunction(def); //def.Args.Reverse(); foreach (var arg in def.Args) { if (def.varTable.Keys.Contains(arg)) { def.varTable.Remove(arg); } //def.AddVar(arg); def.AddArg(arg); } this.Match(TokenKind.COLON); if (MatchBool(TokenKind.NEWLINE)) { var prevNameSpace = _currentNameSpace; _currentNameSpace = def; //ParseUntil(def, TokenKind.RETURN); ParseUntil(def, TokenKind.DEDENT); //Console.WriteLine(string.Join(", ", def.varTable.Keys.ToList())); //Console.WriteLine(string.Join(", ", _base.varTable.ToList())); //_enumerator.MovePrevious(); //_enumerator.MovePrevious(); //def.Return = this.MatchReturn(); //this.MatchCurrent(TokenKind.NEWLINE); //this.Match(TokenKind.DEDENT); /* * Console.WriteLine(def.Name); * foreach (var kvp in def.varTable) * { * Console.WriteLine($"{kvp.Key.ToString()} : {kvp.Value.ToString()}"); * }*/ _currentNameSpace = prevNameSpace; } else { this.MatchCurrent(TokenKind.RETURN); def.Return = ParseExpr(); MatchCurrent(TokenKind.NEWLINE); } return(def); }
public Parser(List <Token> tokens) { _defAst = new Dictionary <string, AstNode>(); _tokens = tokens; _base = new Ast(); _enumerator = new TwoWayEnum <Token>(_tokens.GetEnumerator()); _currentNameSpace = _base; ParseUntil(_base.root); }