Exemplo n.º 1
0
        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");
        }
Exemplo n.º 2
0
 public AsmGenerator(Ast Base)
 {
     _base               = Base;
     _functions          = new List <string>();
     _statements         = new List <string>();
     _functionProtoNames = new List <string>();
     _currentNameSpace   = Base;
 }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }