Exemplo n.º 1
0
        private void ProcessPrint()
        {
            ArgumentListSyntax    argumentList = SyntaxFactory.ArgumentList();
            ExpressionSyntax      argument     = PopVariable();
            List <ArgumentSyntax> arguments    = new List <ArgumentSyntax>
            {
                SyntaxFactory.Argument(argument)
            };

            argumentList = argumentList.AddArguments(arguments.ToArray());

            ExpressionSyntax expressionSyntax = SyntaxFactory.IdentifierName("Print");

            InvocationExpressionSyntax invocationExpression = SyntaxFactory.InvocationExpression(expressionSyntax, argumentList);

            ExpressionStatementSyntax expressionStatement = SyntaxFactory.ExpressionStatement(invocationExpression, semi);

            var statements = new SyntaxList <StatementSyntax>().Add(expressionStatement);

            //add to the current block
            BlockHelper.AddToCurrentBlock(expressionStatement);
            //currentBlock = currentBlock.WithStatements(statements);

            //GlobalStatementSyntax globalStatement = Syntax.GlobalStatement(expressionStatement);
        }
Exemplo n.º 2
0
        private void ProcessAssign()
        {
            ExpressionSyntax variableExpression = PopVariable();

            var variableIdentifier = SyntaxFactory.IdentifierName(VariableSet.Variables[OpCodes[codePointer].DataIndex.Value].Name);

            AssignmentExpressionSyntax assignment = SyntaxFactory.AssignmentExpression(SyntaxKind.SimpleAssignmentExpression, variableIdentifier, variableExpression);

            //is this a bad comparison that is actually an assign?
            if (OpCodes[codePointer + 1].OpCode == OpCodeType.OP_JMPF)
            {
                //push expression onto the stack
                stack.Push(assignment);
            }
            else
            {
                ////is this a double assign?
                //if (OpCodes[codePointer + 1].OpCode == OpCodeType.OP_GETTOP)
                //{
                //    var variableIdentifier2 = SyntaxFactory.IdentifierName(VariableSet.Variables[OpCodes[codePointer + 1].DataIndex.Value].Name);

                //    assignment = SyntaxFactory.AssignmentExpression(SyntaxKind.SimpleAssignmentExpression, variableIdentifier2, assignment);
                //    codePointer++;
                //}
                var expressionStatement = SyntaxFactory.ExpressionStatement(assignment, semi);
                //add to the current block
                BlockHelper.AddToCurrentBlock(expressionStatement);
            }
        }
Exemplo n.º 3
0
        private void AddVariablesToBlock()
        {
            TypeSyntax intType        = SyntaxFactory.ParseTypeName("int ");
            TypeSyntax stringType     = SyntaxFactory.ParseTypeName("String ");
            TypeSyntax floatType      = SyntaxFactory.ParseTypeName("Float ");
            TypeSyntax pointType      = SyntaxFactory.ParseTypeName("Point ");
            TypeSyntax characterType  = SyntaxFactory.ParseTypeName("Character ");
            TypeSyntax quaternionType = SyntaxFactory.ParseTypeName("Quaternion ");

            var q = from variable in VariableSet.Variables
                    where (variable.Value.Static == false ||
                           variable.Value.Used == false)
                    orderby variable.Key
                    select variable;

            foreach (var variable in q)
            {
                //sourceBuilder.Insert(0, string.Format("{0} variable{1};\n", variable.Value, variable.Key));

                // Build the field variable 1
                VariableDeclaratorSyntax declarator = SyntaxFactory.VariableDeclarator(
                    identifier: SyntaxFactory.Identifier(variable.Value.Name)
                    );

                TypeSyntax theType = null;
                switch (variable.Value.DataType.ToLower())
                {
                case ("int"):
                    theType = intType;
                    break;

                case ("string"):
                    theType = stringType;
                    break;

                case ("point"):
                    theType = pointType;
                    break;

                case ("character"):
                    theType = characterType;
                    break;

                case ("float"):
                    theType = floatType;
                    break;

                case ("quaternion"):
                    theType = quaternionType;
                    break;
                }

                VariableDeclarationSyntax variableDeclaration = SyntaxFactory.VariableDeclaration(type: theType, variables: SyntaxFactory.SeparatedList <VariableDeclaratorSyntax>().Add(declarator));

                SyntaxTokenList modifiers = new SyntaxTokenList();

                LocalDeclarationStatementSyntax localDeclaration = SyntaxFactory.LocalDeclarationStatement(modifiers, variableDeclaration, semi);
                BlockHelper.AddToCurrentBlock(localDeclaration);
            }
        }
Exemplo n.º 4
0
        private void ProcessComparison(OpCodeType opCode)
        {
            SyntaxKind syntaxKind;

            if (opCode == OpCodeType.OP_NOT_EQUAL)
            {
                syntaxKind = SyntaxKind.NotEqualsExpression;
            }
            else if (opCode == OpCodeType.OP_MORE_THAN)
            {
                syntaxKind = SyntaxKind.GreaterThanExpression;
            }
            else if (opCode == OpCodeType.OP_MORE_THAN_OR_EQUAL)
            {
                syntaxKind = SyntaxKind.GreaterThanOrEqualExpression;
            }
            else if (opCode == OpCodeType.OP_LESS_THAN)
            {
                syntaxKind = SyntaxKind.LessThanExpression;
            }
            else if (opCode == OpCodeType.OP_LESS_THAN_OR_EQUAL)
            {
                syntaxKind = SyntaxKind.LessThanOrEqualExpression;
            }
            else
            {
                syntaxKind = SyntaxKind.EqualsExpression;
            }

            if (stack.Count == 0)
            {
                return;
            }

            var rhsVariableExpression = PopVariable();
            var lhsVariableExpression = PopVariable();

            var binaryExpression = SyntaxFactory.BinaryExpression(syntaxKind, lhsVariableExpression, rhsVariableExpression);

            //check for an OP_EQUAL followed by OP_DISCARD where == is used instead of =
            if (syntaxKind == SyntaxKind.EqualsExpression &&
                OpCodes[codePointer + 1].OpCode == OpCodeType.OP_DISCARD)
            {
                var expressionStatement = SyntaxFactory.ExpressionStatement(binaryExpression, semi);
                //add to the current block
                BlockHelper.AddToCurrentBlock(expressionStatement);
            }
            else
            {
                //push expression onto the stack
                stack.Push(binaryExpression);
            }
        }
Exemplo n.º 5
0
        private void ProcessJumpF()
        {
            ExpressionSyntax expressionSyntax = PopVariable();

            if (expressionSyntax == null)
            {
                return;
            }
            // start a new block for the if
            BlockSyntax ifBlock = BlockHelper.CreateNewBlock("if");

            //add the if to the current block
            IfStatementSyntax ifStatement = SyntaxFactory.IfStatement(expressionSyntax, ifBlock);

            BlockHelper.AddToCurrentBlock(ifStatement);

            //current block is now the if
            BlockHelper.SetBlockAsCurrent(ifBlock);
        }
Exemplo n.º 6
0
        private void ProcessFunction()
        {
            DataIndex             function         = (DataIndex)stack.Pop();
            string                functionName     = FunctionTable.Functions[function.Value];
            ExpressionSyntax      expressionSyntax = SyntaxFactory.IdentifierName(functionName);
            ArgumentListSyntax    argumentList     = SyntaxFactory.ArgumentList();
            List <ArgumentSyntax> arguments        = new List <ArgumentSyntax>();

            //reverse the stacks
            stack = new Stack <object>(stack);
            while (stack.Count > 0)
            {
                ExpressionSyntax paramSyntax = PopVariable();
                arguments.Add(SyntaxFactory.Argument(paramSyntax));
                // IsCharacterDead only takes one parameter and we need to cope with bug
                if (functionName == "IsCharacterDead" &&
                    stack.Count > 0)
                {
                    // cope with bug
                    if (OpCodes[codePointer + 1].OpCode == OpCodeType.OP_EQUAL)
                    {
                        arguments.Clear();
                        ExpressionSyntax paramSyntax2 = PopVariable();
                        arguments.Add(SyntaxFactory.Argument(paramSyntax2));
                        stack.Push(paramSyntax);
                    }
                    break;
                }
            }
            argumentList = argumentList.AddArguments(arguments.ToArray());

            InvocationExpressionSyntax invocationExpression = SyntaxFactory.InvocationExpression(expressionSyntax, argumentList);

            ExpressionStatementSyntax expressionStatement = SyntaxFactory.ExpressionStatement(invocationExpression, semi);

            // are we assigning to an equal as a bug?
            if (OpCodes[codePointer + 1].OpCode == OpCodeType.OP_EQUAL)
            {
                var variableIdentifier = PopVariable();
                var binaryExpression   = SyntaxFactory.BinaryExpression(SyntaxKind.EqualsExpression, variableIdentifier, invocationExpression);
                expressionStatement = SyntaxFactory.ExpressionStatement(binaryExpression, semi);
                //make sure we move past the OP_EQUAL
                codePointer++;
            }
            {
                //are we assigning to a variable?
                if (OpCodes[codePointer + 1].OpCode == OpCodeType.OP_GETTOP)
                {
                    var variableIdentifier = SyntaxFactory.IdentifierName(VariableSet.Variables[OpCodes[codePointer + 1].DataIndex.Value].Name);
                    var assignment         = SyntaxFactory.AssignmentExpression(SyntaxKind.SimpleAssignmentExpression, variableIdentifier, expressionStatement.Expression);
                    expressionStatement = SyntaxFactory.ExpressionStatement(assignment, semi);

                    //make sure we move past the OP_GETTOP
                    codePointer++;
                }
                if (OpCodes[codePointer + 1].OpCode == OpCodeType.OP_GETTOP)
                {
                    //add to the current block
                    var variableIdentifier = SyntaxFactory.IdentifierName(VariableSet.Variables[OpCodes[codePointer + 1].DataIndex.Value].Name);
                    var assignment         = SyntaxFactory.AssignmentExpression(SyntaxKind.SimpleAssignmentExpression, variableIdentifier, expressionStatement.Expression);
                    expressionStatement = SyntaxFactory.ExpressionStatement(assignment, semi);

                    //make sure we move past the OP_GETTOP
                    codePointer++;
                }
            }

            //add to the current block
            BlockHelper.AddToCurrentBlock(expressionStatement);
        }