Search in sources :

Example 1 with FunctionExpression

use of org.beetl.core.statement.FunctionExpression in project beetl2.0 by javamonkey.

the class AntlrProgramBuilder method parseFunExp.

protected FunctionExpression parseFunExp(FunctionCallContext ctx) {
    ExpressionListContext expListCtx = ctx.expressionList();
    Expression[] exps = this.getExprssionList(expListCtx);
    List<VarAttributeContext> vaListCtx = ctx.varAttribute();
    Safe_outputContext soctx = ctx.safe_output();
    Expression safeExp = null;
    boolean hasSafe = false;
    if (soctx != null) {
        safeExp = this.parseSafeOutput(soctx);
        hasSafe = true;
    }
    if (this.pbCtx.isSafeOutput) {
        hasSafe = true;
    }
    VarAttribute[] vs = this.parseVarAttribute(vaListCtx);
    List<TerminalNode> idList = ctx.functionNs().Identifier();
    String nsId = this.getID(idList);
    GrammarToken btToken = new org.beetl.core.statement.GrammarToken(nsId, ctx.start.getLine(), 0);
    // 需要做些特殊处理的函数
    if (safeParameters.contains(nsId)) {
        if (exps.length != 0) {
            Expression one = exps[0];
            if (one instanceof VarRef) {
                // 强制为变量引用增加一个安全输出
                VarRef ref = (VarRef) one;
                if (!ref.hasSafe) {
                    ref.hasSafe = true;
                    ref.safe = null;
                }
            }
        }
    } else if (nsId.equals("has")) {
        if (exps.length != 0) {
            Expression one = exps[0];
            if (one instanceof VarRef) {
                // 强制为变量引用增加一个安全输出
                VarRef ref = (VarRef) one;
                String name = ref.token.text;
                Literal newExp = new Literal(name, ref.token);
                // 将变量引用转化为字符串
                exps[0] = newExp;
            }
        }
    } else if (nsId.equals("debug")) {
        // debug函数传递额外的行数
        Literal l = new Literal(btToken.line, btToken);
        Expression[] newExps = new Expression[exps.length + 2];
        System.arraycopy(exps, 0, newExps, 0, exps.length);
        String[] expStr = this.getExpressionString(expListCtx);
        newExps[newExps.length - 2] = new Literal(expStr, btToken);
        newExps[newExps.length - 1] = l;
        for (int i = 0; i < exps.length; i++) {
            if (!(exps[i] instanceof VarRef)) {
                expStr[i] = null;
            }
        }
        exps = newExps;
    // 可以通过配置查看是否支持debug,2.1再做
    } else if (nsId.equals("decode")) {
        Expression[] newExps = new Expression[exps.length];
        if (newExps.length >= 4) {
            newExps[0] = exps[0];
            newExps[1] = exps[1];
            for (int i = 2; i < exps.length; i++) {
                // 参数改成runtime 执行
                newExps[i] = new ExpressionRuntime(exps[i]);
            }
            exps = newExps;
        } else {
        // 错误的使用了decode函数,不管了,等后面报错吧
        }
    }
    FunctionExpression fe = new FunctionExpression(nsId, exps, vs, hasSafe, safeExp, btToken);
    return fe;
}
Also used : VarRef(org.beetl.core.statement.VarRef) VarAttributeContext(org.beetl.core.parser.BeetlParser.VarAttributeContext) ExpressionListContext(org.beetl.core.parser.BeetlParser.ExpressionListContext) FunctionExpression(org.beetl.core.statement.FunctionExpression) Safe_outputContext(org.beetl.core.parser.BeetlParser.Safe_outputContext) ContentBodyExpression(org.beetl.core.statement.ContentBodyExpression) ArthExpression(org.beetl.core.statement.ArthExpression) JsonMapExpression(org.beetl.core.statement.JsonMapExpression) CompareExpression(org.beetl.core.statement.CompareExpression) FunctionExpression(org.beetl.core.statement.FunctionExpression) IncDecExpression(org.beetl.core.statement.IncDecExpression) Expression(org.beetl.core.statement.Expression) AndExpression(org.beetl.core.statement.AndExpression) StatementExpression(org.beetl.core.statement.StatementExpression) NativeCallExpression(org.beetl.core.statement.NativeCallExpression) NegExpression(org.beetl.core.statement.NegExpression) FormatExpression(org.beetl.core.statement.FormatExpression) TernaryExpression(org.beetl.core.statement.TernaryExpression) OrExpression(org.beetl.core.statement.OrExpression) JsonArrayExpression(org.beetl.core.statement.JsonArrayExpression) NotBooleanExpression(org.beetl.core.statement.NotBooleanExpression) VarAttribute(org.beetl.core.statement.VarAttribute) Literal(org.beetl.core.statement.Literal) TerminalNode(org.antlr.v4.runtime.tree.TerminalNode) ExpressionRuntime(org.beetl.core.statement.ExpressionRuntime) GrammarToken(org.beetl.core.statement.GrammarToken)

Example 2 with FunctionExpression

use of org.beetl.core.statement.FunctionExpression in project beetl2.0 by javamonkey.

the class AntlrProgramBuilder method parseExpress.

protected Expression parseExpress(ExpressionContext ctx) {
    if (ctx == null)
        return null;
    if (ctx instanceof LiteralExpContext) {
        return parseLiteralExpress(((LiteralExpContext) ctx).literal());
    } else if (ctx instanceof VarRefExpContext) {
        return this.parseVarRefExpression(((VarRefExpContext) ctx).varRef());
    } else if (ctx instanceof CompareExpContext) {
        CompareExpression compare = parseCompareExpression((CompareExpContext) ctx);
        if (gt.conf.isStrict) {
            throw new MVCStrictException(compare.token);
        }
        return compare;
    } else if (ctx instanceof TernaryExpContext) {
        return this.parseTernaryExpression((TernaryExpContext) ctx);
    } else if (ctx instanceof MuldivmodExpContext) {
        ArthExpression arth = this.parseMuldivmodExpression((MuldivmodExpContext) ctx);
        if (gt.conf.isStrict) {
            throw new MVCStrictException(arth.token);
        }
        return arth;
    } else if (ctx instanceof AddminExpContext) {
        return this.parsePlusMins((AddminExpContext) ctx);
    } else if (ctx instanceof ParExpContext) {
        ParExpContext par = (ParExpContext) ctx;
        return this.parseExpress(par.expression());
    } else if (ctx instanceof FunctionCallExpContext) {
        FunctionCallExpContext fceCtx = (FunctionCallExpContext) ctx;
        FunctionExpression fun = parseFunExp(fceCtx.functionCall());
        if (gt.conf.isStrict) {
            throw new MVCStrictException(fun.token);
        }
        return fun;
    } else if (ctx instanceof JsonExpContext) {
        JsonContext jc = ((JsonExpContext) ctx).json();
        return this.parseJson(jc);
    } else if (ctx instanceof NativeCallExpContext) {
        NativeCallContext ncc = ((NativeCallExpContext) ctx).nativeCall();
        NativeCallExpression nativeCall = this.parseNativeCallExpression(ncc);
        if (!gt.conf.nativeCall || gt.conf.isStrict) {
            throw new NativeNotAllowedException(nativeCall.token);
        }
        return nativeCall;
    } else if (ctx instanceof AndExpContext) {
        AndExpContext andCtx = (AndExpContext) ctx;
        return this.parseAndExpression(andCtx);
    } else if (ctx instanceof OrExpContext) {
        OrExpContext orExp = (OrExpContext) ctx;
        return this.parseOrExpression(orExp);
    } else if (ctx instanceof NotExpContext) {
        NotExpContext notCtx = (NotExpContext) ctx;
        return this.parseNotExpression(notCtx);
    } else if (ctx instanceof NegExpContext) {
        NegExpContext negCtx = (NegExpContext) ctx;
        return this.parseNegExpression(negCtx);
    } else if (ctx instanceof IncDecOneContext) {
        IncDecOneContext oneCtx = (IncDecOneContext) ctx;
        IncDecExpression exp = this.parseIncDecOneContext(oneCtx);
        if (gt.conf.isStrict) {
            throw new NativeNotAllowedException(exp.token);
        }
        return exp;
    } else if (ctx instanceof OneIncDecContext) {
        OneIncDecContext oneCtx = (OneIncDecContext) ctx;
        IncDecExpression exp = this.parseOneIncDecContext(oneCtx);
        if (gt.conf.isStrict) {
            throw new NativeNotAllowedException(exp.token);
        }
        return exp;
    } else if (ctx instanceof AssignGeneralInExpContext) {
        AssignGeneralInExpContext agc = (AssignGeneralInExpContext) ctx;
        VarRefAssignExpress vas = this.parseAssingInExp(agc);
        return vas;
    } else {
        throw new UnsupportedOperationException();
    }
}
Also used : CompareExpContext(org.beetl.core.parser.BeetlParser.CompareExpContext) NotExpContext(org.beetl.core.parser.BeetlParser.NotExpContext) NativeCallExpContext(org.beetl.core.parser.BeetlParser.NativeCallExpContext) OrExpContext(org.beetl.core.parser.BeetlParser.OrExpContext) CompareExpression(org.beetl.core.statement.CompareExpression) FunctionCallExpContext(org.beetl.core.parser.BeetlParser.FunctionCallExpContext) OneIncDecContext(org.beetl.core.parser.BeetlParser.OneIncDecContext) FunctionExpression(org.beetl.core.statement.FunctionExpression) VarRefExpContext(org.beetl.core.parser.BeetlParser.VarRefExpContext) NativeCallContext(org.beetl.core.parser.BeetlParser.NativeCallContext) NativeNotAllowedException(org.beetl.core.exception.NativeNotAllowedException) TernaryExpContext(org.beetl.core.parser.BeetlParser.TernaryExpContext) IncDecExpression(org.beetl.core.statement.IncDecExpression) AssignGeneralInExpContext(org.beetl.core.parser.BeetlParser.AssignGeneralInExpContext) MVCStrictException(org.beetl.core.exception.MVCStrictException) ParExpContext(org.beetl.core.parser.BeetlParser.ParExpContext) ArthExpression(org.beetl.core.statement.ArthExpression) LiteralExpContext(org.beetl.core.parser.BeetlParser.LiteralExpContext) MuldivmodExpContext(org.beetl.core.parser.BeetlParser.MuldivmodExpContext) AndExpContext(org.beetl.core.parser.BeetlParser.AndExpContext) JsonExpContext(org.beetl.core.parser.BeetlParser.JsonExpContext) VarRefAssignExpress(org.beetl.core.statement.VarRefAssignExpress) NativeCallExpression(org.beetl.core.statement.NativeCallExpression) JsonContext(org.beetl.core.parser.BeetlParser.JsonContext) NegExpContext(org.beetl.core.parser.BeetlParser.NegExpContext) AddminExpContext(org.beetl.core.parser.BeetlParser.AddminExpContext) IncDecOneContext(org.beetl.core.parser.BeetlParser.IncDecOneContext)

Aggregations

ArthExpression (org.beetl.core.statement.ArthExpression)2 CompareExpression (org.beetl.core.statement.CompareExpression)2 FunctionExpression (org.beetl.core.statement.FunctionExpression)2 IncDecExpression (org.beetl.core.statement.IncDecExpression)2 NativeCallExpression (org.beetl.core.statement.NativeCallExpression)2 TerminalNode (org.antlr.v4.runtime.tree.TerminalNode)1 MVCStrictException (org.beetl.core.exception.MVCStrictException)1 NativeNotAllowedException (org.beetl.core.exception.NativeNotAllowedException)1 AddminExpContext (org.beetl.core.parser.BeetlParser.AddminExpContext)1 AndExpContext (org.beetl.core.parser.BeetlParser.AndExpContext)1 AssignGeneralInExpContext (org.beetl.core.parser.BeetlParser.AssignGeneralInExpContext)1 CompareExpContext (org.beetl.core.parser.BeetlParser.CompareExpContext)1 ExpressionListContext (org.beetl.core.parser.BeetlParser.ExpressionListContext)1 FunctionCallExpContext (org.beetl.core.parser.BeetlParser.FunctionCallExpContext)1 IncDecOneContext (org.beetl.core.parser.BeetlParser.IncDecOneContext)1 JsonContext (org.beetl.core.parser.BeetlParser.JsonContext)1 JsonExpContext (org.beetl.core.parser.BeetlParser.JsonExpContext)1 LiteralExpContext (org.beetl.core.parser.BeetlParser.LiteralExpContext)1 MuldivmodExpContext (org.beetl.core.parser.BeetlParser.MuldivmodExpContext)1 NativeCallContext (org.beetl.core.parser.BeetlParser.NativeCallContext)1