use of org.beetl.core.parser.BeetlParser.ExpressionContext 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;
}
use of org.beetl.core.parser.BeetlParser.ExpressionContext in project beetl2.0 by javamonkey.
the class AntlrProgramBuilder method parseJson.
protected Expression parseJson(JsonContext ctx) {
if (ctx.LEFT_SQBR() != null) {
// array
JsonArrayExpression json = null;
List<ExpressionContext> listCtx = ctx.expression();
if (listCtx.size() == 0) {
json = new JsonArrayExpression(Collections.EMPTY_LIST, this.getBTToken(ctx.LEFT_SQBR().getSymbol()));
} else {
List<Expression> list = new ArrayList<Expression>(listCtx.size());
for (ExpressionContext expCtx : listCtx) {
list.add(this.parseExpress(expCtx));
}
json = new JsonArrayExpression(list, this.getBTToken(ctx.LEFT_SQBR().getSymbol()));
}
return json;
} else {
// map
JsonMapExpression json = null;
List<JsonKeyValueContext> listCtx = ctx.jsonKeyValue();
if (listCtx.size() == 0) {
json = new JsonMapExpression(Collections.EMPTY_MAP, this.getBTToken(ctx.LEFT_BRACE().getSymbol()));
} else {
Map<String, Expression> map = new LinkedHashMap<String, Expression>(listCtx.size());
for (JsonKeyValueContext kvCtx : listCtx) {
String key = null;
if (kvCtx.StringLiteral() != null) {
key = this.getStringValue(kvCtx.StringLiteral().getText());
} else {
key = kvCtx.Identifier().getSymbol().getText();
}
Expression exp = this.parseExpress(kvCtx.expression());
map.put(key, exp);
}
json = new JsonMapExpression(map, this.getBTToken(ctx.LEFT_BRACE().getSymbol()));
}
return json;
}
}
use of org.beetl.core.parser.BeetlParser.ExpressionContext in project beetl2.0 by javamonkey.
the class AntlrProgramBuilder method parseForSt.
protected Statement parseForSt(ForStContext ctx) {
pbCtx.enterBlock();
// break,continue语句到此为止
pbCtx.current.canStopContinueBreakFlag = true;
StatementContext forContext = ctx.statement(0);
StatementContext elseContext = null;
ForControlContext forTypeCtx = ctx.forControl();
if (forTypeCtx.forInControl() != null) {
// for(a in list)...
ForInControlContext forCtx = forTypeCtx.forInControl();
VarDefineNode forVar = new VarDefineNode(this.getBTToken(forCtx.Identifier().getSymbol()));
if (pbCtx.hasDefined(forVar.token.text) != null) {
GrammarToken token = pbCtx.hasDefined(forVar.token.text);
BeetlException ex = new BeetlException(BeetlException.VAR_ALREADY_DEFINED, "已经在第" + token.line + "行定义");
ex.pushToken(forVar.token);
throw ex;
}
VarDefineNode loopStatusVar = new VarDefineNode(new org.beetl.core.statement.GrammarToken(forCtx.Identifier().getSymbol().getText() + "LP", forCtx.Identifier().getSymbol().getLine(), 0));
if (pbCtx.hasDefined(loopStatusVar.token.text) != null) {
GrammarToken token = pbCtx.hasDefined(loopStatusVar.token.text);
BeetlException ex = new BeetlException(BeetlException.VAR_ALREADY_DEFINED, "For循环隐含变量,已经在第" + token.line + "行定义");
ex.pushToken(loopStatusVar.token);
throw ex;
}
pbCtx.addVarAndPostion(forVar);
pbCtx.addVarAndPostion(loopStatusVar);
// //beetl.2 兼容
// VarDefineNode indexVar = new VarDefineNode(new org.beetl.core.statement.GrammarToken(forCtx.Identifier()
// .getSymbol().getText()
// + "_index", forCtx.Identifier().getSymbol().getLine(), 0));
//
// VarDefineNode sizeVar = new VarDefineNode(new org.beetl.core.statement.GrammarToken(forCtx.Identifier()
// .getSymbol().getText()
// + "_size", forCtx.Identifier().getSymbol().getLine(), 0));
//
// pbCtx.addVarAndPostion(indexVar);
//
// pbCtx.addVarAndPostion(sizeVar);
Expression exp = this.parseExpress(forCtx.expression());
Statement forPart = this.parseStatment(forContext);
// elsefor
Statement elseForPart = null;
if (ctx.Elsefor() != null) {
elseContext = ctx.statement(1);
elseForPart = this.parseStatment(elseContext);
}
boolean hasSafe = false;
if (exp instanceof VarRef) {
VarRef varRef = (VarRef) exp;
hasSafe = varRef.hasSafe;
}
if (pbCtx.isSafeOutput) {
hasSafe = true;
}
ForStatement forStatement = new ForStatement(forVar, exp, hasSafe, forPart, elseForPart, forVar.token);
this.checkGoto(forStatement);
pbCtx.exitBlock();
return forStatement;
} else {
GeneralForControlContext forCtx = forTypeCtx.generalForControl();
Expression[] initExp = null;
VarAssignStatementSeq varInitSeq = null;
Expression condtion = null;
Expression[] updateExp = null;
if (forCtx.forInit() != null) {
ForInitContext forInitCtx = forCtx.forInit();
if (forInitCtx.Var() == null) {
// for( a=1,b=3;
List<ExpressionContext> list = forInitCtx.expressionList().expression();
initExp = this.parseExpressionCtxList(list);
} else {
// for( var a=1,b=3;
VarDeclareListContext varDeclare = forInitCtx.varDeclareList();
varInitSeq = this.parseVarDeclareList(varDeclare);
}
}
if (forCtx.expression() != null) {
condtion = this.parseExpress(forCtx.expression());
}
if (forCtx.forUpdate() != null) {
ForUpdateContext updateCtx = forCtx.forUpdate();
List<ExpressionContext> list = updateCtx.expressionList().expression();
updateExp = this.parseExpressionCtxList(list);
}
Statement forPart = this.parseStatment(forContext);
// elsefor
Statement elseForPart = null;
if (ctx.Elsefor() != null) {
elseContext = ctx.statement(1);
elseForPart = this.parseStatment(elseContext);
}
String str = forTypeCtx.getText();
GeneralForStatement forStat = new GeneralForStatement(varInitSeq, initExp, condtion, updateExp, forPart, elseForPart, this.getBTToken(str, forTypeCtx.start.getLine()));
pbCtx.exitBlock();
return forStat;
}
}
use of org.beetl.core.parser.BeetlParser.ExpressionContext 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.parser.BeetlParser.ExpressionContext in project beetl2.0 by javamonkey.
the class AntlrProgramBuilder method parseAssign.
/**
* 定义变量
* @param amc
* @return
*/
protected VarAssignStatement parseAssign(AssignMentContext amc) {
VarAssignStatement vas = null;
if (amc instanceof AssignGeneralInStContext) {
AssignGeneralInStContext agc = (AssignGeneralInStContext) amc;
ExpressionContext expCtx = agc.generalAssignExp().expression();
Expression exp = parseExpress(expCtx);
VarRefContext varRefCtx = agc.generalAssignExp().varRef();
if (varRefCtx.children.size() == 1) {
// var a=1;
Token token = varRefCtx.Identifier().getSymbol();
vas = new VarAssignStatement(exp, getBTToken(token));
} else {
// var a.b=1 since 2.7.0
VarRef ref = this.parseVarRefInLeftExpression(varRefCtx);
vas = new VarRefAssignStatement(exp, ref);
}
return vas;
} else if (amc instanceof AssignIdContext) {
AssignIdContext idCtx = (AssignIdContext) amc;
vas = new VarAssignStatement(Literal.NULLLiteral, getBTToken(idCtx.Identifier().getSymbol()));
return vas;
} else if (amc instanceof AssignTemplateVarContext) {
AssignTemplateVarContext templateVarCtx = (AssignTemplateVarContext) amc;
BlockContext blockCtx = templateVarCtx.block();
BlockStatement block = this.parseBlock(blockCtx.statement(), blockCtx);
ContentBodyExpression bodyExp = new ContentBodyExpression(block, getBTToken(templateVarCtx.Identifier().getSymbol()));
vas = new VarAssignStatement(bodyExp, getBTToken(templateVarCtx.Identifier().getSymbol()));
} else {
throw new RuntimeException("不支持 在 " + amc.start.getLine());
}
return vas;
}
Aggregations