From 8676f5e081746c669d7c9405157f94d43f6d14d0 Mon Sep 17 00:00:00 2001 From: Arndt Date: Wed, 25 Feb 2015 09:32:07 +0100 Subject: [PATCH] if-then-else syntax plus optional brackets --- .../java/btools/expressions/BExpression.java | 43 +++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/brouter-expressions/src/main/java/btools/expressions/BExpression.java b/brouter-expressions/src/main/java/btools/expressions/BExpression.java index f8b590a..4126a04 100644 --- a/brouter-expressions/src/main/java/btools/expressions/BExpression.java +++ b/brouter-expressions/src/main/java/btools/expressions/BExpression.java @@ -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,11 +161,35 @@ 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 )