use of org.beetl.core.statement.Expression in project beetl2.0 by javamonkey.
the class AntlrProgramBuilder method parseWhile.
protected WhileStatement parseWhile(WhileStContext wc) {
pbCtx.enterBlock();
// break,continue语句到此为止
pbCtx.current.canStopContinueBreakFlag = true;
ExpressionContext condtionCtx = wc.parExpression().expression();
StatementContext bodyCtx = wc.statement();
Expression condtion = this.parseExpress(condtionCtx);
Statement body = this.parseStatment(bodyCtx);
WhileStatement whileStat = new WhileStatement(condtion, body, this.getBTToken(wc.getStart()));
pbCtx.exitBlock();
return whileStat;
}
use of org.beetl.core.statement.Expression in project beetl2.0 by javamonkey.
the class AntlrProgramBuilder method parseSafeOutput.
protected Expression parseSafeOutput(Safe_outputContext soctx) {
Expression safeExp = null;
List list = soctx.children;
if (list.size() == 1) {
safeExp = null;
} else {
// just xxx!exp
Safe_allow_expContext allowExp = (Safe_allow_expContext) list.get(1);
if (allowExp.literal() != null) {
safeExp = this.parseLiteralExpress(allowExp.literal());
} else if (allowExp.nativeCall() != null) {
safeExp = this.parseNativeCallExpression(allowExp.nativeCall());
} else if (allowExp.functionCall() != null) {
safeExp = this.parseFunExp(allowExp.functionCall());
} else if (allowExp.expression() != null) {
safeExp = this.parseExpress(allowExp.expression());
} else if (allowExp.varRef() != null) {
safeExp = this.parseVarRefExpression(allowExp.varRef());
}
}
return safeExp;
}
use of org.beetl.core.statement.Expression in project beetl2.0 by javamonkey.
the class AntlrProgramBuilder method parseMuldivmodExpression.
protected ArthExpression parseMuldivmodExpression(MuldivmodExpContext ctx) {
Expression a = this.parseExpress(ctx.expression(0));
Expression b = this.parseExpress(ctx.expression(1));
TerminalNode tn = (TerminalNode) ctx.children.get(1);
short mode = 0;
if (ctx.MUlTIP() != null) {
mode = ArthExpression.MUL;
} else if (ctx.DIV() != null) {
mode = ArthExpression.DIV;
} else if (ctx.MOD() != null) {
mode = ArthExpression.MOD;
}
return new ArthExpression(a, b, mode, this.getBTToken(tn.getSymbol()));
}
use of org.beetl.core.statement.Expression in project beetl2.0 by javamonkey.
the class VarAttributeNodeListener method onEvent.
@Override
public Object onEvent(Event e) {
Stack stack = (Stack) e.getEventTaget();
Object o = stack.peek();
if (o instanceof VarRef) {
VarRef ref = (VarRef) o;
VarAttribute[] attrs = ref.attributes;
for (int i = 0; i < attrs.length; i++) {
GroupTemplate gt = (GroupTemplate) ((Map) stack.get(0)).get("groupTemplate");
VarAttribute attr = attrs[i];
if (attr.getClass() == VarAttribute.class) {
Type type = attr.type;
String name = attr.token != null ? attr.token.text : null;
// 换成速度较快的属性访问类
try {
AttributeAccess aa = gt.getAttributeAccessFactory().buildFiledAccessor(type.cls, name, gt);
attr.aa = aa;
} catch (BeetlException ex) {
ex.pushToken(attr.token);
throw ex;
}
} else if (attr.getClass() == VarSquareAttribute.class) {
Type type = attr.type;
Class c = type.cls;
if (Map.class.isAssignableFrom(c)) {
attr.setAA(gt.getAttributeAccessFactory().getMapAA());
} else if (List.class.isAssignableFrom(c) || Set.class.isAssignableFrom(c)) {
attr.setAA(gt.getAttributeAccessFactory().getListAA());
} else if (c.isArray()) {
attr.setAA(gt.getAttributeAccessFactory().getArrayAA());
} else {
Expression exp = ((VarSquareAttribute) attr).exp;
if (exp instanceof Literal) {
Literal literal = (Literal) exp;
if (literal.obj instanceof String) {
try {
String attributeName = (String) literal.obj;
AttributeAccess aa = gt.getAttributeAccessFactory().buildFiledAccessor(c, attributeName, gt);
ref.attributes[i] = new VarSquareAttribute2((VarSquareAttribute) attrs[i], attributeName, aa);
} catch (BeetlException ex) {
ex.pushToken(attr.token);
throw ex;
}
}
}
}
} else if (attr.getClass() == VarVirtualAttribute.class) {
// 对虚拟属性~size做优化
if (attr.token.text.equals("size")) {
// 优化
Class c = attr.type.cls;
if (Map.class.isAssignableFrom(c)) {
ref.attributes[i] = new MapSizeVirtualAttribute((VarVirtualAttribute) attr);
} else if (Collection.class.isAssignableFrom(c)) {
ref.attributes[i] = new CollectionSizeVirtualAttribute((VarVirtualAttribute) attr);
} else if (c.isArray()) {
ref.attributes[i] = new ArraySizeVirtualAttribute((VarVirtualAttribute) attr);
}
}
}
}
}
return null;
}
use of org.beetl.core.statement.Expression in project beetl2.0 by javamonkey.
the class AntlrProgramBuilder method parseVarAttribute.
protected VarAttribute[] parseVarAttribute(List<VarAttributeContext> list) {
List<VarAttribute> listVarAttr = new ArrayList<VarAttribute>();
for (VarAttributeContext vac : list) {
if (vac instanceof VarAttributeGeneralContext) {
VarAttributeGeneralContext zf = (VarAttributeGeneralContext) vac;
VarAttribute attr = new VarAttribute(this.getBTToken(zf.Identifier().getSymbol()));
listVarAttr.add(attr);
attr.setAA(ObjectAA.defaultObjectAA());
} else if (vac instanceof VarAttributeArrayOrMapContext) {
VarAttributeArrayOrMapContext zf = (VarAttributeArrayOrMapContext) vac;
Expression exp = this.parseExpress(zf.expression());
VarSquareAttribute attr = new VarSquareAttribute(exp, this.getBTToken("[]", exp.token.line));
attr.setAA(ObjectAA.defaultObjectAA());
listVarAttr.add(attr);
} else if (vac instanceof VarAttributeVirtualContext) {
VarAttributeVirtualContext zf = (VarAttributeVirtualContext) vac;
VarVirtualAttribute attr = new VarVirtualAttribute(this.getBTToken(zf.Identifier().getSymbol()));
listVarAttr.add(attr);
}
}
return listVarAttr.toArray(new VarAttribute[0]);
}
Aggregations