From b0dedabc9510b1ae96be0e07244dc9e9b2ef52d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E4=BA=91=E6=A2=A6?= <781443857@qq.com> Date: Thu, 1 Sep 2022 18:29:28 +0800 Subject: [PATCH 1/2] Update ExpressionLexer.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 支持对象和数组嵌套型变量,前面不用加 # --- .../aviator/lexer/ExpressionLexer.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/main/java/com/googlecode/aviator/lexer/ExpressionLexer.java b/src/main/java/com/googlecode/aviator/lexer/ExpressionLexer.java index d4208864..2e3d47dc 100644 --- a/src/main/java/com/googlecode/aviator/lexer/ExpressionLexer.java +++ b/src/main/java/com/googlecode/aviator/lexer/ExpressionLexer.java @@ -351,6 +351,37 @@ public Token scan(final boolean analyse) { variable.setQuote(true); return this.symbolTable.reserve(variable); } + // 支持对象和数组嵌套型变量,前面不用加 # + if (Character.isJavaIdentifierStart(this.peek)) { + char oldPeek = peek; + int startIndex = this.iterator.getIndex(); + + StringBuilder sb = new StringBuilder(); + int dots = 0; + int brackets = 0; + + while (Character.isJavaIdentifierPart(this.peek) || this.peek == '.' || this.peek == '[' + || this.peek == ']') { + if(this.peek == '.'){ + dots++; + } + if(this.peek == '[' || this.peek == ']'){ + brackets++; + } + sb.append(this.peek); + nextChar(); + } + String lexeme = sb.toString(); + // 同时出现点号和中括号,是对象和数组混合型变量 + if(dots > 0 && brackets > 0){ + Variable variable = new Variable(lexeme, this.lineNo, startIndex); + variable.setQuote(true); + return this.symbolTable.reserve(variable); + }else{ + this.iterator.setIndex(startIndex); + this.peek = oldPeek; + } + } if (Character.isJavaIdentifierStart(this.peek)) { int startIndex = this.iterator.getIndex(); StringBuilder sb = new StringBuilder(); From 77e70a9b5b239d0ddcd2fc1596c7c3fb24e73350 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E4=BA=91=E6=A2=A6?= <781443857@qq.com> Date: Thu, 1 Sep 2022 18:30:52 +0800 Subject: [PATCH 2/2] Update VariableExample.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 支持对象和数组嵌套型变量,前面不用加 # --- .../com/googlecode/aviator/example/VariableExample.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/test/java/com/googlecode/aviator/example/VariableExample.java b/src/test/java/com/googlecode/aviator/example/VariableExample.java index d656ecc1..540b83c0 100644 --- a/src/test/java/com/googlecode/aviator/example/VariableExample.java +++ b/src/test/java/com/googlecode/aviator/example/VariableExample.java @@ -134,6 +134,13 @@ public static void main(final String[] args) { System.out.println("Execute expression: " + exp); System.out.println("Result: " + result); System.out.println(foo.bars[0].getName()); + + // 不加 # 也可以 + exp = "foo.bars[0].name='hello aviator' ; foo.bars[0].name"; + result = (String) AviatorEvaluator.execute(exp, env); + System.out.println("Execute expression without sharp: " + exp); + System.out.println("Result: " + result); + System.out.println(foo.bars[0].getName()); exp = "foo.bars[0] = nil ; foo.bars[0]"; result = (String) AviatorEvaluator.execute(exp, env);