Search in sources :

Example 1 with NativeCallExpression

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

the class AntlrProgramBuilder method parseNativeCallExpression.

protected NativeCallExpression parseNativeCallExpression(NativeCallContext ncc) {
    NativeCallExpression nativeExp = null;
    List<ParseTree> list = ncc.children;
    // nativeCall: nativeVarRefChain (nativeMethod|nativeArray| PERIOD nativeVarRefChain)*;
    NativeVarRefChainContext first = (NativeVarRefChainContext) list.get(0);
    List<TerminalNode> ids = first.Identifier();
    StringBuilder clsSb = new StringBuilder();
    // 是类静态调用还是实例调用
    boolean isCls = false;
    int i = 0;
    for (; i < ids.size(); i++) {
        String text = ids.get(i).getText();
        char c = text.charAt(0);
        if (c >= 'A' && c <= 'Z') {
            clsSb.append(text);
            isCls = true;
            break;
        } else {
            clsSb.append(text).append(".");
        }
    }
    ClassNode clsNode = null;
    InstanceNode insNode = null;
    if (isCls) {
        clsNode = new ClassNode(clsSb.toString());
        // 指向下一个属性或者静态方法
        i++;
    } else {
        // 变量的属性引用,回到第一个,构造一个变量
        String varName = ids.get(0).getText();
        VarRef ref = new VarRef(new VarAttribute[0], false, null, this.getBTToken(varName, ncc.start.getLine()));
        this.pbCtx.setVarPosition(varName, ref);
        insNode = new InstanceNode(ref);
        i = 1;
    }
    List<NativeNode> nativeList = new ArrayList<NativeNode>();
    for (int j = i; j < ids.size(); j++) {
        // 剩下的是属性
        NativeAtrributeNode attribute = new NativeAtrributeNode(ids.get(j).getText());
        nativeList.add(attribute);
    }
    for (int z = 1; z < list.size(); z++) {
        ParseTree tree = list.get(z);
        if (tree instanceof NativeMethodContext) {
            NativeMethodContext methodCtx = (NativeMethodContext) tree;
            NativeMethodNode methodNode = null;
            String method = null;
            NativeNode lastNode = nativeList.get(nativeList.size() - 1);
            if (lastNode instanceof NativeAtrributeNode) {
                method = ((NativeAtrributeNode) lastNode).attribute;
                // 
                nativeList.remove(nativeList.size() - 1);
            } else {
                String msg = null;
                if (lastNode instanceof NativeArrayNode) {
                    msg = "[]()";
                } else {
                    msg = "()()";
                }
                BeetlException ex = new BeetlException(BeetlException.PARSER_NATIVE_ERROR, msg);
                ex.pushToken(this.getBTToken(methodCtx.getStart()));
                throw ex;
            }
            // 解析参数
            List<ExpressionContext> expCtxList = methodCtx.expression();
            Expression[] exp = this.parseExpressionCtxList(expCtxList);
            methodNode = new NativeMethodNode(method, exp);
            nativeList.add(methodNode);
        } else if (tree instanceof NativeArrayContext) {
            ExpressionContext expCtx = ((NativeArrayContext) tree).expression();
            Expression exp = this.parseExpress(expCtx);
            NativeArrayNode arrayNode = new NativeArrayNode(exp);
            nativeList.add(arrayNode);
        } else if (tree instanceof NativeVarRefChainContext) {
            List<TerminalNode> nodes = ((NativeVarRefChainContext) tree).Identifier();
            for (TerminalNode node : nodes) {
                NativeAtrributeNode attributeNode = new NativeAtrributeNode(node.getText());
                nativeList.add(attributeNode);
            }
        } else {
            // 其他节点,这段语法写的不好,造成解析困难,但先这样了
            continue;
        }
    }
    NativeNode[] chain = nativeList.toArray(new NativeNode[0]);
    if (clsNode != null) {
        nativeExp = new NativeCallExpression(clsNode, chain, this.getBTToken(ncc.start));
    } else {
        nativeExp = new NativeCallExpression(insNode, chain, this.getBTToken(ncc.start));
    }
    return nativeExp;
}
Also used : VarRef(org.beetl.core.statement.VarRef) NativeArrayNode(org.beetl.core.statement.nat.NativeArrayNode) BeetlException(org.beetl.core.exception.BeetlException) InstanceNode(org.beetl.core.statement.nat.InstanceNode) ArrayList(java.util.ArrayList) NativeNode(org.beetl.core.statement.nat.NativeNode) NativeAtrributeNode(org.beetl.core.statement.nat.NativeAtrributeNode) ClassNode(org.beetl.core.statement.nat.ClassNode) NativeVarRefChainContext(org.beetl.core.parser.BeetlParser.NativeVarRefChainContext) NativeArrayContext(org.beetl.core.parser.BeetlParser.NativeArrayContext) NativeCallExpression(org.beetl.core.statement.NativeCallExpression) StatementExpressionContext(org.beetl.core.parser.BeetlParser.StatementExpressionContext) ExpressionContext(org.beetl.core.parser.BeetlParser.ExpressionContext) ParExpressionContext(org.beetl.core.parser.BeetlParser.ParExpressionContext) 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) TerminalNode(org.antlr.v4.runtime.tree.TerminalNode) NativeMethodNode(org.beetl.core.statement.nat.NativeMethodNode) ParseTree(org.antlr.v4.runtime.tree.ParseTree) NativeMethodContext(org.beetl.core.parser.BeetlParser.NativeMethodContext)

Example 2 with NativeCallExpression

use of org.beetl.core.statement.NativeCallExpression 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 ArrayList (java.util.ArrayList)1 ParseTree (org.antlr.v4.runtime.tree.ParseTree)1 TerminalNode (org.antlr.v4.runtime.tree.TerminalNode)1 BeetlException (org.beetl.core.exception.BeetlException)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 ExpressionContext (org.beetl.core.parser.BeetlParser.ExpressionContext)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