use of org.beetl.core.statement.GrammarToken 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.statement.GrammarToken in project beetl2.0 by javamonkey.
the class AntlrProgramBuilder method parseIncDecOneContext.
protected IncDecExpression parseIncDecOneContext(IncDecOneContext ctx) {
IncDecExpression exp = null;
boolean isInc = ctx.INCREASE() != null;
GrammarToken t = this.getBTToken(ctx.Identifier().getSymbol());
exp = new IncDecExpression(isInc, false, t);
this.pbCtx.setVarPosition(t.text, exp);
return exp;
}
use of org.beetl.core.statement.GrammarToken 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;
}
use of org.beetl.core.statement.GrammarToken in project beetl2.0 by javamonkey.
the class SyntaxErrorListener method syntaxError.
public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, RecognitionException e) {
BeetlException be = new BeetlException(BeetlException.TOKEN_ERROR);
be.token = new GrammarToken(BeetlUtil.reportChineseTokenError(msg), line, charPositionInLine);
throw be;
}
use of org.beetl.core.statement.GrammarToken in project beetl2.0 by javamonkey.
the class LineStatus method transform.
public Reader transform(String str) throws IOException, HTMLTagParserException {
cs = str.toCharArray();
// 找到回车换行符号
findCR();
checkAppendCR();
parser();
if (this.isSupportHtmlTag && this.htmlTagStack.size() != 0) {
String tagName = (String) htmlTagStack.peek();
GrammarToken token = GrammarToken.createToken(tagName, this.totalLineCount + 1);
HTMLTagParserException ex = new HTMLTagParserException("解析html tag 标签出错,未找到匹配结束标签 " + tagName);
ex.pushToken(token);
ex.line = totalLineCount + 1;
this.clear();
throw ex;
}
return new StringReader(sb.toString());
}
Aggregations