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");
        }
Exemple #2
0
        public override void BeforeVisit(DefStatement node)
        {
            base.BeforeVisit(node);
            var initializers = (from varDef in node.VariableDefs
                                where varDef.InitializerExpression != null
                                select varDef.Symbol.GetSetExpression(ExpressionAnalyzer.Analyze(_analysisContext, varDef.InitializerExpression))).ToList();

            _result = initializers.Count > 0 ? (Expression)Expression.Block(initializers) : Expression.Constant(null);
        }
Exemple #3
0
        private void CompileDefStmt(DefStatement stmt, Scope scope)
        {
            scope = new Scope {
                Out = scope, LocalTable = new LocalTable(), Self = stmt, Line = 0
            };
            var instructionSet = new InstructionSet();

            instructionSet.SetLabel($"{InstructionType.LabelDef}:{stmt.Name.Value}");

            for (int i = 0; i < stmt.Parameters.Count; i++)
            {
                scope.LocalTable.SetLCL(stmt.Parameters[i].Value, scope.LocalTable.Depth);
            }

            CompileBlockStatement(instructionSet, stmt.BlockStatement, scope, scope.LocalTable);
            EndInstructions(instructionSet);
            InstructionSets.Add(instructionSet);
        }
Exemple #4
0
        public object GetMethod(StoneObject self, int index)
        {
            DefStatement defStatement = this.MethodDefinitions[index];

            return(new Function(defStatement.Parameters, defStatement.Body, this.Environment, defStatement.Size, self));
        }
Exemple #5
0
 public void AddFunction(DefStatement f)
 {
     FuncList.Add(f);
 }
Exemple #6
0
        private DefStatement ParseDefMethodStatement()
        {
            var stmt = new DefStatement {
                Token = CurToken
            };

            NextToken();

            switch (CurToken.Type)
            {
            case TokenType.Ident:
                if (PeekTokenIs(TokenType.Dot))
                {
                    stmt.Receiver = new Identifier {
                        Token = CurToken, Value = CurToken.Literal
                    };
                    NextToken();
                    if (!ExpectPeek(TokenType.Ident))
                    {
                        return(null);
                    }
                    stmt.Name = new Identifier {
                        Token = CurToken, Value = CurToken.Literal
                    };
                }
                else
                {
                    stmt.Name = new Identifier {
                        Token = CurToken, Value = CurToken.Literal
                    };
                }
                break;

            case TokenType.Self:
                stmt.Receiver = new SelfExpression {
                    Token = CurToken
                };
                NextToken();
                if (ExpectPeek(TokenType.Ident))
                {
                    return(null);
                }
                stmt.Name = new Identifier {
                    Token = CurToken, Value = CurToken.Literal
                };
                break;

            default:
                return(null);
            }

            if (PeekTokenIs(TokenType.Assign))
            {
                stmt.Name.Value = stmt.Name.Value + "=";
                NextToken();
            }

            if (PeekTokenAtSameLine())
            {
                if (!ExpectPeek(TokenType.LParen))
                {
                    return(null);
                }

                stmt.Parameters = ParseParameters();
            }
            else
            {
                stmt.Parameters = new List <Identifier>();
            }

            stmt.BlockStatement = ParseBlockStatement();

            return(stmt);
        }