if-then-else syntax plus optional brackets

This commit is contained in:
Arndt 2015-02-25 09:32:07 +01:00
parent c3cc1fe8f9
commit 8676f5e081

View file

@ -32,7 +32,14 @@ final class BExpression
// Parse the expression and all subexpression
public static BExpression parse( BExpressionContext ctx, int level ) throws Exception
{
boolean brackets = false;
String operator = ctx.parseToken();
if ( "(".equals( operator ) )
{
brackets = true;
operator = ctx.parseToken();
}
if ( operator == null )
{
if ( level == 0 ) return null;
@ -49,11 +56,17 @@ final class BExpression
BExpression exp = new BExpression();
int nops = 3;
boolean ifThenElse = false;
if ( "switch".equals( operator ) )
{
exp.typ = SWITCH_EXP;
}
else if ( "if".equals( operator ) )
{
exp.typ = SWITCH_EXP;
ifThenElse = true;
}
else
{
nops = 2; // check binary expressions
@ -148,12 +161,36 @@ final class BExpression
}
}
// parse operands
if ( nops > 0 ) exp.op1 = BExpression.parse( ctx, level+1 );
if ( nops > 1 ) exp.op2 = BExpression.parse( ctx, level+1 );
if ( nops > 2 ) exp.op3 = BExpression.parse( ctx, level+1 );
if ( nops > 0 )
{
exp.op1 = BExpression.parse( ctx, level+1 );
}
if ( nops > 1 )
{
if ( ifThenElse ) checkExpectedToken( ctx, "then" );
exp.op2 = BExpression.parse( ctx, level+1 );
}
if ( nops > 2 )
{
if ( ifThenElse ) checkExpectedToken( ctx, "else" );
exp.op3 = BExpression.parse( ctx, level+1 );
}
if ( brackets )
{
checkExpectedToken( ctx, ")" );
}
return exp;
}
private static void checkExpectedToken( BExpressionContext ctx, String expected ) throws Exception
{
String token = ctx.parseToken();
if ( ! expected.equals( token ) )
{
throw new IllegalArgumentException( "unexpected token: " + token + ", expected: " + expected );
}
}
// Evaluate the expression
public float evaluate( BExpressionContext ctx )
{