コード例 #1
0
        public static IADNode statement()
        {
            var     nextToken = MainFSM.PeekNextToken();
            IADNode result    = null;

            switch (nextToken.Type)
            {
            case TokenType.longType:
                var list = new ADVariableDeclarations();
                StatementHelpers.VariableDeclaration(ref list);

                list.Variables.Reverse();
                result = list;
                break;

            case TokenType.starType:
                result = new ADStatementExpression {
                    Expression = PrecedenceSyntaxAnalysis.Precedence(TokenType.semiType)
                };

                if (MainFSM.GetNextToken().Type != TokenType.semiType)
                {
                    SyntaxError("Byl ocekavan znak \';\'");
                }

                break;

            case TokenType.idType:
            case TokenType.incrType:
            case TokenType.decrType:
                if (MainFSM.PeekNextToken(2).Type == TokenType.leftRBType)
                {
                    var fceToken = MainFSM.GetNextToken();

                    result = fce_call(fceToken.Attribute);

                    if (MainFSM.GetNextToken().Type != TokenType.semiType)
                    {
                        SyntaxError("Byl ocekavan znak \';\'");
                    }
                }
                else
                {
                    result = new ADStatementExpression {
                        Expression = PrecedenceSyntaxAnalysis.Precedence(TokenType.semiType)
                    };

                    if (MainFSM.GetNextToken().Type != TokenType.semiType)
                    {
                        SyntaxError("Byl ocekavan znak \';\'");
                    }
                }
                break;

            case TokenType.ifType:
                result = StatementHelpers.Condition();
                break;

            case TokenType.forType:
                result = StatementHelpers.ForLoop();
                break;

            case TokenType.whileType:
                result = StatementHelpers.WhileLoop();
                break;

            case TokenType.doType:
                result = StatementHelpers.DoWhileLoop();
                break;

            case TokenType.returnType:
                result = StatementHelpers.Return();
                break;

            case TokenType.breakType:
                result = StatementHelpers.Break();
                break;

            case TokenType.continueType:
                result = StatementHelpers.Continue();
                break;

            case TokenType.leftCBType:
                result = StatementHelpers.InnerStatements();
                break;

            default:
                SyntaxError("Byl ocekavan jeden z nasledujici klicovych slov nebo znaku: long, *, identifikator, if, for, while, do, return, break, continue");
                break;
            }
            return(result);
        }
コード例 #2
0
 public static void PrintNode(IADNode node, string breakLabel = "", string continueLabel = "", string returnLabel = "", IADExpression forIncrement = null, string globalAssigns = "")
 {
     if (node is ADFunctionDeclaration)
     {
         Console.WriteLine($"# deklarace funkce {(node as ADFunctionDeclaration).Name}");
         PrintFunctionDeclaration(node as ADFunctionDeclaration, globalAssigns);
         Console.WriteLine();
         Console.WriteLine();
     }
     else if (node is ADFunctionCall)
     {
         Console.WriteLine("# volani funkce");
         Console.WriteLine(PrintFunctionCall(node as ADFunctionCall));
     }
     else if (node is ADForLoop)
     {
         Console.WriteLine("# cykus for");
         PrintForLoop(node as ADForLoop, returnLabel);
     }
     else if (node is ADWhileLoop)
     {
         Console.WriteLine("# cykus while");
         PrintWhileLoop(node as ADWhileLoop, returnLabel);
     }
     else if (node is ADDoWhileLoop)
     {
         Console.WriteLine("# cykus do-while");
         PrintDoWhileLoop(node as ADDoWhileLoop, returnLabel);
     }
     else if (node is ADStatementExpression)
     {
         Console.WriteLine(PrintExpression((node as ADStatementExpression).Expression));
     }
     else if (node is ADCondition)
     {
         PrintCondition(node as ADCondition, breakLabel, continueLabel, returnLabel, forIncrement);
     }
     else if (node is ADBreak)
     {
         PrintBreak(breakLabel);
     }
     else if (node is ADContinue)
     {
         PrintContinue(continueLabel);
     }
     else if (node is ADInnerStatements)
     {
         foreach (var item in (node as ADInnerStatements).Statements)
         {
             PrintNode(item, breakLabel, continueLabel, returnLabel, forIncrement);
         }
     }
     else if (node is ADReturn)
     {
         Console.WriteLine(PrintExpression((node as ADReturn).Expression, false));
         Console.WriteLine("movq %rdx, %rax");
         Console.WriteLine($"jmp {returnLabel}");
     }
     else if (node is ADArrayValue)
     {
         PrintArrayValue(node as ADArrayValue);
     }
     else if (node is ADVariableDeclarations)
     {
         foreach (var variable in (node as ADVariableDeclarations).Variables)
         {
             if (variable.Value != null && variable.Type != ADVariable.VarType.array)
             {
                 Console.WriteLine($"# Prirazeni promenne {variable.Name}");
                 Console.WriteLine(PrintExpression(variable.Value));
                 Console.WriteLine($"movq %rdx, {variable.STRecord.Address}");
             }
         }
     }
 }
コード例 #3
0
 public static void PrintNode(IADNode node, string tab)
 {
     if (node is ADDeclaration)
     {
         PrintDeclaration((ADDeclaration)node, tab);
     }
     else if (node is ADFunctionDeclaration)
     {
         PrintFunctionDeclaration((ADFunctionDeclaration)node, tab);
     }
     else if (node is ADVariableDeclarations)
     {
         PrintVariableDeclaration((ADVariableDeclarations)node, tab);
     }
     else if (node is ADForLoop)
     {
         PrintForLoop((ADForLoop)node, tab);
     }
     else if (node is ADWhileLoop)
     {
         PrintWhileLoop((ADWhileLoop)node, tab);
     }
     else if (node is ADDoWhileLoop)
     {
         PrintDoWhileLoop((ADDoWhileLoop)node, tab);
     }
     else if (node is ADCondition)
     {
         PrintCondition((ADCondition)node, tab);
     }
     else if (node is ADFunctionCall)
     {
         PrintFunctionCall((ADFunctionCall)node, tab);
     }
     else if (node is ADReturn)
     {
         PrintReturn((ADReturn)node, tab);
     }
     else if (node is ADContinue)
     {
         PrintContinue(tab);
     }
     else if (node is ADInnerStatements)
     {
         PrintInnerStatement((ADInnerStatements)node, tab);
     }
     else if (node is ADArrayValue)
     {
         PrintArrayValue((ADArrayValue)node, tab);
     }
     else if (node is ADSizeOfValue)
     {
         PrintSizeOf(tab);
     }
     else if (node is ADVariable)
     {
         PrintVariable((ADVariable)node, tab);
     }
     else if (node is ADVariableAssignment)
     {
         PrintVariableAssignment((ADVariableAssignment)node, tab);
     }
     else if (node is ADStatementExpression)
     {
         PrintStatementExpression((ADStatementExpression)node, tab);
     }
     else if (node is ADBreak)
     {
         PrintBreak(tab);
     }
 }