use of org.beetl.core.statement.BlockStatement in project beetl2.0 by javamonkey.
the class AntlrProgramBuilder method parseBlock.
protected BlockStatement parseBlock(List list, ParserRuleContext ctx) {
pbCtx.enterBlock();
ASTNode[] statements = new ASTNode[list.size()];
List<Statement> nodes = new ArrayList<Statement>();
boolean hasGoto = false;
for (int i = 0; i < statements.length; i++) {
nodes.add(parseStatment((ParserRuleContext) list.get(i)));
}
BlockStatement block = new BlockStatement(nodes.toArray(new Statement[0]), this.getBTToken(ctx.getStart()));
this.checkGoto(block);
pbCtx.exitBlock();
return block;
}
use of org.beetl.core.statement.BlockStatement in project beetl2.0 by javamonkey.
the class AntlrProgramBuilder method parseTryCatch.
protected TryCatchStatement parseTryCatch(TryStContext tryStCtx) {
BlockContext tryBlockCtx = tryStCtx.block(0);
BlockStatement tryPart = (BlockStatement) this.parseBlock(tryBlockCtx.statement(), tryBlockCtx);
BlockStatement catchPart = null;
VarDefineNode errorNode = null;
if (tryStCtx.Catch() != null) {
this.pbCtx.enterBlock();
if (tryStCtx.Identifier() != null) {
Token errorToken = tryStCtx.Identifier().getSymbol();
errorNode = new VarDefineNode(this.getBTToken(errorToken));
this.pbCtx.addVarAndPostion(errorNode);
}
BlockContext catchBlockCtx = tryStCtx.block(1);
catchPart = (BlockStatement) this.parseBlock(catchBlockCtx.statement(), catchBlockCtx);
this.pbCtx.exitBlock();
}
TryCatchStatement statement = new TryCatchStatement(tryPart, catchPart, errorNode, this.getBTToken(tryStCtx.Try().getSymbol()));
return statement;
}
use of org.beetl.core.statement.BlockStatement 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;
}
use of org.beetl.core.statement.BlockStatement in project beetl2.0 by javamonkey.
the class AntlrProgramBuilder method parseAjax.
protected AjaxStatement parseAjax(AjaxStContext ajaxCtx) {
GrammarToken token = null;
String flag = "render";
List<TerminalNode> nodes = ajaxCtx.Identifier();
if (nodes.size() == 1) {
token = this.getBTToken(nodes.get(0).getSymbol());
} else {
token = this.getBTToken(nodes.get(1).getSymbol());
flag = nodes.get(0).getSymbol().getText();
if (!(flag.equals("render") || flag.equals("norender"))) {
BeetlException be = new BeetlException(BeetlException.AJAX_PROPERTY_ERROR, "expect render or norender ,but " + flag);
be.pushToken(token);
throw be;
}
}
BlockContext blockCtx = ajaxCtx.block();
BlockStatement block = (BlockStatement) this.parseBlock(blockCtx.statement(), blockCtx);
AjaxStatement ajaxStat = new AjaxStatement(block, token, flag.equals("render"));
if (this.data.ajaxs == null) {
this.data.ajaxs = new HashMap<String, AjaxStatement>();
}
String anchor = ajaxStat.token.text;
if (this.data.ajaxs.containsKey(anchor)) {
GrammarToken lastToken = this.data.ajaxs.get(anchor).token;
BeetlException ex = new BeetlException(BeetlException.AJAX_ALREADY_DEFINED, "已经在第" + lastToken.line + "行定义");
ex.pushToken(token);
throw ex;
}
this.data.ajaxs.put(anchor, ajaxStat);
return ajaxStat;
}
use of org.beetl.core.statement.BlockStatement in project beetl2.0 by javamonkey.
the class AntlrProgramBuilder method parseSwitch.
protected SwitchStatement parseSwitch(SiwchStContext sctx) {
// this.pbCtx.enterBlock();
// this.pbCtx.current.canStopContinueBreakFlag = true;
ExpressionContext ect = sctx.parExpression().expression();
Expression exp = this.parseExpress(ect);
List<SwitchBlockStatementGroupContext> list = sctx.switchBlock().switchBlockStatementGroup();
LinkedHashMap<Expression, BlockStatement> condtionsStatementsMap = new LinkedHashMap<Expression, BlockStatement>();
List<Expression> conditionList = new ArrayList<Expression>();
BlockStatement defaultBlock = null;
for (SwitchBlockStatementGroupContext group : list) {
List<SwitchLabelContext> labels = group.switchLabel();
List<StatementContext> stats = group.statement();
BlockStatement block = stats != null ? this.parseBlock(stats, group) : null;
for (SwitchLabelContext label : labels) {
Expression caseExp = this.parseExpress(label.expression());
if (caseExp == null) {
// default
defaultBlock = block;
break;
} else {
conditionList.add(caseExp);
condtionsStatementsMap.put(caseExp, block);
}
}
}
SwitchStatement switchStat = new SwitchStatement(exp, condtionsStatementsMap, defaultBlock, this.getBTToken(sctx.getStart()));
return switchStat;
}
Aggregations