Exemple #1
0
        /// <summary>
        /// Parser function that generates function call quadruples.
        /// While checking semantics.
        /// </summary>
        void CallFunction()
        {
            Expect((int)TokenEnum.Function);
            Expect((int)TokenEnum.Id);
            string id = GetLastTokenValue();

            Expect((int)TokenEnum.LeftParenthesis);
            VariableBlock parameters = new VariableBlock();

            if (StartOf((int)TokenEnum.String))
            {
                Expression();
                string         paramId   = Quadruple.operandStack.Pop();
                GraphicFooType type      = Quadruple.typeStack.Pop();
                Variable       parameter = new Variable(paramId, type);
                if (parameter.type == GraphicFooType.Invalid)
                {
                    SemErr((int)SemanticEnum.Variable);
                }
                parameters.AddVariable(parameter);
                while (la.kind == (int)TokenEnum.Comma)
                {
                    Get();
                    Expression();
                    paramId   = Quadruple.operandStack.Pop();
                    type      = Quadruple.typeStack.Pop();
                    parameter = new Variable(paramId, type);
                    if (parameter.type == GraphicFooType.Invalid)
                    {
                        SemErr((int)SemanticEnum.Variable);
                    }
                    parameters.AddVariable(parameter);
                }
            }
            Expect((int)TokenEnum.RightParenthesis);
            Quadruple.CreateFunctionCallQuadruples(id, parameters);

            if (la.kind == (int)TokenEnum.Assignation)
            {
                Get();
                Expect((int)TokenEnum.Id);
                string varId = GetLastTokenValue();
                Quadruple.CreateReturnAssignationQuadruple(id, varId);
            }
            Expect((int)TokenEnum.Semicolon);
        }