예제 #1
0
        public object VisitExprAST([NotNull] ExprASTContext context)
        {
            Visit(context.term(0));

            for (int i = 1; i < context.term().Length; i++)
            {
                Visit(context.term(i));

                string instruction = "BINARY_";
                if (context.addop(i - 1).GetText() == "+")
                {
                    instruction += "ADD";
                }
                else
                {
                    instruction += "SUBSTRACT";
                }

                AddLine(instruction);
            }
            return(null);
        }
예제 #2
0
        public object VisitExprAST([NotNull] ExprASTContext context)
        {
            if (context.term().Length == 1)
            {
                string type = (string)Visit(context.term(0));
                if (type != "int")
                {
                    if (context.SUB() == null)
                    {
                        return(type);
                    }
                    else if (type != null)
                    {
                        InsertError(context.SUB().Symbol, "La expresión '" + context.term()[0].GetText() + "'no es un número y no se puede negar");
                        return(null);
                    }
                }
                else
                {
                    return(type);
                }
            }
            else if (context.term().Length > 1)
            {
                bool allInts = context.term().ToList().All(term => {
                    string type = (string)Visit(term);
                    if (type != "int")
                    {
                        InsertError(term.Start,
                                    $"El término '{term.GetText()}' no es un número entero. Solo se permite el uso de '+' o '-' con números enteros");
                    }
                    return(type == "int");
                });
                return(allInts ? "int" : null);
            }

            return(null);
        }