Ejemplo n.º 1
0
        private bool ParseProcedureBody(Lexer lexer, Token token, Procedure procedure, Attributes attributes)
        {
            var successfullyParsed = true;

            try
            {
                ValidateToken(token, TokenType.ScopeStart);
            }
            catch (Exception ex)
            {
                successfullyParsed = false;
                Logger(ex.Message);
            }

            var bodyAttributes = Attributes.Create(attributes["ENVS"], "ENVS");

            bodyAttributes.AddAttribute(procedure.Statements, "STMS");

            successfullyParsed &= ParserFactory.GetBodyParser().Parse(lexer, lexer.GetNextToken(), bodyAttributes);

            return(successfullyParsed);
        }
Ejemplo n.º 2
0
        public bool Parse(Lexer lexer, Token token, Attributes attributes)
        {
            var successfullyParsed = true;

            try
            {
                var tree = new While();

                ValidateToken(token, TokenType.IterationWhile);

                var expressionAttributes = Attributes.Create(attributes.ToArray());

                successfullyParsed &= ParserFactory.GetExpressionParser().Parse(lexer, lexer.GetNextToken(), expressionAttributes);

                // SEM: La condición en un WHILE no puede ser una expresión nula.
                if (expressionAttributes.ContainsAttribute("EXP"))
                {
                    tree.Condition = expressionAttributes["EXP"] as Expression;

                    // SEM: La condición en un WHILE no puede ser una expresión nula.
                    if (tree.Condition != null)
                    {
                        // SEM: La condición en un WHILE sólo puede ser una expresión booleana
                        if (tree.Condition.Type != DataType.Boolean)
                        {
                            LogTypeExpressionInvalid(token, DataType.Boolean, DataType.Integer);
                            successfullyParsed = false;
                        }
                    }
                    else
                    {
                        LogNullExpression(token, DataType.Boolean);
                        successfullyParsed = false;
                    }
                }
                else
                {
                    LogNullExpression(token, DataType.Boolean);
                    successfullyParsed = false;
                }

                ValidateToken(lexer.GetCurrentToken(), TokenType.IterationDo);

                var bodyAttributes = Attributes.Create(attributes["ENVS"], "ENVS");

                bodyAttributes.AddAttribute(tree.Statements, "STMS");

                successfullyParsed &= ParserFactory.GetBodyParser().Parse(lexer, lexer.GetNextToken(), bodyAttributes);

                ValidateToken(lexer.GetCurrentToken(), TokenType.IterationEnd);
                ValidateToken(lexer.GetNextToken(), TokenType.EndOfInstruction);

                attributes.AddAttribute(tree, "WHILE");
            }
            catch (Exception ex)
            {
                successfullyParsed = false;

                Logger(ex.Message);
                ErrorRecovery(lexer);
            }

            return(successfullyParsed);
        }
Ejemplo n.º 3
0
        public bool Parse(Lexer lexer, Token token, Attributes attributes)
        {
            var        successfullyParsed = true;
            Expression condition          = null;

            try
            {
                ValidateToken(token, TokenType.ConditionalIf);

                var expressionAttributes = Attributes.Create(attributes.ToArray());

                successfullyParsed &= ParserFactory.GetExpressionParser().Parse(lexer, lexer.GetNextToken(), expressionAttributes);

                // SEM: La condición en un IF no puede ser una expresión nula.
                if (expressionAttributes.ContainsAttribute("EXP"))
                {
                    condition = expressionAttributes["EXP"] as Expression;

                    // SEM: La condición en un IF no puede ser una expresión nula.
                    if (condition != null)
                    {
                        // SEM: La condición en un IF sólo puede ser una expresión booleana
                        if (condition.Type != DataType.Boolean)
                        {
                            LogTypeExpressionInvalid(token, DataType.Boolean, DataType.Integer);
                            successfullyParsed = false;
                        }
                    }
                    else
                    {
                        LogNullExpression(token, DataType.Boolean);
                        successfullyParsed = false;
                    }
                }
                else
                {
                    LogNullExpression(token, DataType.Boolean);
                    successfullyParsed = false;
                }

                ValidateToken(lexer.GetCurrentToken(), TokenType.ConditionalThen);

                var thenBodyAttributes = Attributes.Create(attributes["ENVS"], "ENVS");
                var thenStatements     = new Statements();

                thenBodyAttributes.AddAttribute(thenStatements, "STMS");

                successfullyParsed &= ParserFactory.GetBodyParser().Parse(lexer, lexer.GetNextToken(), thenBodyAttributes);

                token = lexer.GetCurrentToken();

                if (token.Is(TokenType.ConditionalEnd))
                {
                    ValidateToken(lexer.GetNextToken(), TokenType.EndOfInstruction);

                    var tree = new IfThen();

                    tree.Condition  = condition;
                    tree.Statements = thenStatements;

                    attributes.AddAttribute(tree, "IF");
                }
                else if (token.Is(TokenType.ConditionalElse))
                {
                    var elseBodyAttributes = Attributes.Create(attributes["ENVS"], "ENVS");
                    var elseStatements     = new Statements();

                    elseBodyAttributes.AddAttribute(elseStatements, "STMS");

                    successfullyParsed &= ParserFactory.GetBodyParser().Parse(lexer, lexer.GetNextToken(), elseBodyAttributes);

                    ValidateToken(lexer.GetCurrentToken(), TokenType.ConditionalEnd);
                    ValidateToken(lexer.GetNextToken(), TokenType.EndOfInstruction);

                    var tree = new IfThenElse();

                    tree.Condition = condition;
                    tree.Then      = thenStatements;
                    tree.Else      = elseStatements;

                    attributes.AddAttribute(tree, "IF");
                }
            }
            catch (Exception ex)
            {
                successfullyParsed = false;

                Logger(ex.Message);
                ErrorRecovery(lexer);
            }

            return(successfullyParsed);
        }