コード例 #1
0
        public static ADFunctionCall fce_call(string fceName = "")
        {
            STRecord fceRecord = null;
            var      result    = new ADFunctionCall();

            fceRecord = STSearch(fceName);

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

            var argumentsList = new List <IADExpression>();

            while (MainFSM.PeekNextToken().Type != TokenType.rightRBType)
            {
                argumentsList.Add(PrecedenceSyntaxAnalysis.Precedence(TokenType.rightRBType));

                if (MainFSM.PeekNextToken().Type == TokenType.comType)
                {
                    MainFSM.GetNextToken();
                }
            }

            result.Arguments = argumentsList;
            result.STRecord  = fceRecord;


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

            return(result);
        }
コード例 #2
0
        public static string PrintFunctionCall(ADFunctionCall fceCall)
        {
            string result = string.Empty;

            if (fceCall.Expression == null)
            {
                var fceName = fceCall.STRecord.Name;

                if (fceName == "print_long" || fceName == "print_char")
                {
                    result += (PrintExpression(fceCall.Arguments[0], false)) + Environment.NewLine;

                    result += ("movq %rdx, %rdi") + Environment.NewLine;

                    result += ($"call {fceName}") + Environment.NewLine;
                }
                else
                {
                    fceCall.Arguments.Reverse();

                    foreach (var arg in fceCall.Arguments)
                    {
                        result += (PrintExpression(arg)) + Environment.NewLine;
                        result += ("pushq %rdx") + Environment.NewLine;
                    }
                    result += ($"call {fceName}") + Environment.NewLine;
                }
            }
            else
            {
                fceCall.Arguments.Reverse();
                foreach (var arg in fceCall.Arguments)
                {
                    result += (PrintExpression(arg)) + Environment.NewLine;
                    result += ("pushq %rdx") + Environment.NewLine;
                }

                result += PrintExpression(fceCall.Expression);
                result += ($"call *%rdx") + Environment.NewLine;
            }

            return(result);
        }
コード例 #3
0
        public static void PrintFunctionCall(ADFunctionCall fce, string tab)
        {
            Console.WriteLine($"{tab}|- Function Call:");

            if (fce.STRecord != null)
            {
                Console.WriteLine($"{tab}|\tName: {fce.STRecord.Name}");
            }
            else if (fce.Expression != null)
            {
                Console.WriteLine($"{tab}|\tAdress:");
                PrintExpression(fce.Expression, tab + "\t\t");
            }

            if (fce.Arguments.Count > 0)
            {
                Console.WriteLine($"{tab}|\tArguments:");
                foreach (var expr in fce.Arguments)
                {
                    PrintExpression(expr, tab + "\t\t");
                }
            }
        }