use of com.googlecode.aviator.code.CodeGenerator in project aviatorscript by killme2008.
the class AviatorEvaluatorInstance method validate.
/**
* Validate a script text whether is a legal aviatorscript text, throw exception if not.
*
* @since 5.0.2
* @param script the script text
*/
public void validate(final String script) {
if (script == null || script.trim().length() == 0) {
throw new CompileExpressionErrorException("Blank script");
}
ExpressionLexer lexer = new ExpressionLexer(this, script);
CodeGenerator codeGenerator = new NoneCodeGenerator();
ExpressionParser parser = new ExpressionParser(this, lexer, codeGenerator);
parser.parse();
}
use of com.googlecode.aviator.code.CodeGenerator in project aviatorscript by killme2008.
the class ASMCodeGeneratorUnitTest method testOnLambdaDefine.
@Test
public void testOnLambdaDefine() throws Exception {
this.codeGenerator.setParser(new Parser() {
@Override
public void setCodeGenerator(final CodeGenerator codeGenerator) {
}
@Override
public void restoreScope(final ScopeInfo info) {
}
@Override
public SymbolTable getSymbolTable() {
return null;
}
@Override
public CodeGenerator getCodeGenerator() {
return ASMCodeGeneratorUnitTest.this.codeGenerator;
}
@Override
public ScopeInfo enterScope(final boolean inForLoop) {
return null;
}
});
assertNull(this.codeGenerator.getLambdaGenerator());
this.codeGenerator.onLambdaDefineStart(new Variable("lambda", 0, 0));
LambdaGenerator lambdaGenerator = this.codeGenerator.getLambdaGenerator();
assertNotNull(lambdaGenerator);
this.codeGenerator.onLambdaArgument(new Variable("x", 0, 1), new FunctionParam(0, "x", false));
this.codeGenerator.onLambdaArgument(new Variable("y", 0, 2), new FunctionParam(1, "y", false));
this.codeGenerator.onLambdaBodyStart(new Variable(">", 0, 3));
lambdaGenerator.onConstant(new Variable("x", 0, 4));
lambdaGenerator.onConstant(new Variable("y", 0, 5));
lambdaGenerator.onAdd(null);
this.codeGenerator.onLambdaBodyEnd(new Variable("end", 0, 7));
HashMap<String, Object> env = new HashMap<String, Object>();
env.put("x", 2);
env.put("y", 3);
Object result = eval(env);
assertTrue(result instanceof LambdaFunction);
assertEquals(5, ((LambdaFunction) result).call(env, new AviatorJavaType("x"), new AviatorJavaType("y")).getValue(env));
assertNull(this.codeGenerator.getLambdaGenerator());
}
use of com.googlecode.aviator.code.CodeGenerator in project aviatorscript by killme2008.
the class ExpressionParser method ternary.
public boolean ternary() {
int gcTimes = this.getCGTimes;
if (this.lookhead == Variable.NEW) {
newStatement();
return true;
}
join();
if (this.lookhead == null || expectChar(':') || expectChar(',')) {
return gcTimes < this.getCGTimes;
}
Token<?> opToken = this.lookhead;
if (expectChar('?')) {
move(true);
CodeGenerator cg = getCodeGeneratorWithTimes();
cg.onTernaryBoolean(opToken);
if (!ternary()) {
reportSyntaxError("invalid token for ternary operator");
}
if (expectChar(':')) {
move(true);
cg.onTernaryLeft(this.lookhead);
if (!ternary()) {
reportSyntaxError("invalid token for ternary operator");
}
cg.onTernaryRight(this.lookhead);
} else {
reportSyntaxError("expect ':'");
}
}
return gcTimes < this.getCGTimes;
}
use of com.googlecode.aviator.code.CodeGenerator in project aviatorscript by killme2008.
the class ExpressionParser method returnStatement.
/**
* Call __reducer_return(result)
*/
public void returnStatement() {
move(true);
CodeGenerator cg = getCodeGeneratorWithTimes();
cg.onTernaryEnd(this.lookhead);
if (expectChar(';')) {
// 'return;' => 'return nil;'
if (this.scope.newLexicalScope) {
cg.onMethodName(Constants.ReducerReturnFn);
cg.onConstant(Variable.NIL);
cg.onMethodParameter(this.lookhead);
cg.onMethodInvoke(this.lookhead);
} else {
cg.onConstant(Variable.NIL);
}
move(true);
return;
} else {
if (this.scope.newLexicalScope) {
cg.onMethodName(Constants.ReducerReturnFn);
if (!ternary()) {
reportSyntaxError("invalid value for return, missing ';'?");
}
cg.onMethodParameter(this.lookhead);
cg.onMethodInvoke(this.lookhead);
} else {
if (!ternary()) {
reportSyntaxError("invalid value for return, missing ';'?");
}
}
}
if (!expectChar(';')) {
reportSyntaxError("missing ';' for return statement");
}
move(true);
}
use of com.googlecode.aviator.code.CodeGenerator in project aviatorscript by killme2008.
the class AviatorEvaluatorInstance method innerCompile.
private Expression innerCompile(final String expression, final String sourceFile, final boolean cached) {
ExpressionLexer lexer = new ExpressionLexer(this, expression);
CodeGenerator codeGenerator = newCodeGenerator(sourceFile, cached);
ExpressionParser parser = new ExpressionParser(this, lexer, codeGenerator);
Expression exp = parser.parse();
if (getOptionValue(Options.TRACE_EVAL).bool) {
((BaseExpression) exp).setExpression(expression);
}
return exp;
}
Aggregations