コード例 #1
0
        public override IType VisitExpression([NotNull] FAILangParser.ExpressionContext context)
        {
            var type       = context.type();
            var name       = context.name();
            var op         = context.op;
            var prefix     = context.prefix();
            var cond       = context.cond();
            var callparams = context.callparams();
            var lambda     = context.lambda();
            var union      = context.union();
            var indexer    = context.indexer();

            if (type != null)
            {
                return(VisitType(type));
            }
            else if (name != null)
            {
                return(VisitName(name));
            }
            else if (op != null)
            {
                var      exprs = context.expression();
                Operator oper  = Operator.MULTIPLY;
                switch (op.Text)
                {
                case "+":
                    oper = Operator.ADD;
                    break;

                case "-":
                    oper = Operator.SUBTRACT;
                    break;

                case "*":
                    oper = Operator.MULTIPLY;
                    break;

                case "":
                    oper = Operator.MULTIPLY;
                    break;

                case "/":
                    oper = Operator.DIVIDE;
                    break;

                case "%":
                    oper = Operator.MODULO;
                    break;

                case "^":
                    oper = Operator.EXPONENT;
                    break;

                case "=":
                    oper = Operator.EQUALS;
                    break;

                case "~=":
                    oper = Operator.NOT_EQUALS;
                    break;

                case ">":
                    oper = Operator.GREATER;
                    break;

                case "<":
                    oper = Operator.LESS;
                    break;

                case ">=":
                    oper = Operator.GR_EQUAL;
                    break;

                case "<=":
                    oper = Operator.LE_EQUAL;
                    break;
                }
                return(new OperatorExpression(oper, VisitExpression(exprs[0]), VisitExpression(exprs[1])));
            }
            else if (prefix != null)
            {
                Prefix pre = Prefix.NOT;
                switch (prefix.GetText())
                {
                case "~":
                    pre = Prefix.NOT;
                    break;

                case "-":
                    pre = Prefix.NEGATIVE;
                    break;
                }
                return(new PrefixExpression(pre, VisitExpression(context.expression(0))));
            }
            else if (cond != null)
            {
                return(VisitCond(cond));
            }
            else if (callparams != null)
            {
                return(new FunctionExpression(VisitExpression(context.expression(0)),
                                              callparams.arg()
                                              .Select(x => (VisitExpression(x.expression()), x.elipsis != null)).ToArray()));
            }
            else if (lambda != null)
            {
                return(VisitLambda(lambda));
            }
            else if (union != null)
            {
                return(VisitUnion(union));
            }
            else if (indexer != null)
            {
                IType l_expr = null;
                if (indexer.l_index != null)
                {
                    l_expr = VisitExpression(indexer.l_index);
                }
                IType r_expr = null;
                if (indexer.r_index != null)
                {
                    r_expr = VisitExpression(indexer.r_index);
                }
                return(new IndexerExpression(VisitExpression(context.expression(0)), l_expr, r_expr, indexer.elipsis != null));
            }

            return(VisitExpression(context.expression(0)));
        }
コード例 #2
0
 public override IType VisitExpression([NotNull] FAILangParser.ExpressionContext context)
 {
     return(VisitWhere(context.where ()));
 }