This is an automated email from the ASF dual-hosted git repository.

wusheng pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/incubator-skywalking-oal-tool.git


The following commit(s) were added to refs/heads/master by this push:
     new 175fa28  Finish the parser code skeleton.
175fa28 is described below

commit 175fa28c766d478f8c754f052053fd9296bdd595
Author: Wu Sheng <wu.sh...@foxmail.com>
AuthorDate: Thu Aug 2 22:33:12 2018 +0800

    Finish the parser code skeleton.
---
 {oal-syntax => oal-parser}/pom.xml                 |  36 +-
 .../java/org/apache/skywalking/oal/tool/Main.java  |   0
 .../skywalking/oal/tool/parser/AnalysisResult.java |  14 +-
 .../skywalking/oal/tool/parser/OALListener.java    |  51 +++
 .../skywalking/oal/tool/parser/ScriptParser.java   |  66 +++
 .../oal/tool/parser/ScriptParserTest.java          |  43 ++
 .../src/test/resources}/oal_test.oal               |   0
 .../org/apache/skywalking/oal/tool/Main.class      | Bin
 .../oal/tool/parser/AnalysisResult.class           | Bin 0 -> 607 bytes
 .../skywalking/oal/tool/parser/OALListener.class   | Bin 0 -> 2114 bytes
 .../skywalking/oal/tool/parser/ScriptParser.class  | Bin 0 -> 2574 bytes
 .../target/test-classes}/oal_test.oal              |   0
 .../oal/tool/parser/ScriptParserTest.class         | Bin 0 -> 1606 bytes
 oal-syntax/pom.xml                                 |   7 +-
 .../apache/skywalking/oal/tool/grammar/OALLexer.g4 |   5 +-
 .../skywalking/oal/tool/grammar/OALLexer.tokens    |  43 +-
 .../skywalking/oal/tool/grammar/OALParser.g4       |  24 +-
 oal-syntax/target/classes/META-INF/DEPENDENCIES    |   4 -
 .../antlr4 => classes}/OALLexer.tokens             |  59 +--
 .../antlr4 => classes}/OALParser.tokens            |  59 +--
 .../skywalking/oal/tool/grammar/OALLexer.class     | Bin 8453 -> 9682 bytes
 .../skywalking/oal/tool/grammar/OALLexer.interp    | 101 +++++
 .../OALParser$AggregateFunctionContext.class       | Bin 0 -> 2182 bytes
 .../OALParser$AggregationStatementContext.class    | Bin 0 -> 2742 bytes
 .../OALParser$FilterExpressionContext.class        | Bin 0 -> 1282 bytes
 .../grammar/OALParser$FunctionNameContext.class    | Bin 0 -> 1448 bytes
 .../grammar/OALParser$MetricStatementContext.class | Bin 1862 -> 2638 bytes
 .../OALParser$MetricStatementsContext.class        | Bin 1925 -> 0 bytes
 .../oal/tool/grammar/OALParser$RootContext.class   | Bin 1919 -> 1878 bytes
 .../oal/tool/grammar/OALParser$SourceContext.class | Bin 2216 -> 2216 bytes
 .../tool/grammar/OALParser$VariableContext.class   | Bin 0 -> 1423 bytes
 .../skywalking/oal/tool/grammar/OALParser.class    | Bin 8289 -> 12615 bytes
 .../skywalking/oal/tool/grammar/OALParser.interp   |  71 ++++
 .../oal/tool/grammar/OALParserBaseListener.class   | Bin 3010 -> 4535 bytes
 .../oal/tool/grammar/OALParserListener.class       | Bin 1368 -> 2172 bytes
 .../generated-sources/antlr4/OALLexer.tokens       |  59 +--
 .../generated-sources/antlr4/OALParser.tokens      |  59 +--
 .../skywalking/oal/tool/grammar/OALLexer.interp    | 101 +++++
 .../skywalking/oal/tool/grammar/OALLexer.java      | 344 +++++++++-------
 .../skywalking/oal/tool/grammar/OALParser.interp   |  71 ++++
 .../skywalking/oal/tool/grammar/OALParser.java     | 448 +++++++++++++++++----
 .../oal/tool/grammar/OALParserBaseListener.java    |  78 +++-
 .../oal/tool/grammar/OALParserListener.java        |  70 +++-
 oal-syntax/target/maven-archiver/pom.properties    |   4 -
 .../META-INF/DEPENDENCIES                          |   4 -
 .../target/maven-status/antlr4/dependencies.ser    | Bin 0 -> 532 bytes
 .../compile/default-compile/createdFiles.lst       |  13 +-
 .../compile/default-compile/inputFiles.lst         |   1 -
 .../testCompile/default-testCompile/inputFiles.lst |   0
 oal-syntax/target/oal-syntax-1.0-SNAPSHOT.jar      | Bin 23456 -> 0 bytes
 oal-syntax/target/rat.txt                          |  32 --
 .../target/test-classes/META-INF/DEPENDENCIES      |  37 --
 oal-syntax/target/test-classes/META-INF/LICENSE    | 202 ----------
 oal-syntax/target/test-classes/META-INF/NOTICE     |   8 -
 pom.xml                                            |   1 +
 target/rat.txt                                     |  30 --
 56 files changed, 1373 insertions(+), 772 deletions(-)

diff --git a/oal-syntax/pom.xml b/oal-parser/pom.xml
similarity index 67%
copy from oal-syntax/pom.xml
copy to oal-parser/pom.xml
index 7d847bb..9c572dc 100644
--- a/oal-syntax/pom.xml
+++ b/oal-parser/pom.xml
@@ -27,37 +27,23 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>oal-syntax</artifactId>
-    <packaging>jar</packaging>
+    <artifactId>oal-parser</artifactId>
 
     <dependencies>
         <dependency>
-            <groupId>org.antlr</groupId>
-            <artifactId>antlr4</artifactId>
-            <version>4.7.1</version>
-        </dependency>
-        <dependency>
             <groupId>commons-cli</groupId>
             <artifactId>commons-cli</artifactId>
             <version>1.4</version>
         </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.skywalking</groupId>
+            <artifactId>oal-syntax</artifactId>
+            <version>${project.version}</version>
+        </dependency>
     </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.antlr</groupId>
-                <artifactId>antlr4-maven-plugin</artifactId>
-                <version>4.3</version>
-                <executions>
-                    <execution>
-                        <id>antlr</id>
-                        <goals>
-                            <goal>antlr4</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
 </project>
\ No newline at end of file
diff --git a/oal-syntax/src/main/java/org/apache/skywalking/oal/tool/Main.java 
b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/Main.java
similarity index 100%
rename from oal-syntax/src/main/java/org/apache/skywalking/oal/tool/Main.java
rename to oal-parser/src/main/java/org/apache/skywalking/oal/tool/Main.java
diff --git a/oal-syntax/target/test-classes/oal_test.oal 
b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/AnalysisResult.java
similarity index 76%
copy from oal-syntax/target/test-classes/oal_test.oal
copy to 
oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/AnalysisResult.java
index 525d14d..05e3d38 100644
--- a/oal-syntax/target/test-classes/oal_test.oal
+++ 
b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/AnalysisResult.java
@@ -14,4 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  *
- */
\ No newline at end of file
+ */
+
+package org.apache.skywalking.oal.tool.parser;
+
+import lombok.AccessLevel;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter(AccessLevel.PACKAGE)
+@Setter(AccessLevel.PUBLIC)
+public class AnalysisResult {
+    private String metricName;
+}
diff --git 
a/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/OALListener.java
 
b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/OALListener.java
new file mode 100644
index 0000000..d896333
--- /dev/null
+++ 
b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/OALListener.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.oal.tool.parser;
+
+import java.util.List;
+import org.antlr.v4.runtime.misc.NotNull;
+import org.apache.skywalking.oal.tool.grammar.OALParser;
+import org.apache.skywalking.oal.tool.grammar.OALParserBaseListener;
+
+public class OALListener extends OALParserBaseListener {
+    private List<AnalysisResult> results;
+    private AnalysisResult current;
+
+    public OALListener(List<AnalysisResult> results) {
+        this.results = results;
+    }
+
+    @Override
+    public void enterAggregationStatement(@NotNull 
OALParser.AggregationStatementContext ctx) {
+        current = new AnalysisResult();
+    }
+
+    @Override
+    public void exitAggregationStatement(@NotNull 
OALParser.AggregationStatementContext ctx) {
+        results.add(current);
+        current = null;
+    }
+
+    @Override public void enterVariable(OALParser.VariableContext ctx) {
+    }
+
+    @Override public void exitVariable(OALParser.VariableContext ctx) {
+        current.setMetricName(ctx.getText());
+    }
+}
diff --git 
a/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/ScriptParser.java
 
b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/ScriptParser.java
new file mode 100644
index 0000000..7d9b56e
--- /dev/null
+++ 
b/oal-parser/src/main/java/org/apache/skywalking/oal/tool/parser/ScriptParser.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.oal.tool.parser;
+
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+import org.antlr.v4.runtime.CharStreams;
+import org.antlr.v4.runtime.CommonTokenStream;
+import org.antlr.v4.runtime.tree.ParseTree;
+import org.antlr.v4.runtime.tree.ParseTreeWalker;
+import org.apache.skywalking.oal.tool.grammar.OALLexer;
+import org.apache.skywalking.oal.tool.grammar.OALParser;
+
+public class ScriptParser {
+    private OALLexer lexer;
+
+    private ScriptParser() {
+
+    }
+
+    public static ScriptParser createFromFile(String scriptFilepath) throws 
IOException {
+        ScriptParser parser = new ScriptParser();
+        parser.lexer = new OALLexer(CharStreams.fromFileName(scriptFilepath));
+        return parser;
+    }
+
+    public static ScriptParser createFromScriptText(String script) throws 
IOException {
+        ScriptParser parser = new ScriptParser();
+        parser.lexer = new OALLexer(CharStreams.fromString(script));
+        return parser;
+    }
+
+    public List<AnalysisResult> parse() throws IOException {
+        List<AnalysisResult> results = new LinkedList<>();
+        CommonTokenStream tokens = new CommonTokenStream(lexer);
+
+        OALParser parser = new OALParser(tokens);
+
+        ParseTree tree = parser.root();
+        ParseTreeWalker walker = new ParseTreeWalker();
+
+        walker.walk(new OALListener(results), tree);
+
+        return results;
+    }
+
+    public void close() {
+    }
+}
diff --git 
a/oal-parser/src/test/java/org/apache/skywalking/oal/tool/parser/ScriptParserTest.java
 
b/oal-parser/src/test/java/org/apache/skywalking/oal/tool/parser/ScriptParserTest.java
new file mode 100644
index 0000000..83e6baf
--- /dev/null
+++ 
b/oal-parser/src/test/java/org/apache/skywalking/oal/tool/parser/ScriptParserTest.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.skywalking.oal.tool.parser;
+
+import java.io.IOException;
+import java.util.List;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ScriptParserTest {
+    @Test
+    public void testParse() throws IOException {
+        ScriptParser parser = ScriptParser.createFromScriptText(
+            "Endpoint_avg = from(Endpoint.latency).avg(); //comment test" + 
"\n" +
+                "Service_avg = from(Endpoint.latency).avg()"
+        );
+        List<AnalysisResult> results = parser.parse();
+
+        Assert.assertEquals(2, results.size());
+
+        AnalysisResult endpointAvg = results.get(0);
+        Assert.assertEquals("Endpoint_avg", endpointAvg.getMetricName());
+
+        AnalysisResult serviceAvg = results.get(1);
+        Assert.assertEquals("Service_avg", serviceAvg.getMetricName());
+    }
+}
diff --git a/oal-syntax/target/test-classes/oal_test.oal 
b/oal-parser/src/test/resources/oal_test.oal
similarity index 100%
rename from oal-syntax/target/test-classes/oal_test.oal
rename to oal-parser/src/test/resources/oal_test.oal
diff --git 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/Main.class 
b/oal-parser/target/classes/org/apache/skywalking/oal/tool/Main.class
similarity index 100%
rename from oal-syntax/target/classes/org/apache/skywalking/oal/tool/Main.class
rename to oal-parser/target/classes/org/apache/skywalking/oal/tool/Main.class
diff --git 
a/oal-parser/target/classes/org/apache/skywalking/oal/tool/parser/AnalysisResult.class
 
b/oal-parser/target/classes/org/apache/skywalking/oal/tool/parser/AnalysisResult.class
new file mode 100644
index 0000000..2c4d1d3
Binary files /dev/null and 
b/oal-parser/target/classes/org/apache/skywalking/oal/tool/parser/AnalysisResult.class
 differ
diff --git 
a/oal-parser/target/classes/org/apache/skywalking/oal/tool/parser/OALListener.class
 
b/oal-parser/target/classes/org/apache/skywalking/oal/tool/parser/OALListener.class
new file mode 100644
index 0000000..573b463
Binary files /dev/null and 
b/oal-parser/target/classes/org/apache/skywalking/oal/tool/parser/OALListener.class
 differ
diff --git 
a/oal-parser/target/classes/org/apache/skywalking/oal/tool/parser/ScriptParser.class
 
b/oal-parser/target/classes/org/apache/skywalking/oal/tool/parser/ScriptParser.class
new file mode 100644
index 0000000..cb40261
Binary files /dev/null and 
b/oal-parser/target/classes/org/apache/skywalking/oal/tool/parser/ScriptParser.class
 differ
diff --git a/oal-syntax/src/test/resources/oal_test.oal 
b/oal-parser/target/test-classes/oal_test.oal
similarity index 100%
rename from oal-syntax/src/test/resources/oal_test.oal
rename to oal-parser/target/test-classes/oal_test.oal
diff --git 
a/oal-parser/target/test-classes/org/apache/skywalking/oal/tool/parser/ScriptParserTest.class
 
b/oal-parser/target/test-classes/org/apache/skywalking/oal/tool/parser/ScriptParserTest.class
new file mode 100644
index 0000000..f5a0b37
Binary files /dev/null and 
b/oal-parser/target/test-classes/org/apache/skywalking/oal/tool/parser/ScriptParserTest.class
 differ
diff --git a/oal-syntax/pom.xml b/oal-syntax/pom.xml
index 7d847bb..734f5fa 100644
--- a/oal-syntax/pom.xml
+++ b/oal-syntax/pom.xml
@@ -36,11 +36,6 @@
             <artifactId>antlr4</artifactId>
             <version>4.7.1</version>
         </dependency>
-        <dependency>
-            <groupId>commons-cli</groupId>
-            <artifactId>commons-cli</artifactId>
-            <version>1.4</version>
-        </dependency>
     </dependencies>
 
     <build>
@@ -48,7 +43,7 @@
             <plugin>
                 <groupId>org.antlr</groupId>
                 <artifactId>antlr4-maven-plugin</artifactId>
-                <version>4.3</version>
+                <version>4.7.1</version>
                 <executions>
                     <execution>
                         <id>antlr</id>
diff --git 
a/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.g4 
b/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.g4
index 9345bc9..c7811d1 100644
--- 
a/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.g4
+++ 
b/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.g4
@@ -59,6 +59,8 @@ LineComment
       -> channel(HIDDEN)
     ;
 
+SPACE:                               [ \t\r\n]+    -> channel(HIDDEN);
+
 // Identifiers
 
 IDENTIFIER:         Letter LetterOrDigit*;
@@ -100,4 +102,5 @@ DOT:                                 '.';
 LR_BRACKET:                          '(';
 RR_BRACKET:                          ')';
 COMMA:                               ',';
-SEMI:                                ';';
\ No newline at end of file
+SEMI:                                ';';
+EQUAL:                               '=';
\ No newline at end of file
diff --git 
a/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.tokens
 
b/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.tokens
index f6a4c1b..10c3842 100644
--- 
a/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.tokens
+++ 
b/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.tokens
@@ -1,21 +1,3 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
 FROM=1
 FILTER=2
 SRC_ALL=3
@@ -34,12 +16,14 @@ CHAR_LITERAL=15
 STRING_LITERAL=16
 DelimitedComment=17
 LineComment=18
-IDENTIFIER=19
-DOT=20
-LR_BRACKET=21
-RR_BRACKET=22
-COMMA=23
-SEMI=24
+SPACE=19
+IDENTIFIER=20
+DOT=21
+LR_BRACKET=22
+RR_BRACKET=23
+COMMA=24
+SEMI=25
+EQUAL=26
 'from'=1
 'filter'=2
 'All'=3
@@ -50,8 +34,9 @@ SEMI=24
 'ServiceInstanceRelation'=8
 'EndpointRelation'=9
 'ServiceInstance_JVM_Memory_Pool'=12
-'.'=20
-'('=21
-')'=22
-','=23
-';'=24
+'.'=21
+'('=22
+')'=23
+','=24
+';'=25
+'='=26
diff --git 
a/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.g4
 
b/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.g4
index 65fdff1..3c49751 100644
--- 
a/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.g4
+++ 
b/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.g4
@@ -26,19 +26,35 @@ options { tokenVocab=OALLexer; }
 // Top Level Description
 
 root
-    : metricStatements? DelimitedComment ? LineComment ? EOF
+    : (aggregationStatement)*
     ;
 
-metricStatements
-    : metricStatement*
+aggregationStatement
+    : variable (SPACE)? EQUAL (SPACE)? metricStatement DelimitedComment? 
LineComment? (SEMI|EOF)
     ;
 
 metricStatement
-    : FROM '(' source  '.' IDENTIFIER ')'
+    : FROM LR_BRACKET source  DOT IDENTIFIER RR_BRACKET DOT aggregateFunction
     ;
 
 source
     : SRC_ALL | SRC_SERVICE | SRC_SERVICE_INSTANCE | SRC_ENDPOINT |
       SRC_SERVICE_RELATION | SRC_SERVICE_INSTANCE_RELATION | 
SRC_ENDPOINT_RELATION |
       SRC_SERVICE_INSTANCE_JVM_CPU | SRC_SERVICE_INSTANCE_JVM_MEMORY | 
SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL // JVM source of service instance
+    ;
+
+variable
+    : IDENTIFIER
+    ;
+
+aggregateFunction
+    : functionName LR_BRACKET (filterExpression)? RR_BRACKET
+    ;
+
+functionName
+    : IDENTIFIER
+    ;
+
+filterExpression
+    :
     ;
\ No newline at end of file
diff --git a/oal-syntax/target/classes/META-INF/DEPENDENCIES 
b/oal-syntax/target/classes/META-INF/DEPENDENCIES
index d7e502c..2764812 100644
--- a/oal-syntax/target/classes/META-INF/DEPENDENCIES
+++ b/oal-syntax/target/classes/META-INF/DEPENDENCIES
@@ -28,10 +28,6 @@ From: 'Oracle' (http://www.oracle.com)
   - JSR 353 (JSON Processing) Default Provider (http://jsonp.java.net) 
org.glassfish:javax.json:bundle:1.0.4
     License: Dual license consisting of the CDDL v1.1 and GPL v2  
(https://glassfish.java.net/public/CDDL+GPL_1_1.html)
 
-From: 'The Apache Software Foundation' (https://www.apache.org/)
-  - Apache Commons CLI (http://commons.apache.org/proper/commons-cli/) 
commons-cli:commons-cli:jar:1.4
-    License: Apache License, Version 2.0  
(https://www.apache.org/licenses/LICENSE-2.0.txt)
-
 
 
 
diff --git a/oal-syntax/target/generated-sources/antlr4/OALLexer.tokens 
b/oal-syntax/target/classes/OALLexer.tokens
similarity index 81%
copy from oal-syntax/target/generated-sources/antlr4/OALLexer.tokens
copy to oal-syntax/target/classes/OALLexer.tokens
index 19d4b02..10c3842 100644
--- a/oal-syntax/target/generated-sources/antlr4/OALLexer.tokens
+++ b/oal-syntax/target/classes/OALLexer.tokens
@@ -1,39 +1,42 @@
-COMMA=23
+FROM=1
 FILTER=2
 SRC_ALL=3
-DOT=20
-SEMI=24
-SRC_SERVICE_INSTANCE=5
-SRC_SERVICE_INSTANCE_JVM_MEMORY=11
-LineComment=18
-LR_BRACKET=21
-FROM=1
-SRC_SERVICE_INSTANCE_JVM_CPU=10
-DelimitedComment=17
 SRC_SERVICE=4
+SRC_SERVICE_INSTANCE=5
+SRC_ENDPOINT=6
 SRC_SERVICE_RELATION=7
-BOOL_LITERAL=14
+SRC_SERVICE_INSTANCE_RELATION=8
 SRC_ENDPOINT_RELATION=9
+SRC_SERVICE_INSTANCE_JVM_CPU=10
+SRC_SERVICE_INSTANCE_JVM_MEMORY=11
 SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL=12
-SRC_ENDPOINT=6
-RR_BRACKET=22
-SRC_SERVICE_INSTANCE_RELATION=8
-STRING_LITERAL=16
-CHAR_LITERAL=15
-IDENTIFIER=19
 DECIMAL_LITERAL=13
-'.'=20
-','=23
-'Service'=4
-')'=22
-'('=21
-'ServiceInstanceRelation'=8
-'ServiceInstance_JVM_Memory_Pool'=12
+BOOL_LITERAL=14
+CHAR_LITERAL=15
+STRING_LITERAL=16
+DelimitedComment=17
+LineComment=18
+SPACE=19
+IDENTIFIER=20
+DOT=21
+LR_BRACKET=22
+RR_BRACKET=23
+COMMA=24
+SEMI=25
+EQUAL=26
 'from'=1
+'filter'=2
 'All'=3
-'EndpointRelation'=9
-';'=24
+'Service'=4
+'ServiceInstance'=5
 'Endpoint'=6
-'filter'=2
 'ServiceRelation'=7
-'ServiceInstance'=5
+'ServiceInstanceRelation'=8
+'EndpointRelation'=9
+'ServiceInstance_JVM_Memory_Pool'=12
+'.'=21
+'('=22
+')'=23
+','=24
+';'=25
+'='=26
diff --git a/oal-syntax/target/generated-sources/antlr4/OALParser.tokens 
b/oal-syntax/target/classes/OALParser.tokens
similarity index 81%
copy from oal-syntax/target/generated-sources/antlr4/OALParser.tokens
copy to oal-syntax/target/classes/OALParser.tokens
index 19d4b02..10c3842 100644
--- a/oal-syntax/target/generated-sources/antlr4/OALParser.tokens
+++ b/oal-syntax/target/classes/OALParser.tokens
@@ -1,39 +1,42 @@
-COMMA=23
+FROM=1
 FILTER=2
 SRC_ALL=3
-DOT=20
-SEMI=24
-SRC_SERVICE_INSTANCE=5
-SRC_SERVICE_INSTANCE_JVM_MEMORY=11
-LineComment=18
-LR_BRACKET=21
-FROM=1
-SRC_SERVICE_INSTANCE_JVM_CPU=10
-DelimitedComment=17
 SRC_SERVICE=4
+SRC_SERVICE_INSTANCE=5
+SRC_ENDPOINT=6
 SRC_SERVICE_RELATION=7
-BOOL_LITERAL=14
+SRC_SERVICE_INSTANCE_RELATION=8
 SRC_ENDPOINT_RELATION=9
+SRC_SERVICE_INSTANCE_JVM_CPU=10
+SRC_SERVICE_INSTANCE_JVM_MEMORY=11
 SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL=12
-SRC_ENDPOINT=6
-RR_BRACKET=22
-SRC_SERVICE_INSTANCE_RELATION=8
-STRING_LITERAL=16
-CHAR_LITERAL=15
-IDENTIFIER=19
 DECIMAL_LITERAL=13
-'.'=20
-','=23
-'Service'=4
-')'=22
-'('=21
-'ServiceInstanceRelation'=8
-'ServiceInstance_JVM_Memory_Pool'=12
+BOOL_LITERAL=14
+CHAR_LITERAL=15
+STRING_LITERAL=16
+DelimitedComment=17
+LineComment=18
+SPACE=19
+IDENTIFIER=20
+DOT=21
+LR_BRACKET=22
+RR_BRACKET=23
+COMMA=24
+SEMI=25
+EQUAL=26
 'from'=1
+'filter'=2
 'All'=3
-'EndpointRelation'=9
-';'=24
+'Service'=4
+'ServiceInstance'=5
 'Endpoint'=6
-'filter'=2
 'ServiceRelation'=7
-'ServiceInstance'=5
+'ServiceInstanceRelation'=8
+'EndpointRelation'=9
+'ServiceInstance_JVM_Memory_Pool'=12
+'.'=21
+'('=22
+')'=23
+','=24
+';'=25
+'='=26
diff --git 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALLexer.class
 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALLexer.class
index f9557cc..111519e 100644
Binary files 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALLexer.class
 and 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALLexer.class
 differ
diff --git 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALLexer.interp
 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALLexer.interp
new file mode 100644
index 0000000..6444ad4
--- /dev/null
+++ 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALLexer.interp
@@ -0,0 +1,101 @@
+token literal names:
+null
+'from'
+'filter'
+'All'
+'Service'
+'ServiceInstance'
+'Endpoint'
+'ServiceRelation'
+'ServiceInstanceRelation'
+'EndpointRelation'
+null
+null
+'ServiceInstance_JVM_Memory_Pool'
+null
+null
+null
+null
+null
+null
+null
+null
+'.'
+'('
+')'
+','
+';'
+'='
+
+token symbolic names:
+null
+FROM
+FILTER
+SRC_ALL
+SRC_SERVICE
+SRC_SERVICE_INSTANCE
+SRC_ENDPOINT
+SRC_SERVICE_RELATION
+SRC_SERVICE_INSTANCE_RELATION
+SRC_ENDPOINT_RELATION
+SRC_SERVICE_INSTANCE_JVM_CPU
+SRC_SERVICE_INSTANCE_JVM_MEMORY
+SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL
+DECIMAL_LITERAL
+BOOL_LITERAL
+CHAR_LITERAL
+STRING_LITERAL
+DelimitedComment
+LineComment
+SPACE
+IDENTIFIER
+DOT
+LR_BRACKET
+RR_BRACKET
+COMMA
+SEMI
+EQUAL
+
+rule names:
+FROM
+FILTER
+SRC_ALL
+SRC_SERVICE
+SRC_SERVICE_INSTANCE
+SRC_ENDPOINT
+SRC_SERVICE_RELATION
+SRC_SERVICE_INSTANCE_RELATION
+SRC_ENDPOINT_RELATION
+SRC_SERVICE_INSTANCE_JVM_CPU
+SRC_SERVICE_INSTANCE_JVM_MEMORY
+SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL
+DECIMAL_LITERAL
+BOOL_LITERAL
+CHAR_LITERAL
+STRING_LITERAL
+DelimitedComment
+LineComment
+SPACE
+IDENTIFIER
+EscapeSequence
+HexDigits
+HexDigit
+Digits
+LetterOrDigit
+Letter
+DOT
+LR_BRACKET
+RR_BRACKET
+COMMA
+SEMI
+EQUAL
+
+channel names:
+DEFAULT_TOKEN_CHANNEL
+HIDDEN
+
+mode names:
+DEFAULT_MODE
+
+atn:
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 28, 407, 8, 1, 
4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 
9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 
14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 
19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 
25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 
30, 4, 31, 9, 31, 4, 32, 9,  [...]
\ No newline at end of file
diff --git 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$AggregateFunctionContext.class
 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$AggregateFunctionContext.class
new file mode 100644
index 0000000..d8b7c8e
Binary files /dev/null and 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$AggregateFunctionContext.class
 differ
diff --git 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$AggregationStatementContext.class
 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$AggregationStatementContext.class
new file mode 100644
index 0000000..5c27a6a
Binary files /dev/null and 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$AggregationStatementContext.class
 differ
diff --git 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$FilterExpressionContext.class
 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$FilterExpressionContext.class
new file mode 100644
index 0000000..18a7b73
Binary files /dev/null and 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$FilterExpressionContext.class
 differ
diff --git 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$FunctionNameContext.class
 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$FunctionNameContext.class
new file mode 100644
index 0000000..129e981
Binary files /dev/null and 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$FunctionNameContext.class
 differ
diff --git 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$MetricStatementContext.class
 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$MetricStatementContext.class
index 16ec3bc..7484203 100644
Binary files 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$MetricStatementContext.class
 and 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$MetricStatementContext.class
 differ
diff --git 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$MetricStatementsContext.class
 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$MetricStatementsContext.class
deleted file mode 100644
index 9f50c4b..0000000
Binary files 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$MetricStatementsContext.class
 and /dev/null differ
diff --git 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$RootContext.class
 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$RootContext.class
index 846b9bf..16d70ad 100644
Binary files 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$RootContext.class
 and 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$RootContext.class
 differ
diff --git 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$SourceContext.class
 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$SourceContext.class
index 6dc4fd1..071cba9 100644
Binary files 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$SourceContext.class
 and 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$SourceContext.class
 differ
diff --git 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$VariableContext.class
 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$VariableContext.class
new file mode 100644
index 0000000..fda239a
Binary files /dev/null and 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$VariableContext.class
 differ
diff --git 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser.class
 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser.class
index ce89ba0..c92d0e9 100644
Binary files 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser.class
 and 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser.class
 differ
diff --git 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser.interp
 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser.interp
new file mode 100644
index 0000000..cf82033
--- /dev/null
+++ 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser.interp
@@ -0,0 +1,71 @@
+token literal names:
+null
+'from'
+'filter'
+'All'
+'Service'
+'ServiceInstance'
+'Endpoint'
+'ServiceRelation'
+'ServiceInstanceRelation'
+'EndpointRelation'
+null
+null
+'ServiceInstance_JVM_Memory_Pool'
+null
+null
+null
+null
+null
+null
+null
+null
+'.'
+'('
+')'
+','
+';'
+'='
+
+token symbolic names:
+null
+FROM
+FILTER
+SRC_ALL
+SRC_SERVICE
+SRC_SERVICE_INSTANCE
+SRC_ENDPOINT
+SRC_SERVICE_RELATION
+SRC_SERVICE_INSTANCE_RELATION
+SRC_ENDPOINT_RELATION
+SRC_SERVICE_INSTANCE_JVM_CPU
+SRC_SERVICE_INSTANCE_JVM_MEMORY
+SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL
+DECIMAL_LITERAL
+BOOL_LITERAL
+CHAR_LITERAL
+STRING_LITERAL
+DelimitedComment
+LineComment
+SPACE
+IDENTIFIER
+DOT
+LR_BRACKET
+RR_BRACKET
+COMMA
+SEMI
+EQUAL
+
+rule names:
+root
+aggregationStatement
+metricStatement
+source
+variable
+aggregateFunction
+functionName
+filterExpression
+
+
+atn:
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 28, 66, 4, 2, 
9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 
4, 9, 9, 9, 3, 2, 7, 2, 20, 10, 2, 12, 2, 14, 2, 23, 11, 2, 3, 3, 3, 3, 5, 3, 
27, 10, 3, 3, 3, 3, 3, 5, 3, 31, 10, 3, 3, 3, 3, 3, 5, 3, 35, 10, 3, 3, 3, 5, 
3, 38, 10, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 
3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 5, 7, 58, 10, 7, 3, 7, 3, 7, 3, 8, 3, 
8, 3, 9, 3, 9, 3, 9,  [...]
\ No newline at end of file
diff --git 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParserBaseListener.class
 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParserBaseListener.class
index b79a112..fefd9f5 100644
Binary files 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParserBaseListener.class
 and 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParserBaseListener.class
 differ
diff --git 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParserListener.class
 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParserListener.class
index 5f93eea..a36d79d 100644
Binary files 
a/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParserListener.class
 and 
b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParserListener.class
 differ
diff --git a/oal-syntax/target/generated-sources/antlr4/OALLexer.tokens 
b/oal-syntax/target/generated-sources/antlr4/OALLexer.tokens
index 19d4b02..10c3842 100644
--- a/oal-syntax/target/generated-sources/antlr4/OALLexer.tokens
+++ b/oal-syntax/target/generated-sources/antlr4/OALLexer.tokens
@@ -1,39 +1,42 @@
-COMMA=23
+FROM=1
 FILTER=2
 SRC_ALL=3
-DOT=20
-SEMI=24
-SRC_SERVICE_INSTANCE=5
-SRC_SERVICE_INSTANCE_JVM_MEMORY=11
-LineComment=18
-LR_BRACKET=21
-FROM=1
-SRC_SERVICE_INSTANCE_JVM_CPU=10
-DelimitedComment=17
 SRC_SERVICE=4
+SRC_SERVICE_INSTANCE=5
+SRC_ENDPOINT=6
 SRC_SERVICE_RELATION=7
-BOOL_LITERAL=14
+SRC_SERVICE_INSTANCE_RELATION=8
 SRC_ENDPOINT_RELATION=9
+SRC_SERVICE_INSTANCE_JVM_CPU=10
+SRC_SERVICE_INSTANCE_JVM_MEMORY=11
 SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL=12
-SRC_ENDPOINT=6
-RR_BRACKET=22
-SRC_SERVICE_INSTANCE_RELATION=8
-STRING_LITERAL=16
-CHAR_LITERAL=15
-IDENTIFIER=19
 DECIMAL_LITERAL=13
-'.'=20
-','=23
-'Service'=4
-')'=22
-'('=21
-'ServiceInstanceRelation'=8
-'ServiceInstance_JVM_Memory_Pool'=12
+BOOL_LITERAL=14
+CHAR_LITERAL=15
+STRING_LITERAL=16
+DelimitedComment=17
+LineComment=18
+SPACE=19
+IDENTIFIER=20
+DOT=21
+LR_BRACKET=22
+RR_BRACKET=23
+COMMA=24
+SEMI=25
+EQUAL=26
 'from'=1
+'filter'=2
 'All'=3
-'EndpointRelation'=9
-';'=24
+'Service'=4
+'ServiceInstance'=5
 'Endpoint'=6
-'filter'=2
 'ServiceRelation'=7
-'ServiceInstance'=5
+'ServiceInstanceRelation'=8
+'EndpointRelation'=9
+'ServiceInstance_JVM_Memory_Pool'=12
+'.'=21
+'('=22
+')'=23
+','=24
+';'=25
+'='=26
diff --git a/oal-syntax/target/generated-sources/antlr4/OALParser.tokens 
b/oal-syntax/target/generated-sources/antlr4/OALParser.tokens
index 19d4b02..10c3842 100644
--- a/oal-syntax/target/generated-sources/antlr4/OALParser.tokens
+++ b/oal-syntax/target/generated-sources/antlr4/OALParser.tokens
@@ -1,39 +1,42 @@
-COMMA=23
+FROM=1
 FILTER=2
 SRC_ALL=3
-DOT=20
-SEMI=24
-SRC_SERVICE_INSTANCE=5
-SRC_SERVICE_INSTANCE_JVM_MEMORY=11
-LineComment=18
-LR_BRACKET=21
-FROM=1
-SRC_SERVICE_INSTANCE_JVM_CPU=10
-DelimitedComment=17
 SRC_SERVICE=4
+SRC_SERVICE_INSTANCE=5
+SRC_ENDPOINT=6
 SRC_SERVICE_RELATION=7
-BOOL_LITERAL=14
+SRC_SERVICE_INSTANCE_RELATION=8
 SRC_ENDPOINT_RELATION=9
+SRC_SERVICE_INSTANCE_JVM_CPU=10
+SRC_SERVICE_INSTANCE_JVM_MEMORY=11
 SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL=12
-SRC_ENDPOINT=6
-RR_BRACKET=22
-SRC_SERVICE_INSTANCE_RELATION=8
-STRING_LITERAL=16
-CHAR_LITERAL=15
-IDENTIFIER=19
 DECIMAL_LITERAL=13
-'.'=20
-','=23
-'Service'=4
-')'=22
-'('=21
-'ServiceInstanceRelation'=8
-'ServiceInstance_JVM_Memory_Pool'=12
+BOOL_LITERAL=14
+CHAR_LITERAL=15
+STRING_LITERAL=16
+DelimitedComment=17
+LineComment=18
+SPACE=19
+IDENTIFIER=20
+DOT=21
+LR_BRACKET=22
+RR_BRACKET=23
+COMMA=24
+SEMI=25
+EQUAL=26
 'from'=1
+'filter'=2
 'All'=3
-'EndpointRelation'=9
-';'=24
+'Service'=4
+'ServiceInstance'=5
 'Endpoint'=6
-'filter'=2
 'ServiceRelation'=7
-'ServiceInstance'=5
+'ServiceInstanceRelation'=8
+'EndpointRelation'=9
+'ServiceInstance_JVM_Memory_Pool'=12
+'.'=21
+'('=22
+')'=23
+','=24
+';'=25
+'='=26
diff --git 
a/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.interp
 
b/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.interp
new file mode 100644
index 0000000..6444ad4
--- /dev/null
+++ 
b/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.interp
@@ -0,0 +1,101 @@
+token literal names:
+null
+'from'
+'filter'
+'All'
+'Service'
+'ServiceInstance'
+'Endpoint'
+'ServiceRelation'
+'ServiceInstanceRelation'
+'EndpointRelation'
+null
+null
+'ServiceInstance_JVM_Memory_Pool'
+null
+null
+null
+null
+null
+null
+null
+null
+'.'
+'('
+')'
+','
+';'
+'='
+
+token symbolic names:
+null
+FROM
+FILTER
+SRC_ALL
+SRC_SERVICE
+SRC_SERVICE_INSTANCE
+SRC_ENDPOINT
+SRC_SERVICE_RELATION
+SRC_SERVICE_INSTANCE_RELATION
+SRC_ENDPOINT_RELATION
+SRC_SERVICE_INSTANCE_JVM_CPU
+SRC_SERVICE_INSTANCE_JVM_MEMORY
+SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL
+DECIMAL_LITERAL
+BOOL_LITERAL
+CHAR_LITERAL
+STRING_LITERAL
+DelimitedComment
+LineComment
+SPACE
+IDENTIFIER
+DOT
+LR_BRACKET
+RR_BRACKET
+COMMA
+SEMI
+EQUAL
+
+rule names:
+FROM
+FILTER
+SRC_ALL
+SRC_SERVICE
+SRC_SERVICE_INSTANCE
+SRC_ENDPOINT
+SRC_SERVICE_RELATION
+SRC_SERVICE_INSTANCE_RELATION
+SRC_ENDPOINT_RELATION
+SRC_SERVICE_INSTANCE_JVM_CPU
+SRC_SERVICE_INSTANCE_JVM_MEMORY
+SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL
+DECIMAL_LITERAL
+BOOL_LITERAL
+CHAR_LITERAL
+STRING_LITERAL
+DelimitedComment
+LineComment
+SPACE
+IDENTIFIER
+EscapeSequence
+HexDigits
+HexDigit
+Digits
+LetterOrDigit
+Letter
+DOT
+LR_BRACKET
+RR_BRACKET
+COMMA
+SEMI
+EQUAL
+
+channel names:
+DEFAULT_TOKEN_CHANNEL
+HIDDEN
+
+mode names:
+DEFAULT_MODE
+
+atn:
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 28, 407, 8, 1, 
4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 
9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 
14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 
19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 
25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 
30, 4, 31, 9, 31, 4, 32, 9,  [...]
\ No newline at end of file
diff --git 
a/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.java
 
b/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.java
index 08cab30..857795f 100644
--- 
a/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.java
+++ 
b/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.java
@@ -1,4 +1,4 @@
-// Generated from org/apache/skywalking/oal/tool/grammar/OALLexer.g4 by ANTLR 
4.3
+// Generated from org/apache/skywalking/oal/tool/grammar/OALLexer.g4 by ANTLR 
4.7.1
 package org.apache.skywalking.oal.tool.grammar;
 import org.antlr.v4.runtime.Lexer;
 import org.antlr.v4.runtime.CharStream;
@@ -11,7 +11,7 @@ import org.antlr.v4.runtime.misc.*;
 
 @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
 public class OALLexer extends Lexer {
-       static { RuntimeMetaData.checkVersion("4.3", RuntimeMetaData.VERSION); }
+       static { RuntimeMetaData.checkVersion("4.7.1", 
RuntimeMetaData.VERSION); }
 
        protected static final DFA[] _decisionToDFA;
        protected static final PredictionContextCache _sharedContextCache =
@@ -21,27 +21,72 @@ public class OALLexer extends Lexer {
                SRC_SERVICE_RELATION=7, SRC_SERVICE_INSTANCE_RELATION=8, 
SRC_ENDPOINT_RELATION=9, 
                SRC_SERVICE_INSTANCE_JVM_CPU=10, 
SRC_SERVICE_INSTANCE_JVM_MEMORY=11, SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL=12, 
                DECIMAL_LITERAL=13, BOOL_LITERAL=14, CHAR_LITERAL=15, 
STRING_LITERAL=16, 
-               DelimitedComment=17, LineComment=18, IDENTIFIER=19, DOT=20, 
LR_BRACKET=21, 
-               RR_BRACKET=22, COMMA=23, SEMI=24;
+               DelimitedComment=17, LineComment=18, SPACE=19, IDENTIFIER=20, 
DOT=21, 
+               LR_BRACKET=22, RR_BRACKET=23, COMMA=24, SEMI=25, EQUAL=26;
+       public static String[] channelNames = {
+               "DEFAULT_TOKEN_CHANNEL", "HIDDEN"
+       };
+
        public static String[] modeNames = {
                "DEFAULT_MODE"
        };
 
-       public static final String[] tokenNames = {
-               "'\\u0000'", "'\\u0001'", "'\\u0002'", "'\\u0003'", 
"'\\u0004'", "'\\u0005'", 
-               "'\\u0006'", "'\\u0007'", "'\b'", "'\t'", "'\n'", "'\\u000B'", 
"'\f'", 
-               "'\r'", "'\\u000E'", "'\\u000F'", "'\\u0010'", "'\\u0011'", 
"'\\u0012'", 
-               "'\\u0013'", "'\\u0014'", "'\\u0015'", "'\\u0016'", 
"'\\u0017'", "'\\u0018'"
-       };
        public static final String[] ruleNames = {
                "FROM", "FILTER", "SRC_ALL", "SRC_SERVICE", 
"SRC_SERVICE_INSTANCE", "SRC_ENDPOINT", 
                "SRC_SERVICE_RELATION", "SRC_SERVICE_INSTANCE_RELATION", 
"SRC_ENDPOINT_RELATION", 
                "SRC_SERVICE_INSTANCE_JVM_CPU", 
"SRC_SERVICE_INSTANCE_JVM_MEMORY", "SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL", 
                "DECIMAL_LITERAL", "BOOL_LITERAL", "CHAR_LITERAL", 
"STRING_LITERAL", "DelimitedComment", 
-               "LineComment", "IDENTIFIER", "EscapeSequence", "HexDigits", 
"HexDigit", 
+               "LineComment", "SPACE", "IDENTIFIER", "EscapeSequence", 
"HexDigits", "HexDigit", 
                "Digits", "LetterOrDigit", "Letter", "DOT", "LR_BRACKET", 
"RR_BRACKET", 
-               "COMMA", "SEMI"
+               "COMMA", "SEMI", "EQUAL"
+       };
+
+       private static final String[] _LITERAL_NAMES = {
+               null, "'from'", "'filter'", "'All'", "'Service'", 
"'ServiceInstance'", 
+               "'Endpoint'", "'ServiceRelation'", "'ServiceInstanceRelation'", 
"'EndpointRelation'", 
+               null, null, "'ServiceInstance_JVM_Memory_Pool'", null, null, 
null, null, 
+               null, null, null, null, "'.'", "'('", "')'", "','", "';'", "'='"
+       };
+       private static final String[] _SYMBOLIC_NAMES = {
+               null, "FROM", "FILTER", "SRC_ALL", "SRC_SERVICE", 
"SRC_SERVICE_INSTANCE", 
+               "SRC_ENDPOINT", "SRC_SERVICE_RELATION", 
"SRC_SERVICE_INSTANCE_RELATION", 
+               "SRC_ENDPOINT_RELATION", "SRC_SERVICE_INSTANCE_JVM_CPU", 
"SRC_SERVICE_INSTANCE_JVM_MEMORY", 
+               "SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL", "DECIMAL_LITERAL", 
"BOOL_LITERAL", 
+               "CHAR_LITERAL", "STRING_LITERAL", "DelimitedComment", 
"LineComment", "SPACE", 
+               "IDENTIFIER", "DOT", "LR_BRACKET", "RR_BRACKET", "COMMA", 
"SEMI", "EQUAL"
        };
+       public static final Vocabulary VOCABULARY = new 
VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
+
+       /**
+        * @deprecated Use {@link #VOCABULARY} instead.
+        */
+       @Deprecated
+       public static final String[] tokenNames;
+       static {
+               tokenNames = new String[_SYMBOLIC_NAMES.length];
+               for (int i = 0; i < tokenNames.length; i++) {
+                       tokenNames[i] = VOCABULARY.getLiteralName(i);
+                       if (tokenNames[i] == null) {
+                               tokenNames[i] = VOCABULARY.getSymbolicName(i);
+                       }
+
+                       if (tokenNames[i] == null) {
+                               tokenNames[i] = "<INVALID>";
+                       }
+               }
+       }
+
+       @Override
+       @Deprecated
+       public String[] getTokenNames() {
+               return tokenNames;
+       }
+
+       @Override
+
+       public Vocabulary getVocabulary() {
+               return VOCABULARY;
+       }
 
 
        public OALLexer(CharStream input) {
@@ -53,157 +98,162 @@ public class OALLexer extends Lexer {
        public String getGrammarFileName() { return "OALLexer.g4"; }
 
        @Override
-       public String[] getTokenNames() { return tokenNames; }
-
-       @Override
        public String[] getRuleNames() { return ruleNames; }
 
        @Override
        public String getSerializedATN() { return _serializedATN; }
 
        @Override
+       public String[] getChannelNames() { return channelNames; }
+
+       @Override
        public String[] getModeNames() { return modeNames; }
 
        @Override
        public ATN getATN() { return _ATN; }
 
        public static final String _serializedATN =
-               
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\2\32\u018a\b\1\4\2"+
+               
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\34\u0197\b\1\4\2"+
                
"\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4"+
                
"\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+
                
"\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31"+
-               
"\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\3\2"+
-               
"\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\5\3\5\3"+
-               
"\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6"+
-               
"\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3"+
-               
"\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t"+
+               
"\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t"+
+               " 
\4!\t!\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3"+
+               
"\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6"+
+               
"\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3"+
+               
"\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t"+
                
"\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3"+
-               
"\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n"+
-               
"\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13"+
-               
"\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f"+
-               
"\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3"+
-               
"\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r"+
-               
"\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16"+
-               
"\3\16\3\16\5\16\u00fd\n\16\3\16\6\16\u0100\n\16\r\16\16\16\u0101\3\16"+
-               
"\5\16\u0105\n\16\5\16\u0107\n\16\3\16\5\16\u010a\n\16\3\17\3\17\3\17\3"+
-               
"\17\3\17\3\17\3\17\3\17\3\17\5\17\u0115\n\17\3\20\3\20\3\20\5\20\u011a"+
-               
"\n\20\3\20\3\20\3\21\3\21\3\21\7\21\u0121\n\21\f\21\16\21\u0124\13\21"+
-               
"\3\21\3\21\3\22\3\22\3\22\3\22\3\22\7\22\u012d\n\22\f\22\16\22\u0130\13"+
-               
"\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\7\23\u013b\n\23\f\23"+
-               
"\16\23\u013e\13\23\3\23\3\23\3\24\3\24\7\24\u0144\n\24\f\24\16\24\u0147"+
-               
"\13\24\3\25\3\25\3\25\3\25\5\25\u014d\n\25\3\25\5\25\u0150\n\25\3\25\3"+
-               
"\25\3\25\6\25\u0155\n\25\r\25\16\25\u0156\3\25\3\25\3\25\3\25\3\25\5\25"+
-               
"\u015e\n\25\3\26\3\26\3\26\7\26\u0163\n\26\f\26\16\26\u0166\13\26\3\26"+
-               
"\5\26\u0169\n\26\3\27\3\27\3\30\3\30\7\30\u016f\n\30\f\30\16\30\u0172"+
-               
"\13\30\3\30\5\30\u0175\n\30\3\31\3\31\5\31\u0179\n\31\3\32\3\32\3\32\3"+
-               
"\32\5\32\u017f\n\32\3\33\3\33\3\34\3\34\3\35\3\35\3\36\3\36\3\37\3\37"+
-               "\3\u012e\2 
\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33"+
-               
"\17\35\20\37\21!\22#\23%\24\'\25)\2+\2-\2/\2\61\2\63\2\65\26\67\279\30"+
-               
";\31=\32\3\2\21\3\2\63;\4\2NNnn\6\2\f\f\17\17))^^\6\2\f\f\17\17$$^^\4"+
-               
"\2\f\f\17\17\n\2$$))^^ddhhppttvv\3\2\62\65\3\2\629\5\2\62;CHch\3\2\62"+
-               
";\4\2\62;aa\6\2&&C\\aac|\4\2\2\u0081\ud802\udc01\3\2\ud802\udc01\3\2\udc02"+
-               
"\ue001\u019d\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2"+
-               
"\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2"+
-               
"\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2"+
-               
"\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3"+
-               
"\2\2\2\2;\3\2\2\2\2=\3\2\2\2\3?\3\2\2\2\5D\3\2\2\2\7K\3\2\2\2\tO\3\2\2"+
-               
"\2\13W\3\2\2\2\rg\3\2\2\2\17p\3\2\2\2\21\u0080\3\2\2\2\23\u0098\3\2\2"+
-               
"\2\25\u00a9\3\2\2\2\27\u00c1\3\2\2\2\31\u00d9\3\2\2\2\33\u0106\3\2\2\2"+
-               
"\35\u0114\3\2\2\2\37\u0116\3\2\2\2!\u011d\3\2\2\2#\u0127\3\2\2\2%\u0136"+
-               
"\3\2\2\2\'\u0141\3\2\2\2)\u015d\3\2\2\2+\u015f\3\2\2\2-\u016a\3\2\2\2"+
-               
"/\u016c\3\2\2\2\61\u0178\3\2\2\2\63\u017e\3\2\2\2\65\u0180\3\2\2\2\67"+
-               
"\u0182\3\2\2\29\u0184\3\2\2\2;\u0186\3\2\2\2=\u0188\3\2\2\2?@\7h\2\2@"+
-               
"A\7t\2\2AB\7q\2\2BC\7o\2\2C\4\3\2\2\2DE\7h\2\2EF\7k\2\2FG\7n\2\2GH\7v"+
-               
"\2\2HI\7g\2\2IJ\7t\2\2J\6\3\2\2\2KL\7C\2\2LM\7n\2\2MN\7n\2\2N\b\3\2\2"+
-               
"\2OP\7U\2\2PQ\7g\2\2QR\7t\2\2RS\7x\2\2ST\7k\2\2TU\7e\2\2UV\7g\2\2V\n\3"+
-               
"\2\2\2WX\7U\2\2XY\7g\2\2YZ\7t\2\2Z[\7x\2\2[\\\7k\2\2\\]\7e\2\2]^\7g\2"+
-               
"\2^_\7K\2\2_`\7p\2\2`a\7u\2\2ab\7v\2\2bc\7c\2\2cd\7p\2\2de\7e\2\2ef\7"+
-               
"g\2\2f\f\3\2\2\2gh\7G\2\2hi\7p\2\2ij\7f\2\2jk\7r\2\2kl\7q\2\2lm\7k\2\2"+
-               
"mn\7p\2\2no\7v\2\2o\16\3\2\2\2pq\7U\2\2qr\7g\2\2rs\7t\2\2st\7x\2\2tu\7"+
-               
"k\2\2uv\7e\2\2vw\7g\2\2wx\7T\2\2xy\7g\2\2yz\7n\2\2z{\7c\2\2{|\7v\2\2|"+
-               
"}\7k\2\2}~\7q\2\2~\177\7p\2\2\177\20\3\2\2\2\u0080\u0081\7U\2\2\u0081"+
-               
"\u0082\7g\2\2\u0082\u0083\7t\2\2\u0083\u0084\7x\2\2\u0084\u0085\7k\2\2"+
-               
"\u0085\u0086\7e\2\2\u0086\u0087\7g\2\2\u0087\u0088\7K\2\2\u0088\u0089"+
-               
"\7p\2\2\u0089\u008a\7u\2\2\u008a\u008b\7v\2\2\u008b\u008c\7c\2\2\u008c"+
-               
"\u008d\7p\2\2\u008d\u008e\7e\2\2\u008e\u008f\7g\2\2\u008f\u0090\7T\2\2"+
-               
"\u0090\u0091\7g\2\2\u0091\u0092\7n\2\2\u0092\u0093\7c\2\2\u0093\u0094"+
-               
"\7v\2\2\u0094\u0095\7k\2\2\u0095\u0096\7q\2\2\u0096\u0097\7p\2\2\u0097"+
-               
"\22\3\2\2\2\u0098\u0099\7G\2\2\u0099\u009a\7p\2\2\u009a\u009b\7f\2\2\u009b"+
-               
"\u009c\7r\2\2\u009c\u009d\7q\2\2\u009d\u009e\7k\2\2\u009e\u009f\7p\2\2"+
-               
"\u009f\u00a0\7v\2\2\u00a0\u00a1\7T\2\2\u00a1\u00a2\7g\2\2\u00a2\u00a3"+
-               
"\7n\2\2\u00a3\u00a4\7c\2\2\u00a4\u00a5\7v\2\2\u00a5\u00a6\7k\2\2\u00a6"+
-               
"\u00a7\7q\2\2\u00a7\u00a8\7p\2\2\u00a8\24\3\2\2\2\u00a9\u00aa\7U\2\2\u00aa"+
-               
"\u00ab\7g\2\2\u00ab\u00ac\7t\2\2\u00ac\u00ad\7x\2\2\u00ad\u00ae\7k\2\2"+
-               
"\u00ae\u00af\7e\2\2\u00af\u00b0\7g\2\2\u00b0\u00b1\7K\2\2\u00b1\u00b2"+
-               
"\7p\2\2\u00b2\u00b3\7u\2\2\u00b3\u00b4\7v\2\2\u00b4\u00b5\7c\2\2\u00b5"+
-               
"\u00b6\7p\2\2\u00b6\u00b7\7e\2\2\u00b7\u00b8\7g\2\2\u00b8\u00b9\7a\2\2"+
-               
"\u00b9\u00ba\7L\2\2\u00ba\u00bb\7X\2\2\u00bb\u00bc\7O\2\2\u00bc\u00bd"+
-               
"\7a\2\2\u00bd\u00be\7E\2\2\u00be\u00bf\7R\2\2\u00bf\u00c0\7W\2\2\u00c0"+
-               
"\26\3\2\2\2\u00c1\u00c2\7U\2\2\u00c2\u00c3\7g\2\2\u00c3\u00c4\7t\2\2\u00c4"+
-               
"\u00c5\7x\2\2\u00c5\u00c6\7k\2\2\u00c6\u00c7\7e\2\2\u00c7\u00c8\7g\2\2"+
-               
"\u00c8\u00c9\7K\2\2\u00c9\u00ca\7p\2\2\u00ca\u00cb\7u\2\2\u00cb\u00cc"+
-               
"\7v\2\2\u00cc\u00cd\7c\2\2\u00cd\u00ce\7p\2\2\u00ce\u00cf\7e\2\2\u00cf"+
-               
"\u00d0\7g\2\2\u00d0\u00d1\7a\2\2\u00d1\u00d2\7L\2\2\u00d2\u00d3\7X\2\2"+
-               
"\u00d3\u00d4\7O\2\2\u00d4\u00d5\7a\2\2\u00d5\u00d6\7E\2\2\u00d6\u00d7"+
-               
"\7R\2\2\u00d7\u00d8\7W\2\2\u00d8\30\3\2\2\2\u00d9\u00da\7U\2\2\u00da\u00db"+
-               
"\7g\2\2\u00db\u00dc\7t\2\2\u00dc\u00dd\7x\2\2\u00dd\u00de\7k\2\2\u00de"+
-               
"\u00df\7e\2\2\u00df\u00e0\7g\2\2\u00e0\u00e1\7K\2\2\u00e1\u00e2\7p\2\2"+
-               
"\u00e2\u00e3\7u\2\2\u00e3\u00e4\7v\2\2\u00e4\u00e5\7c\2\2\u00e5\u00e6"+
-               
"\7p\2\2\u00e6\u00e7\7e\2\2\u00e7\u00e8\7g\2\2\u00e8\u00e9\7a\2\2\u00e9"+
-               
"\u00ea\7L\2\2\u00ea\u00eb\7X\2\2\u00eb\u00ec\7O\2\2\u00ec\u00ed\7a\2\2"+
-               
"\u00ed\u00ee\7O\2\2\u00ee\u00ef\7g\2\2\u00ef\u00f0\7o\2\2\u00f0\u00f1"+
-               
"\7q\2\2\u00f1\u00f2\7t\2\2\u00f2\u00f3\7{\2\2\u00f3\u00f4\7a\2\2\u00f4"+
-               
"\u00f5\7R\2\2\u00f5\u00f6\7q\2\2\u00f6\u00f7\7q\2\2\u00f7\u00f8\7n\2\2"+
-               
"\u00f8\32\3\2\2\2\u00f9\u0107\7\62\2\2\u00fa\u0104\t\2\2\2\u00fb\u00fd"+
-               
"\5/\30\2\u00fc\u00fb\3\2\2\2\u00fc\u00fd\3\2\2\2\u00fd\u0105\3\2\2\2\u00fe"+
-               
"\u0100\7a\2\2\u00ff\u00fe\3\2\2\2\u0100\u0101\3\2\2\2\u0101\u00ff\3\2"+
-               
"\2\2\u0101\u0102\3\2\2\2\u0102\u0103\3\2\2\2\u0103\u0105\5/\30\2\u0104"+
-               
"\u00fc\3\2\2\2\u0104\u00ff\3\2\2\2\u0105\u0107\3\2\2\2\u0106\u00f9\3\2"+
-               
"\2\2\u0106\u00fa\3\2\2\2\u0107\u0109\3\2\2\2\u0108\u010a\t\3\2\2\u0109"+
-               
"\u0108\3\2\2\2\u0109\u010a\3\2\2\2\u010a\34\3\2\2\2\u010b\u010c\7v\2\2"+
-               
"\u010c\u010d\7t\2\2\u010d\u010e\7w\2\2\u010e\u0115\7g\2\2\u010f\u0110"+
-               
"\7h\2\2\u0110\u0111\7c\2\2\u0111\u0112\7n\2\2\u0112\u0113\7u\2\2\u0113"+
-               
"\u0115\7g\2\2\u0114\u010b\3\2\2\2\u0114\u010f\3\2\2\2\u0115\36\3\2\2\2"+
-               
"\u0116\u0119\7)\2\2\u0117\u011a\n\4\2\2\u0118\u011a\5)\25\2\u0119\u0117"+
-               
"\3\2\2\2\u0119\u0118\3\2\2\2\u011a\u011b\3\2\2\2\u011b\u011c\7)\2\2\u011c"+
-               " 
\3\2\2\2\u011d\u0122\7$\2\2\u011e\u0121\n\5\2\2\u011f\u0121\5)\25\2\u0120"+
-               
"\u011e\3\2\2\2\u0120\u011f\3\2\2\2\u0121\u0124\3\2\2\2\u0122\u0120\3\2"+
-               
"\2\2\u0122\u0123\3\2\2\2\u0123\u0125\3\2\2\2\u0124\u0122\3\2\2\2\u0125"+
-               
"\u0126\7$\2\2\u0126\"\3\2\2\2\u0127\u0128\7\61\2\2\u0128\u0129\7,\2\2"+
-               
"\u0129\u012e\3\2\2\2\u012a\u012d\5#\22\2\u012b\u012d\13\2\2\2\u012c\u012a"+
-               
"\3\2\2\2\u012c\u012b\3\2\2\2\u012d\u0130\3\2\2\2\u012e\u012f\3\2\2\2\u012e"+
-               
"\u012c\3\2\2\2\u012f\u0131\3\2\2\2\u0130\u012e\3\2\2\2\u0131\u0132\7,"+
-               
"\2\2\u0132\u0133\7\61\2\2\u0133\u0134\3\2\2\2\u0134\u0135\b\22\2\2\u0135"+
-               
"$\3\2\2\2\u0136\u0137\7\61\2\2\u0137\u0138\7\61\2\2\u0138\u013c\3\2\2"+
-               
"\2\u0139\u013b\n\6\2\2\u013a\u0139\3\2\2\2\u013b\u013e\3\2\2\2\u013c\u013a"+
-               
"\3\2\2\2\u013c\u013d\3\2\2\2\u013d\u013f\3\2\2\2\u013e\u013c\3\2\2\2\u013f"+
-               
"\u0140\b\23\2\2\u0140&\3\2\2\2\u0141\u0145\5\63\32\2\u0142\u0144\5\61"+
-               
"\31\2\u0143\u0142\3\2\2\2\u0144\u0147\3\2\2\2\u0145\u0143\3\2\2\2\u0145"+
-               
"\u0146\3\2\2\2\u0146(\3\2\2\2\u0147\u0145\3\2\2\2\u0148\u0149\7^\2\2\u0149"+
-               
"\u015e\t\7\2\2\u014a\u014f\7^\2\2\u014b\u014d\t\b\2\2\u014c\u014b\3\2"+
-               
"\2\2\u014c\u014d\3\2\2\2\u014d\u014e\3\2\2\2\u014e\u0150\t\t\2\2\u014f"+
-               
"\u014c\3\2\2\2\u014f\u0150\3\2\2\2\u0150\u0151\3\2\2\2\u0151\u015e\t\t"+
-               
"\2\2\u0152\u0154\7^\2\2\u0153\u0155\7w\2\2\u0154\u0153\3\2\2\2\u0155\u0156"+
-               
"\3\2\2\2\u0156\u0154\3\2\2\2\u0156\u0157\3\2\2\2\u0157\u0158\3\2\2\2\u0158"+
-               
"\u0159\5-\27\2\u0159\u015a\5-\27\2\u015a\u015b\5-\27\2\u015b\u015c\5-"+
-               
"\27\2\u015c\u015e\3\2\2\2\u015d\u0148\3\2\2\2\u015d\u014a\3\2\2\2\u015d"+
-               
"\u0152\3\2\2\2\u015e*\3\2\2\2\u015f\u0168\5-\27\2\u0160\u0163\5-\27\2"+
-               
"\u0161\u0163\7a\2\2\u0162\u0160\3\2\2\2\u0162\u0161\3\2\2\2\u0163\u0166"+
-               
"\3\2\2\2\u0164\u0162\3\2\2\2\u0164\u0165\3\2\2\2\u0165\u0167\3\2\2\2\u0166"+
-               
"\u0164\3\2\2\2\u0167\u0169\5-\27\2\u0168\u0164\3\2\2\2\u0168\u0169\3\2"+
-               
"\2\2\u0169,\3\2\2\2\u016a\u016b\t\n\2\2\u016b.\3\2\2\2\u016c\u0174\t\13"+
-               
"\2\2\u016d\u016f\t\f\2\2\u016e\u016d\3\2\2\2\u016f\u0172\3\2\2\2\u0170"+
-               
"\u016e\3\2\2\2\u0170\u0171\3\2\2\2\u0171\u0173\3\2\2\2\u0172\u0170\3\2"+
-               
"\2\2\u0173\u0175\t\13\2\2\u0174\u0170\3\2\2\2\u0174\u0175\3\2\2\2\u0175"+
-               
"\60\3\2\2\2\u0176\u0179\5\63\32\2\u0177\u0179\t\13\2\2\u0178\u0176\3\2"+
-               
"\2\2\u0178\u0177\3\2\2\2\u0179\62\3\2\2\2\u017a\u017f\t\r\2\2\u017b\u017f"+
-               
"\n\16\2\2\u017c\u017d\t\17\2\2\u017d\u017f\t\20\2\2\u017e\u017a\3\2\2"+
-               
"\2\u017e\u017b\3\2\2\2\u017e\u017c\3\2\2\2\u017f\64\3\2\2\2\u0180\u0181"+
-               
"\7\60\2\2\u0181\66\3\2\2\2\u0182\u0183\7*\2\2\u01838\3\2\2\2\u0184\u0185"+
-               
"\7+\2\2\u0185:\3\2\2\2\u0186\u0187\7.\2\2\u0187<\3\2\2\2\u0188\u0189\7"+
-               
"=\2\2\u0189>\3\2\2\2\33\2\u00fc\u0101\u0104\u0106\u0109\u0114\u0119\u0120"+
-               
"\u0122\u012c\u012e\u013c\u0145\u014c\u014f\u0156\u015d\u0162\u0164\u0168"+
-               "\u0170\u0174\u0178\u017e\3\2\3\2";
+               
"\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n"+
+               
"\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3"+
+               
"\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3"+
+               
"\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f"+
+               
"\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3"+
+               
"\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r"+
+               
"\3\r\3\r\3\16\3\16\3\16\5\16\u0101\n\16\3\16\6\16\u0104\n\16\r\16\16\16"+
+               
"\u0105\3\16\5\16\u0109\n\16\5\16\u010b\n\16\3\16\5\16\u010e\n\16\3\17"+
+               
"\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\5\17\u0119\n\17\3\20\3\20\3\20"+
+               
"\5\20\u011e\n\20\3\20\3\20\3\21\3\21\3\21\7\21\u0125\n\21\f\21\16\21\u0128"+
+               
"\13\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\7\22\u0131\n\22\f\22\16\22\u0134"+
+               
"\13\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\7\23\u013f\n\23\f"+
+               
"\23\16\23\u0142\13\23\3\23\3\23\3\24\6\24\u0147\n\24\r\24\16\24\u0148"+
+               
"\3\24\3\24\3\25\3\25\7\25\u014f\n\25\f\25\16\25\u0152\13\25\3\26\3\26"+
+               
"\3\26\3\26\5\26\u0158\n\26\3\26\5\26\u015b\n\26\3\26\3\26\3\26\6\26\u0160"+
+               
"\n\26\r\26\16\26\u0161\3\26\3\26\3\26\3\26\3\26\5\26\u0169\n\26\3\27\3"+
+               
"\27\3\27\7\27\u016e\n\27\f\27\16\27\u0171\13\27\3\27\5\27\u0174\n\27\3"+
+               
"\30\3\30\3\31\3\31\7\31\u017a\n\31\f\31\16\31\u017d\13\31\3\31\5\31\u0180"+
+               
"\n\31\3\32\3\32\5\32\u0184\n\32\3\33\3\33\3\33\3\33\5\33\u018a\n\33\3"+
+               "\34\3\34\3\35\3\35\3\36\3\36\3\37\3\37\3 \3 
\3!\3!\3\u0132\2\"\3\3\5\4"+
+               
"\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22"+
+               
"#\23%\24\'\25)\26+\2-\2/\2\61\2\63\2\65\2\67\279\30;\31=\32?\33A\34\3"+
+               
"\2\22\3\2\63;\4\2NNnn\6\2\f\f\17\17))^^\6\2\f\f\17\17$$^^\4\2\f\f\17\17"+
+               
"\5\2\13\f\17\17\"\"\n\2$$))^^ddhhppttvv\3\2\62\65\3\2\629\5\2\62;CHch"+
+               
"\3\2\62;\4\2\62;aa\6\2&&C\\aac|\4\2\2\u0081\ud802\udc01\3\2\ud802\udc01"+
+               
"\3\2\udc02\ue001\2\u01ab\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2"+
+               
"\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25"+
+               
"\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2"+
+               
"\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2\67\3\2"+
+               
"\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\3C\3\2\2\2"+
+               
"\5H\3\2\2\2\7O\3\2\2\2\tS\3\2\2\2\13[\3\2\2\2\rk\3\2\2\2\17t\3\2\2\2\21"+
+               
"\u0084\3\2\2\2\23\u009c\3\2\2\2\25\u00ad\3\2\2\2\27\u00c5\3\2\2\2\31\u00dd"+
+               
"\3\2\2\2\33\u010a\3\2\2\2\35\u0118\3\2\2\2\37\u011a\3\2\2\2!\u0121\3\2"+
+               
"\2\2#\u012b\3\2\2\2%\u013a\3\2\2\2\'\u0146\3\2\2\2)\u014c\3\2\2\2+\u0168"+
+               
"\3\2\2\2-\u016a\3\2\2\2/\u0175\3\2\2\2\61\u0177\3\2\2\2\63\u0183\3\2\2"+
+               
"\2\65\u0189\3\2\2\2\67\u018b\3\2\2\29\u018d\3\2\2\2;\u018f\3\2\2\2=\u0191"+
+               
"\3\2\2\2?\u0193\3\2\2\2A\u0195\3\2\2\2CD\7h\2\2DE\7t\2\2EF\7q\2\2FG\7"+
+               
"o\2\2G\4\3\2\2\2HI\7h\2\2IJ\7k\2\2JK\7n\2\2KL\7v\2\2LM\7g\2\2MN\7t\2\2"+
+               
"N\6\3\2\2\2OP\7C\2\2PQ\7n\2\2QR\7n\2\2R\b\3\2\2\2ST\7U\2\2TU\7g\2\2UV"+
+               
"\7t\2\2VW\7x\2\2WX\7k\2\2XY\7e\2\2YZ\7g\2\2Z\n\3\2\2\2[\\\7U\2\2\\]\7"+
+               
"g\2\2]^\7t\2\2^_\7x\2\2_`\7k\2\2`a\7e\2\2ab\7g\2\2bc\7K\2\2cd\7p\2\2d"+
+               
"e\7u\2\2ef\7v\2\2fg\7c\2\2gh\7p\2\2hi\7e\2\2ij\7g\2\2j\f\3\2\2\2kl\7G"+
+               
"\2\2lm\7p\2\2mn\7f\2\2no\7r\2\2op\7q\2\2pq\7k\2\2qr\7p\2\2rs\7v\2\2s\16"+
+               
"\3\2\2\2tu\7U\2\2uv\7g\2\2vw\7t\2\2wx\7x\2\2xy\7k\2\2yz\7e\2\2z{\7g\2"+
+               
"\2{|\7T\2\2|}\7g\2\2}~\7n\2\2~\177\7c\2\2\177\u0080\7v\2\2\u0080\u0081"+
+               
"\7k\2\2\u0081\u0082\7q\2\2\u0082\u0083\7p\2\2\u0083\20\3\2\2\2\u0084\u0085"+
+               
"\7U\2\2\u0085\u0086\7g\2\2\u0086\u0087\7t\2\2\u0087\u0088\7x\2\2\u0088"+
+               
"\u0089\7k\2\2\u0089\u008a\7e\2\2\u008a\u008b\7g\2\2\u008b\u008c\7K\2\2"+
+               
"\u008c\u008d\7p\2\2\u008d\u008e\7u\2\2\u008e\u008f\7v\2\2\u008f\u0090"+
+               
"\7c\2\2\u0090\u0091\7p\2\2\u0091\u0092\7e\2\2\u0092\u0093\7g\2\2\u0093"+
+               
"\u0094\7T\2\2\u0094\u0095\7g\2\2\u0095\u0096\7n\2\2\u0096\u0097\7c\2\2"+
+               
"\u0097\u0098\7v\2\2\u0098\u0099\7k\2\2\u0099\u009a\7q\2\2\u009a\u009b"+
+               
"\7p\2\2\u009b\22\3\2\2\2\u009c\u009d\7G\2\2\u009d\u009e\7p\2\2\u009e\u009f"+
+               
"\7f\2\2\u009f\u00a0\7r\2\2\u00a0\u00a1\7q\2\2\u00a1\u00a2\7k\2\2\u00a2"+
+               
"\u00a3\7p\2\2\u00a3\u00a4\7v\2\2\u00a4\u00a5\7T\2\2\u00a5\u00a6\7g\2\2"+
+               
"\u00a6\u00a7\7n\2\2\u00a7\u00a8\7c\2\2\u00a8\u00a9\7v\2\2\u00a9\u00aa"+
+               
"\7k\2\2\u00aa\u00ab\7q\2\2\u00ab\u00ac\7p\2\2\u00ac\24\3\2\2\2\u00ad\u00ae"+
+               
"\7U\2\2\u00ae\u00af\7g\2\2\u00af\u00b0\7t\2\2\u00b0\u00b1\7x\2\2\u00b1"+
+               
"\u00b2\7k\2\2\u00b2\u00b3\7e\2\2\u00b3\u00b4\7g\2\2\u00b4\u00b5\7K\2\2"+
+               
"\u00b5\u00b6\7p\2\2\u00b6\u00b7\7u\2\2\u00b7\u00b8\7v\2\2\u00b8\u00b9"+
+               
"\7c\2\2\u00b9\u00ba\7p\2\2\u00ba\u00bb\7e\2\2\u00bb\u00bc\7g\2\2\u00bc"+
+               
"\u00bd\7a\2\2\u00bd\u00be\7L\2\2\u00be\u00bf\7X\2\2\u00bf\u00c0\7O\2\2"+
+               
"\u00c0\u00c1\7a\2\2\u00c1\u00c2\7E\2\2\u00c2\u00c3\7R\2\2\u00c3\u00c4"+
+               
"\7W\2\2\u00c4\26\3\2\2\2\u00c5\u00c6\7U\2\2\u00c6\u00c7\7g\2\2\u00c7\u00c8"+
+               
"\7t\2\2\u00c8\u00c9\7x\2\2\u00c9\u00ca\7k\2\2\u00ca\u00cb\7e\2\2\u00cb"+
+               
"\u00cc\7g\2\2\u00cc\u00cd\7K\2\2\u00cd\u00ce\7p\2\2\u00ce\u00cf\7u\2\2"+
+               
"\u00cf\u00d0\7v\2\2\u00d0\u00d1\7c\2\2\u00d1\u00d2\7p\2\2\u00d2\u00d3"+
+               
"\7e\2\2\u00d3\u00d4\7g\2\2\u00d4\u00d5\7a\2\2\u00d5\u00d6\7L\2\2\u00d6"+
+               
"\u00d7\7X\2\2\u00d7\u00d8\7O\2\2\u00d8\u00d9\7a\2\2\u00d9\u00da\7E\2\2"+
+               
"\u00da\u00db\7R\2\2\u00db\u00dc\7W\2\2\u00dc\30\3\2\2\2\u00dd\u00de\7"+
+               
"U\2\2\u00de\u00df\7g\2\2\u00df\u00e0\7t\2\2\u00e0\u00e1\7x\2\2\u00e1\u00e2"+
+               
"\7k\2\2\u00e2\u00e3\7e\2\2\u00e3\u00e4\7g\2\2\u00e4\u00e5\7K\2\2\u00e5"+
+               
"\u00e6\7p\2\2\u00e6\u00e7\7u\2\2\u00e7\u00e8\7v\2\2\u00e8\u00e9\7c\2\2"+
+               
"\u00e9\u00ea\7p\2\2\u00ea\u00eb\7e\2\2\u00eb\u00ec\7g\2\2\u00ec\u00ed"+
+               
"\7a\2\2\u00ed\u00ee\7L\2\2\u00ee\u00ef\7X\2\2\u00ef\u00f0\7O\2\2\u00f0"+
+               
"\u00f1\7a\2\2\u00f1\u00f2\7O\2\2\u00f2\u00f3\7g\2\2\u00f3\u00f4\7o\2\2"+
+               
"\u00f4\u00f5\7q\2\2\u00f5\u00f6\7t\2\2\u00f6\u00f7\7{\2\2\u00f7\u00f8"+
+               
"\7a\2\2\u00f8\u00f9\7R\2\2\u00f9\u00fa\7q\2\2\u00fa\u00fb\7q\2\2\u00fb"+
+               
"\u00fc\7n\2\2\u00fc\32\3\2\2\2\u00fd\u010b\7\62\2\2\u00fe\u0108\t\2\2"+
+               
"\2\u00ff\u0101\5\61\31\2\u0100\u00ff\3\2\2\2\u0100\u0101\3\2\2\2\u0101"+
+               
"\u0109\3\2\2\2\u0102\u0104\7a\2\2\u0103\u0102\3\2\2\2\u0104\u0105\3\2"+
+               
"\2\2\u0105\u0103\3\2\2\2\u0105\u0106\3\2\2\2\u0106\u0107\3\2\2\2\u0107"+
+               
"\u0109\5\61\31\2\u0108\u0100\3\2\2\2\u0108\u0103\3\2\2\2\u0109\u010b\3"+
+               
"\2\2\2\u010a\u00fd\3\2\2\2\u010a\u00fe\3\2\2\2\u010b\u010d\3\2\2\2\u010c"+
+               
"\u010e\t\3\2\2\u010d\u010c\3\2\2\2\u010d\u010e\3\2\2\2\u010e\34\3\2\2"+
+               
"\2\u010f\u0110\7v\2\2\u0110\u0111\7t\2\2\u0111\u0112\7w\2\2\u0112\u0119"+
+               
"\7g\2\2\u0113\u0114\7h\2\2\u0114\u0115\7c\2\2\u0115\u0116\7n\2\2\u0116"+
+               
"\u0117\7u\2\2\u0117\u0119\7g\2\2\u0118\u010f\3\2\2\2\u0118\u0113\3\2\2"+
+               
"\2\u0119\36\3\2\2\2\u011a\u011d\7)\2\2\u011b\u011e\n\4\2\2\u011c\u011e"+
+               
"\5+\26\2\u011d\u011b\3\2\2\2\u011d\u011c\3\2\2\2\u011e\u011f\3\2\2\2\u011f"+
+               "\u0120\7)\2\2\u0120 
\3\2\2\2\u0121\u0126\7$\2\2\u0122\u0125\n\5\2\2\u0123"+
+               
"\u0125\5+\26\2\u0124\u0122\3\2\2\2\u0124\u0123\3\2\2\2\u0125\u0128\3\2"+
+               
"\2\2\u0126\u0124\3\2\2\2\u0126\u0127\3\2\2\2\u0127\u0129\3\2\2\2\u0128"+
+               
"\u0126\3\2\2\2\u0129\u012a\7$\2\2\u012a\"\3\2\2\2\u012b\u012c\7\61\2\2"+
+               
"\u012c\u012d\7,\2\2\u012d\u0132\3\2\2\2\u012e\u0131\5#\22\2\u012f\u0131"+
+               
"\13\2\2\2\u0130\u012e\3\2\2\2\u0130\u012f\3\2\2\2\u0131\u0134\3\2\2\2"+
+               
"\u0132\u0133\3\2\2\2\u0132\u0130\3\2\2\2\u0133\u0135\3\2\2\2\u0134\u0132"+
+               
"\3\2\2\2\u0135\u0136\7,\2\2\u0136\u0137\7\61\2\2\u0137\u0138\3\2\2\2\u0138"+
+               
"\u0139\b\22\2\2\u0139$\3\2\2\2\u013a\u013b\7\61\2\2\u013b\u013c\7\61\2"+
+               
"\2\u013c\u0140\3\2\2\2\u013d\u013f\n\6\2\2\u013e\u013d\3\2\2\2\u013f\u0142"+
+               
"\3\2\2\2\u0140\u013e\3\2\2\2\u0140\u0141\3\2\2\2\u0141\u0143\3\2\2\2\u0142"+
+               
"\u0140\3\2\2\2\u0143\u0144\b\23\2\2\u0144&\3\2\2\2\u0145\u0147\t\7\2\2"+
+               
"\u0146\u0145\3\2\2\2\u0147\u0148\3\2\2\2\u0148\u0146\3\2\2\2\u0148\u0149"+
+               
"\3\2\2\2\u0149\u014a\3\2\2\2\u014a\u014b\b\24\2\2\u014b(\3\2\2\2\u014c"+
+               
"\u0150\5\65\33\2\u014d\u014f\5\63\32\2\u014e\u014d\3\2\2\2\u014f\u0152"+
+               
"\3\2\2\2\u0150\u014e\3\2\2\2\u0150\u0151\3\2\2\2\u0151*\3\2\2\2\u0152"+
+               
"\u0150\3\2\2\2\u0153\u0154\7^\2\2\u0154\u0169\t\b\2\2\u0155\u015a\7^\2"+
+               
"\2\u0156\u0158\t\t\2\2\u0157\u0156\3\2\2\2\u0157\u0158\3\2\2\2\u0158\u0159"+
+               
"\3\2\2\2\u0159\u015b\t\n\2\2\u015a\u0157\3\2\2\2\u015a\u015b\3\2\2\2\u015b"+
+               
"\u015c\3\2\2\2\u015c\u0169\t\n\2\2\u015d\u015f\7^\2\2\u015e\u0160\7w\2"+
+               
"\2\u015f\u015e\3\2\2\2\u0160\u0161\3\2\2\2\u0161\u015f\3\2\2\2\u0161\u0162"+
+               
"\3\2\2\2\u0162\u0163\3\2\2\2\u0163\u0164\5/\30\2\u0164\u0165\5/\30\2\u0165"+
+               
"\u0166\5/\30\2\u0166\u0167\5/\30\2\u0167\u0169\3\2\2\2\u0168\u0153\3\2"+
+               
"\2\2\u0168\u0155\3\2\2\2\u0168\u015d\3\2\2\2\u0169,\3\2\2\2\u016a\u0173"+
+               
"\5/\30\2\u016b\u016e\5/\30\2\u016c\u016e\7a\2\2\u016d\u016b\3\2\2\2\u016d"+
+               
"\u016c\3\2\2\2\u016e\u0171\3\2\2\2\u016f\u016d\3\2\2\2\u016f\u0170\3\2"+
+               
"\2\2\u0170\u0172\3\2\2\2\u0171\u016f\3\2\2\2\u0172\u0174\5/\30\2\u0173"+
+               
"\u016f\3\2\2\2\u0173\u0174\3\2\2\2\u0174.\3\2\2\2\u0175\u0176\t\13\2\2"+
+               
"\u0176\60\3\2\2\2\u0177\u017f\t\f\2\2\u0178\u017a\t\r\2\2\u0179\u0178"+
+               
"\3\2\2\2\u017a\u017d\3\2\2\2\u017b\u0179\3\2\2\2\u017b\u017c\3\2\2\2\u017c"+
+               
"\u017e\3\2\2\2\u017d\u017b\3\2\2\2\u017e\u0180\t\f\2\2\u017f\u017b\3\2"+
+               
"\2\2\u017f\u0180\3\2\2\2\u0180\62\3\2\2\2\u0181\u0184\5\65\33\2\u0182"+
+               
"\u0184\t\f\2\2\u0183\u0181\3\2\2\2\u0183\u0182\3\2\2\2\u0184\64\3\2\2"+
+               
"\2\u0185\u018a\t\16\2\2\u0186\u018a\n\17\2\2\u0187\u0188\t\20\2\2\u0188"+
+               
"\u018a\t\21\2\2\u0189\u0185\3\2\2\2\u0189\u0186\3\2\2\2\u0189\u0187\3"+
+               
"\2\2\2\u018a\66\3\2\2\2\u018b\u018c\7\60\2\2\u018c8\3\2\2\2\u018d\u018e"+
+               
"\7*\2\2\u018e:\3\2\2\2\u018f\u0190\7+\2\2\u0190<\3\2\2\2\u0191\u0192\7"+
+               
".\2\2\u0192>\3\2\2\2\u0193\u0194\7=\2\2\u0194@\3\2\2\2\u0195\u0196\7?"+
+               
"\2\2\u0196B\3\2\2\2\34\2\u0100\u0105\u0108\u010a\u010d\u0118\u011d\u0124"+
+               
"\u0126\u0130\u0132\u0140\u0148\u0150\u0157\u015a\u0161\u0168\u016d\u016f"+
+               "\u0173\u017b\u017f\u0183\u0189\3\2\3\2";
        public static final ATN _ATN =
                new ATNDeserializer().deserialize(_serializedATN.toCharArray());
        static {
diff --git 
a/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.interp
 
b/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.interp
new file mode 100644
index 0000000..cf82033
--- /dev/null
+++ 
b/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.interp
@@ -0,0 +1,71 @@
+token literal names:
+null
+'from'
+'filter'
+'All'
+'Service'
+'ServiceInstance'
+'Endpoint'
+'ServiceRelation'
+'ServiceInstanceRelation'
+'EndpointRelation'
+null
+null
+'ServiceInstance_JVM_Memory_Pool'
+null
+null
+null
+null
+null
+null
+null
+null
+'.'
+'('
+')'
+','
+';'
+'='
+
+token symbolic names:
+null
+FROM
+FILTER
+SRC_ALL
+SRC_SERVICE
+SRC_SERVICE_INSTANCE
+SRC_ENDPOINT
+SRC_SERVICE_RELATION
+SRC_SERVICE_INSTANCE_RELATION
+SRC_ENDPOINT_RELATION
+SRC_SERVICE_INSTANCE_JVM_CPU
+SRC_SERVICE_INSTANCE_JVM_MEMORY
+SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL
+DECIMAL_LITERAL
+BOOL_LITERAL
+CHAR_LITERAL
+STRING_LITERAL
+DelimitedComment
+LineComment
+SPACE
+IDENTIFIER
+DOT
+LR_BRACKET
+RR_BRACKET
+COMMA
+SEMI
+EQUAL
+
+rule names:
+root
+aggregationStatement
+metricStatement
+source
+variable
+aggregateFunction
+functionName
+filterExpression
+
+
+atn:
+[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 28, 66, 4, 2, 
9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 
4, 9, 9, 9, 3, 2, 7, 2, 20, 10, 2, 12, 2, 14, 2, 23, 11, 2, 3, 3, 3, 3, 5, 3, 
27, 10, 3, 3, 3, 3, 3, 5, 3, 31, 10, 3, 3, 3, 3, 3, 5, 3, 35, 10, 3, 3, 3, 5, 
3, 38, 10, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 
3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 5, 7, 58, 10, 7, 3, 7, 3, 7, 3, 8, 3, 
8, 3, 9, 3, 9, 3, 9,  [...]
\ No newline at end of file
diff --git 
a/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.java
 
b/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.java
index e237ef9..4fe5c7a 100644
--- 
a/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.java
+++ 
b/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.java
@@ -1,4 +1,4 @@
-// Generated from org/apache/skywalking/oal/tool/grammar/OALParser.g4 by ANTLR 
4.3
+// Generated from org/apache/skywalking/oal/tool/grammar/OALParser.g4 by ANTLR 
4.7.1
 package org.apache.skywalking.oal.tool.grammar;
 import org.antlr.v4.runtime.atn.*;
 import org.antlr.v4.runtime.dfa.DFA;
@@ -11,36 +11,76 @@ import java.util.ArrayList;
 
 @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
 public class OALParser extends Parser {
-       static { RuntimeMetaData.checkVersion("4.3", RuntimeMetaData.VERSION); }
+       static { RuntimeMetaData.checkVersion("4.7.1", 
RuntimeMetaData.VERSION); }
 
        protected static final DFA[] _decisionToDFA;
        protected static final PredictionContextCache _sharedContextCache =
                new PredictionContextCache();
        public static final int
-               COMMA=23, FILTER=2, SRC_ALL=3, DOT=20, SEMI=24, 
SRC_SERVICE_INSTANCE=5, 
-               SRC_SERVICE_INSTANCE_JVM_MEMORY=11, LineComment=18, 
LR_BRACKET=21, FROM=1, 
-               SRC_SERVICE_INSTANCE_JVM_CPU=10, DelimitedComment=17, 
SRC_SERVICE=4, SRC_SERVICE_RELATION=7, 
-               BOOL_LITERAL=14, SRC_ENDPOINT_RELATION=9, 
SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL=12, 
-               SRC_ENDPOINT=6, RR_BRACKET=22, SRC_SERVICE_INSTANCE_RELATION=8, 
STRING_LITERAL=16, 
-               CHAR_LITERAL=15, IDENTIFIER=19, DECIMAL_LITERAL=13;
-       public static final String[] tokenNames = {
-               "<INVALID>", "'from'", "'filter'", "'All'", "'Service'", 
"'ServiceInstance'", 
-               "'Endpoint'", "'ServiceRelation'", "'ServiceInstanceRelation'", 
"'EndpointRelation'", 
-               "SRC_SERVICE_INSTANCE_JVM_CPU", 
"SRC_SERVICE_INSTANCE_JVM_MEMORY", "'ServiceInstance_JVM_Memory_Pool'", 
-               "DECIMAL_LITERAL", "BOOL_LITERAL", "CHAR_LITERAL", 
"STRING_LITERAL", "DelimitedComment", 
-               "LineComment", "IDENTIFIER", "'.'", "'('", "')'", "','", "';'"
-       };
+               FROM=1, FILTER=2, SRC_ALL=3, SRC_SERVICE=4, 
SRC_SERVICE_INSTANCE=5, SRC_ENDPOINT=6, 
+               SRC_SERVICE_RELATION=7, SRC_SERVICE_INSTANCE_RELATION=8, 
SRC_ENDPOINT_RELATION=9, 
+               SRC_SERVICE_INSTANCE_JVM_CPU=10, 
SRC_SERVICE_INSTANCE_JVM_MEMORY=11, SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL=12, 
+               DECIMAL_LITERAL=13, BOOL_LITERAL=14, CHAR_LITERAL=15, 
STRING_LITERAL=16, 
+               DelimitedComment=17, LineComment=18, SPACE=19, IDENTIFIER=20, 
DOT=21, 
+               LR_BRACKET=22, RR_BRACKET=23, COMMA=24, SEMI=25, EQUAL=26;
        public static final int
-               RULE_root = 0, RULE_metricStatements = 1, RULE_metricStatement 
= 2, RULE_source = 3;
+               RULE_root = 0, RULE_aggregationStatement = 1, 
RULE_metricStatement = 2, 
+               RULE_source = 3, RULE_variable = 4, RULE_aggregateFunction = 5, 
RULE_functionName = 6, 
+               RULE_filterExpression = 7;
        public static final String[] ruleNames = {
-               "root", "metricStatements", "metricStatement", "source"
+               "root", "aggregationStatement", "metricStatement", "source", 
"variable", 
+               "aggregateFunction", "functionName", "filterExpression"
        };
 
+       private static final String[] _LITERAL_NAMES = {
+               null, "'from'", "'filter'", "'All'", "'Service'", 
"'ServiceInstance'", 
+               "'Endpoint'", "'ServiceRelation'", "'ServiceInstanceRelation'", 
"'EndpointRelation'", 
+               null, null, "'ServiceInstance_JVM_Memory_Pool'", null, null, 
null, null, 
+               null, null, null, null, "'.'", "'('", "')'", "','", "';'", "'='"
+       };
+       private static final String[] _SYMBOLIC_NAMES = {
+               null, "FROM", "FILTER", "SRC_ALL", "SRC_SERVICE", 
"SRC_SERVICE_INSTANCE", 
+               "SRC_ENDPOINT", "SRC_SERVICE_RELATION", 
"SRC_SERVICE_INSTANCE_RELATION", 
+               "SRC_ENDPOINT_RELATION", "SRC_SERVICE_INSTANCE_JVM_CPU", 
"SRC_SERVICE_INSTANCE_JVM_MEMORY", 
+               "SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL", "DECIMAL_LITERAL", 
"BOOL_LITERAL", 
+               "CHAR_LITERAL", "STRING_LITERAL", "DelimitedComment", 
"LineComment", "SPACE", 
+               "IDENTIFIER", "DOT", "LR_BRACKET", "RR_BRACKET", "COMMA", 
"SEMI", "EQUAL"
+       };
+       public static final Vocabulary VOCABULARY = new 
VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
+
+       /**
+        * @deprecated Use {@link #VOCABULARY} instead.
+        */
+       @Deprecated
+       public static final String[] tokenNames;
+       static {
+               tokenNames = new String[_SYMBOLIC_NAMES.length];
+               for (int i = 0; i < tokenNames.length; i++) {
+                       tokenNames[i] = VOCABULARY.getLiteralName(i);
+                       if (tokenNames[i] == null) {
+                               tokenNames[i] = VOCABULARY.getSymbolicName(i);
+                       }
+
+                       if (tokenNames[i] == null) {
+                               tokenNames[i] = "<INVALID>";
+                       }
+               }
+       }
+
        @Override
-       public String getGrammarFileName() { return "OALParser.g4"; }
+       @Deprecated
+       public String[] getTokenNames() {
+               return tokenNames;
+       }
+
+       @Override
+
+       public Vocabulary getVocabulary() {
+               return VOCABULARY;
+       }
 
        @Override
-       public String[] getTokenNames() { return tokenNames; }
+       public String getGrammarFileName() { return "OALParser.g4"; }
 
        @Override
        public String[] getRuleNames() { return ruleNames; }
@@ -56,12 +96,12 @@ public class OALParser extends Parser {
                _interp = new 
ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
        }
        public static class RootContext extends ParserRuleContext {
-               public TerminalNode EOF() { return getToken(OALParser.EOF, 0); }
-               public MetricStatementsContext metricStatements() {
-                       return getRuleContext(MetricStatementsContext.class,0);
+               public List<AggregationStatementContext> aggregationStatement() 
{
+                       return 
getRuleContexts(AggregationStatementContext.class);
+               }
+               public AggregationStatementContext aggregationStatement(int i) {
+                       return 
getRuleContext(AggregationStatementContext.class,i);
                }
-               public TerminalNode DelimitedComment() { return 
getToken(OALParser.DelimitedComment, 0); }
-               public TerminalNode LineComment() { return 
getToken(OALParser.LineComment, 0); }
                public RootContext(ParserRuleContext parent, int invokingState) 
{
                        super(parent, invokingState);
                }
@@ -83,31 +123,20 @@ public class OALParser extends Parser {
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(9);
-                       switch ( 
getInterpreter().adaptivePredict(_input,0,_ctx) ) {
-                       case 1:
-                               {
-                               setState(8); metricStatements();
-                               }
-                               break;
-                       }
-                       setState(12);
+                       setState(19);
+                       _errHandler.sync(this);
                        _la = _input.LA(1);
-                       if (_la==DelimitedComment) {
+                       while (_la==IDENTIFIER) {
                                {
-                               setState(11); match(DelimitedComment);
-                               }
-                       }
-
-                       setState(15);
-                       _la = _input.LA(1);
-                       if (_la==LineComment) {
                                {
-                               setState(14); match(LineComment);
+                               setState(16);
+                               aggregationStatement();
+                               }
                                }
+                               setState(21);
+                               _errHandler.sync(this);
+                               _la = _input.LA(1);
                        }
-
-                       setState(17); match(EOF);
                        }
                }
                catch (RecognitionException re) {
@@ -121,46 +150,98 @@ public class OALParser extends Parser {
                return _localctx;
        }
 
-       public static class MetricStatementsContext extends ParserRuleContext {
-               public List<MetricStatementContext> metricStatement() {
-                       return getRuleContexts(MetricStatementContext.class);
+       public static class AggregationStatementContext extends 
ParserRuleContext {
+               public VariableContext variable() {
+                       return getRuleContext(VariableContext.class,0);
+               }
+               public TerminalNode EQUAL() { return getToken(OALParser.EQUAL, 
0); }
+               public MetricStatementContext metricStatement() {
+                       return getRuleContext(MetricStatementContext.class,0);
                }
-               public MetricStatementContext metricStatement(int i) {
-                       return getRuleContext(MetricStatementContext.class,i);
+               public TerminalNode SEMI() { return getToken(OALParser.SEMI, 
0); }
+               public TerminalNode EOF() { return getToken(OALParser.EOF, 0); }
+               public List<TerminalNode> SPACE() { return 
getTokens(OALParser.SPACE); }
+               public TerminalNode SPACE(int i) {
+                       return getToken(OALParser.SPACE, i);
                }
-               public MetricStatementsContext(ParserRuleContext parent, int 
invokingState) {
+               public TerminalNode DelimitedComment() { return 
getToken(OALParser.DelimitedComment, 0); }
+               public TerminalNode LineComment() { return 
getToken(OALParser.LineComment, 0); }
+               public AggregationStatementContext(ParserRuleContext parent, 
int invokingState) {
                        super(parent, invokingState);
                }
-               @Override public int getRuleIndex() { return 
RULE_metricStatements; }
+               @Override public int getRuleIndex() { return 
RULE_aggregationStatement; }
                @Override
                public void enterRule(ParseTreeListener listener) {
-                       if ( listener instanceof OALParserListener ) 
((OALParserListener)listener).enterMetricStatements(this);
+                       if ( listener instanceof OALParserListener ) 
((OALParserListener)listener).enterAggregationStatement(this);
                }
                @Override
                public void exitRule(ParseTreeListener listener) {
-                       if ( listener instanceof OALParserListener ) 
((OALParserListener)listener).exitMetricStatements(this);
+                       if ( listener instanceof OALParserListener ) 
((OALParserListener)listener).exitAggregationStatement(this);
                }
        }
 
-       public final MetricStatementsContext metricStatements() throws 
RecognitionException {
-               MetricStatementsContext _localctx = new 
MetricStatementsContext(_ctx, getState());
-               enterRule(_localctx, 2, RULE_metricStatements);
+       public final AggregationStatementContext aggregationStatement() throws 
RecognitionException {
+               AggregationStatementContext _localctx = new 
AggregationStatementContext(_ctx, getState());
+               enterRule(_localctx, 2, RULE_aggregationStatement);
                int _la;
                try {
                        enterOuterAlt(_localctx, 1);
                        {
                        setState(22);
+                       variable();
+                       setState(24);
+                       _errHandler.sync(this);
+                       _la = _input.LA(1);
+                       if (_la==SPACE) {
+                               {
+                               setState(23);
+                               match(SPACE);
+                               }
+                       }
+
+                       setState(26);
+                       match(EQUAL);
+                       setState(28);
                        _errHandler.sync(this);
                        _la = _input.LA(1);
-                       while (_la==FROM) {
+                       if (_la==SPACE) {
                                {
+                               setState(27);
+                               match(SPACE);
+                               }
+                       }
+
+                       setState(30);
+                       metricStatement();
+                       setState(32);
+                       _errHandler.sync(this);
+                       _la = _input.LA(1);
+                       if (_la==DelimitedComment) {
                                {
-                               setState(19); metricStatement();
+                               setState(31);
+                               match(DelimitedComment);
                                }
+                       }
+
+                       setState(35);
+                       _errHandler.sync(this);
+                       _la = _input.LA(1);
+                       if (_la==LineComment) {
+                               {
+                               setState(34);
+                               match(LineComment);
                                }
-                               setState(24);
-                               _errHandler.sync(this);
-                               _la = _input.LA(1);
+                       }
+
+                       setState(37);
+                       _la = _input.LA(1);
+                       if ( !(_la==EOF || _la==SEMI) ) {
+                       _errHandler.recoverInline(this);
+                       }
+                       else {
+                               if ( _input.LA(1)==Token.EOF ) matchedEOF = 
true;
+                               _errHandler.reportMatch(this);
+                               consume();
                        }
                        }
                }
@@ -176,11 +257,20 @@ public class OALParser extends Parser {
        }
 
        public static class MetricStatementContext extends ParserRuleContext {
+               public TerminalNode FROM() { return getToken(OALParser.FROM, 
0); }
+               public TerminalNode LR_BRACKET() { return 
getToken(OALParser.LR_BRACKET, 0); }
                public SourceContext source() {
                        return getRuleContext(SourceContext.class,0);
                }
-               public TerminalNode FROM() { return getToken(OALParser.FROM, 
0); }
+               public List<TerminalNode> DOT() { return 
getTokens(OALParser.DOT); }
+               public TerminalNode DOT(int i) {
+                       return getToken(OALParser.DOT, i);
+               }
                public TerminalNode IDENTIFIER() { return 
getToken(OALParser.IDENTIFIER, 0); }
+               public TerminalNode RR_BRACKET() { return 
getToken(OALParser.RR_BRACKET, 0); }
+               public AggregateFunctionContext aggregateFunction() {
+                       return getRuleContext(AggregateFunctionContext.class,0);
+               }
                public MetricStatementContext(ParserRuleContext parent, int 
invokingState) {
                        super(parent, invokingState);
                }
@@ -201,12 +291,22 @@ public class OALParser extends Parser {
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(25); match(FROM);
-                       setState(26); match(LR_BRACKET);
-                       setState(27); source();
-                       setState(28); match(DOT);
-                       setState(29); match(IDENTIFIER);
-                       setState(30); match(RR_BRACKET);
+                       setState(39);
+                       match(FROM);
+                       setState(40);
+                       match(LR_BRACKET);
+                       setState(41);
+                       source();
+                       setState(42);
+                       match(DOT);
+                       setState(43);
+                       match(IDENTIFIER);
+                       setState(44);
+                       match(RR_BRACKET);
+                       setState(45);
+                       match(DOT);
+                       setState(46);
+                       aggregateFunction();
                        }
                }
                catch (RecognitionException re) {
@@ -221,16 +321,16 @@ public class OALParser extends Parser {
        }
 
        public static class SourceContext extends ParserRuleContext {
+               public TerminalNode SRC_ALL() { return 
getToken(OALParser.SRC_ALL, 0); }
+               public TerminalNode SRC_SERVICE() { return 
getToken(OALParser.SRC_SERVICE, 0); }
+               public TerminalNode SRC_SERVICE_INSTANCE() { return 
getToken(OALParser.SRC_SERVICE_INSTANCE, 0); }
                public TerminalNode SRC_ENDPOINT() { return 
getToken(OALParser.SRC_ENDPOINT, 0); }
-               public TerminalNode SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL() { 
return getToken(OALParser.SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL, 0); }
-               public TerminalNode SRC_SERVICE_INSTANCE_JVM_CPU() { return 
getToken(OALParser.SRC_SERVICE_INSTANCE_JVM_CPU, 0); }
                public TerminalNode SRC_SERVICE_RELATION() { return 
getToken(OALParser.SRC_SERVICE_RELATION, 0); }
                public TerminalNode SRC_SERVICE_INSTANCE_RELATION() { return 
getToken(OALParser.SRC_SERVICE_INSTANCE_RELATION, 0); }
                public TerminalNode SRC_ENDPOINT_RELATION() { return 
getToken(OALParser.SRC_ENDPOINT_RELATION, 0); }
+               public TerminalNode SRC_SERVICE_INSTANCE_JVM_CPU() { return 
getToken(OALParser.SRC_SERVICE_INSTANCE_JVM_CPU, 0); }
                public TerminalNode SRC_SERVICE_INSTANCE_JVM_MEMORY() { return 
getToken(OALParser.SRC_SERVICE_INSTANCE_JVM_MEMORY, 0); }
-               public TerminalNode SRC_SERVICE_INSTANCE() { return 
getToken(OALParser.SRC_SERVICE_INSTANCE, 0); }
-               public TerminalNode SRC_ALL() { return 
getToken(OALParser.SRC_ALL, 0); }
-               public TerminalNode SRC_SERVICE() { return 
getToken(OALParser.SRC_SERVICE, 0); }
+               public TerminalNode SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL() { 
return getToken(OALParser.SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL, 0); }
                public SourceContext(ParserRuleContext parent, int 
invokingState) {
                        super(parent, invokingState);
                }
@@ -252,12 +352,182 @@ public class OALParser extends Parser {
                try {
                        enterOuterAlt(_localctx, 1);
                        {
-                       setState(32);
+                       setState(48);
                        _la = _input.LA(1);
                        if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << 
SRC_ALL) | (1L << SRC_SERVICE) | (1L << SRC_SERVICE_INSTANCE) | (1L << 
SRC_ENDPOINT) | (1L << SRC_SERVICE_RELATION) | (1L << 
SRC_SERVICE_INSTANCE_RELATION) | (1L << SRC_ENDPOINT_RELATION) | (1L << 
SRC_SERVICE_INSTANCE_JVM_CPU) | (1L << SRC_SERVICE_INSTANCE_JVM_MEMORY) | (1L 
<< SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL))) != 0)) ) {
                        _errHandler.recoverInline(this);
                        }
-                       consume();
+                       else {
+                               if ( _input.LA(1)==Token.EOF ) matchedEOF = 
true;
+                               _errHandler.reportMatch(this);
+                               consume();
+                       }
+                       }
+               }
+               catch (RecognitionException re) {
+                       _localctx.exception = re;
+                       _errHandler.reportError(this, re);
+                       _errHandler.recover(this, re);
+               }
+               finally {
+                       exitRule();
+               }
+               return _localctx;
+       }
+
+       public static class VariableContext extends ParserRuleContext {
+               public TerminalNode IDENTIFIER() { return 
getToken(OALParser.IDENTIFIER, 0); }
+               public VariableContext(ParserRuleContext parent, int 
invokingState) {
+                       super(parent, invokingState);
+               }
+               @Override public int getRuleIndex() { return RULE_variable; }
+               @Override
+               public void enterRule(ParseTreeListener listener) {
+                       if ( listener instanceof OALParserListener ) 
((OALParserListener)listener).enterVariable(this);
+               }
+               @Override
+               public void exitRule(ParseTreeListener listener) {
+                       if ( listener instanceof OALParserListener ) 
((OALParserListener)listener).exitVariable(this);
+               }
+       }
+
+       public final VariableContext variable() throws RecognitionException {
+               VariableContext _localctx = new VariableContext(_ctx, 
getState());
+               enterRule(_localctx, 8, RULE_variable);
+               try {
+                       enterOuterAlt(_localctx, 1);
+                       {
+                       setState(50);
+                       match(IDENTIFIER);
+                       }
+               }
+               catch (RecognitionException re) {
+                       _localctx.exception = re;
+                       _errHandler.reportError(this, re);
+                       _errHandler.recover(this, re);
+               }
+               finally {
+                       exitRule();
+               }
+               return _localctx;
+       }
+
+       public static class AggregateFunctionContext extends ParserRuleContext {
+               public FunctionNameContext functionName() {
+                       return getRuleContext(FunctionNameContext.class,0);
+               }
+               public TerminalNode LR_BRACKET() { return 
getToken(OALParser.LR_BRACKET, 0); }
+               public TerminalNode RR_BRACKET() { return 
getToken(OALParser.RR_BRACKET, 0); }
+               public FilterExpressionContext filterExpression() {
+                       return getRuleContext(FilterExpressionContext.class,0);
+               }
+               public AggregateFunctionContext(ParserRuleContext parent, int 
invokingState) {
+                       super(parent, invokingState);
+               }
+               @Override public int getRuleIndex() { return 
RULE_aggregateFunction; }
+               @Override
+               public void enterRule(ParseTreeListener listener) {
+                       if ( listener instanceof OALParserListener ) 
((OALParserListener)listener).enterAggregateFunction(this);
+               }
+               @Override
+               public void exitRule(ParseTreeListener listener) {
+                       if ( listener instanceof OALParserListener ) 
((OALParserListener)listener).exitAggregateFunction(this);
+               }
+       }
+
+       public final AggregateFunctionContext aggregateFunction() throws 
RecognitionException {
+               AggregateFunctionContext _localctx = new 
AggregateFunctionContext(_ctx, getState());
+               enterRule(_localctx, 10, RULE_aggregateFunction);
+               try {
+                       enterOuterAlt(_localctx, 1);
+                       {
+                       setState(52);
+                       functionName();
+                       setState(53);
+                       match(LR_BRACKET);
+                       setState(55);
+                       _errHandler.sync(this);
+                       switch ( 
getInterpreter().adaptivePredict(_input,5,_ctx) ) {
+                       case 1:
+                               {
+                               setState(54);
+                               filterExpression();
+                               }
+                               break;
+                       }
+                       setState(57);
+                       match(RR_BRACKET);
+                       }
+               }
+               catch (RecognitionException re) {
+                       _localctx.exception = re;
+                       _errHandler.reportError(this, re);
+                       _errHandler.recover(this, re);
+               }
+               finally {
+                       exitRule();
+               }
+               return _localctx;
+       }
+
+       public static class FunctionNameContext extends ParserRuleContext {
+               public TerminalNode IDENTIFIER() { return 
getToken(OALParser.IDENTIFIER, 0); }
+               public FunctionNameContext(ParserRuleContext parent, int 
invokingState) {
+                       super(parent, invokingState);
+               }
+               @Override public int getRuleIndex() { return RULE_functionName; 
}
+               @Override
+               public void enterRule(ParseTreeListener listener) {
+                       if ( listener instanceof OALParserListener ) 
((OALParserListener)listener).enterFunctionName(this);
+               }
+               @Override
+               public void exitRule(ParseTreeListener listener) {
+                       if ( listener instanceof OALParserListener ) 
((OALParserListener)listener).exitFunctionName(this);
+               }
+       }
+
+       public final FunctionNameContext functionName() throws 
RecognitionException {
+               FunctionNameContext _localctx = new FunctionNameContext(_ctx, 
getState());
+               enterRule(_localctx, 12, RULE_functionName);
+               try {
+                       enterOuterAlt(_localctx, 1);
+                       {
+                       setState(59);
+                       match(IDENTIFIER);
+                       }
+               }
+               catch (RecognitionException re) {
+                       _localctx.exception = re;
+                       _errHandler.reportError(this, re);
+                       _errHandler.recover(this, re);
+               }
+               finally {
+                       exitRule();
+               }
+               return _localctx;
+       }
+
+       public static class FilterExpressionContext extends ParserRuleContext {
+               public FilterExpressionContext(ParserRuleContext parent, int 
invokingState) {
+                       super(parent, invokingState);
+               }
+               @Override public int getRuleIndex() { return 
RULE_filterExpression; }
+               @Override
+               public void enterRule(ParseTreeListener listener) {
+                       if ( listener instanceof OALParserListener ) 
((OALParserListener)listener).enterFilterExpression(this);
+               }
+               @Override
+               public void exitRule(ParseTreeListener listener) {
+                       if ( listener instanceof OALParserListener ) 
((OALParserListener)listener).exitFilterExpression(this);
+               }
+       }
+
+       public final FilterExpressionContext filterExpression() throws 
RecognitionException {
+               FilterExpressionContext _localctx = new 
FilterExpressionContext(_ctx, getState());
+               enterRule(_localctx, 14, RULE_filterExpression);
+               try {
+                       enterOuterAlt(_localctx, 1);
+                       {
                        }
                }
                catch (RecognitionException re) {
@@ -272,17 +542,23 @@ public class OALParser extends Parser {
        }
 
        public static final String _serializedATN =
-               
"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3\32%\4\2\t\2\4\3\t"+
-               
"\3\4\4\t\4\4\5\t\5\3\2\5\2\f\n\2\3\2\5\2\17\n\2\3\2\5\2\22\n\2\3\2\3\2"+
-               
"\3\3\7\3\27\n\3\f\3\16\3\32\13\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3"+
-               
"\5\2\2\6\2\4\6\b\2\3\3\2\5\16$\2\13\3\2\2\2\4\30\3\2\2\2\6\33\3\2\2\2"+
-               
"\b\"\3\2\2\2\n\f\5\4\3\2\13\n\3\2\2\2\13\f\3\2\2\2\f\16\3\2\2\2\r\17\7"+
-               
"\23\2\2\16\r\3\2\2\2\16\17\3\2\2\2\17\21\3\2\2\2\20\22\7\24\2\2\21\20"+
-               
"\3\2\2\2\21\22\3\2\2\2\22\23\3\2\2\2\23\24\7\2\2\3\24\3\3\2\2\2\25\27"+
-               
"\5\6\4\2\26\25\3\2\2\2\27\32\3\2\2\2\30\26\3\2\2\2\30\31\3\2\2\2\31\5"+
-               
"\3\2\2\2\32\30\3\2\2\2\33\34\7\3\2\2\34\35\7\27\2\2\35\36\5\b\5\2\36\37"+
-               "\7\26\2\2\37 \7\25\2\2 
!\7\30\2\2!\7\3\2\2\2\"#\t\2\2\2#\t\3\2\2\2\6\13"+
-               "\16\21\30";
+               
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\34B\4\2\t\2\4\3\t"+
+               
"\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\3\2\7\2\24\n\2\f\2"+
+               
"\16\2\27\13\2\3\3\3\3\5\3\33\n\3\3\3\3\3\5\3\37\n\3\3\3\3\3\5\3#\n\3\3"+
+               
"\3\5\3&\n\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\6\3"+
+               
"\6\3\7\3\7\3\7\5\7:\n\7\3\7\3\7\3\b\3\b\3\t\3\t\3\t\2\2\n\2\4\6\b\n\f"+
+               
"\16\20\2\4\3\3\33\33\3\2\5\16\2?\2\25\3\2\2\2\4\30\3\2\2\2\6)\3\2\2\2"+
+               
"\b\62\3\2\2\2\n\64\3\2\2\2\f\66\3\2\2\2\16=\3\2\2\2\20?\3\2\2\2\22\24"+
+               
"\5\4\3\2\23\22\3\2\2\2\24\27\3\2\2\2\25\23\3\2\2\2\25\26\3\2\2\2\26\3"+
+               
"\3\2\2\2\27\25\3\2\2\2\30\32\5\n\6\2\31\33\7\25\2\2\32\31\3\2\2\2\32\33"+
+               
"\3\2\2\2\33\34\3\2\2\2\34\36\7\34\2\2\35\37\7\25\2\2\36\35\3\2\2\2\36"+
+               "\37\3\2\2\2\37 \3\2\2\2 
\"\5\6\4\2!#\7\23\2\2\"!\3\2\2\2\"#\3\2\2\2#%"+
+               
"\3\2\2\2$&\7\24\2\2%$\3\2\2\2%&\3\2\2\2&\'\3\2\2\2\'(\t\2\2\2(\5\3\2\2"+
+               
"\2)*\7\3\2\2*+\7\30\2\2+,\5\b\5\2,-\7\27\2\2-.\7\26\2\2./\7\31\2\2/\60"+
+               
"\7\27\2\2\60\61\5\f\7\2\61\7\3\2\2\2\62\63\t\3\2\2\63\t\3\2\2\2\64\65"+
+               
"\7\26\2\2\65\13\3\2\2\2\66\67\5\16\b\2\679\7\30\2\28:\5\20\t\298\3\2\2"+
+               
"\29:\3\2\2\2:;\3\2\2\2;<\7\31\2\2<\r\3\2\2\2=>\7\26\2\2>\17\3\2\2\2?@"+
+               "\3\2\2\2@\21\3\2\2\2\b\25\32\36\"%9";
        public static final ATN _ATN =
                new ATNDeserializer().deserialize(_serializedATN.toCharArray());
        static {
diff --git 
a/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParserBaseListener.java
 
b/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParserBaseListener.java
index 9a3aabe..d93d65f 100644
--- 
a/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParserBaseListener.java
+++ 
b/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParserBaseListener.java
@@ -1,8 +1,7 @@
-// Generated from org/apache/skywalking/oal/tool/grammar/OALParser.g4 by ANTLR 
4.3
+// Generated from org/apache/skywalking/oal/tool/grammar/OALParser.g4 by ANTLR 
4.7.1
 package org.apache.skywalking.oal.tool.grammar;
 
 import org.antlr.v4.runtime.ParserRuleContext;
-import org.antlr.v4.runtime.misc.NotNull;
 import org.antlr.v4.runtime.tree.ErrorNode;
 import org.antlr.v4.runtime.tree.TerminalNode;
 
@@ -17,75 +16,120 @@ public class OALParserBaseListener implements 
OALParserListener {
         *
         * <p>The default implementation does nothing.</p>
         */
-       @Override public void enterMetricStatements(@NotNull 
OALParser.MetricStatementsContext ctx) { }
+       @Override public void enterRoot(OALParser.RootContext ctx) { }
        /**
         * {@inheritDoc}
         *
         * <p>The default implementation does nothing.</p>
         */
-       @Override public void exitMetricStatements(@NotNull 
OALParser.MetricStatementsContext ctx) { }
-
+       @Override public void exitRoot(OALParser.RootContext ctx) { }
        /**
         * {@inheritDoc}
         *
         * <p>The default implementation does nothing.</p>
         */
-       @Override public void enterRoot(@NotNull OALParser.RootContext ctx) { }
+       @Override public void 
enterAggregationStatement(OALParser.AggregationStatementContext ctx) { }
        /**
         * {@inheritDoc}
         *
         * <p>The default implementation does nothing.</p>
         */
-       @Override public void exitRoot(@NotNull OALParser.RootContext ctx) { }
-
+       @Override public void 
exitAggregationStatement(OALParser.AggregationStatementContext ctx) { }
        /**
         * {@inheritDoc}
         *
         * <p>The default implementation does nothing.</p>
         */
-       @Override public void enterMetricStatement(@NotNull 
OALParser.MetricStatementContext ctx) { }
+       @Override public void 
enterMetricStatement(OALParser.MetricStatementContext ctx) { }
        /**
         * {@inheritDoc}
         *
         * <p>The default implementation does nothing.</p>
         */
-       @Override public void exitMetricStatement(@NotNull 
OALParser.MetricStatementContext ctx) { }
-
+       @Override public void 
exitMetricStatement(OALParser.MetricStatementContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void enterSource(OALParser.SourceContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void exitSource(OALParser.SourceContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void enterVariable(OALParser.VariableContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void exitVariable(OALParser.VariableContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void 
enterAggregateFunction(OALParser.AggregateFunctionContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void 
exitAggregateFunction(OALParser.AggregateFunctionContext ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void enterFunctionName(OALParser.FunctionNameContext 
ctx) { }
+       /**
+        * {@inheritDoc}
+        *
+        * <p>The default implementation does nothing.</p>
+        */
+       @Override public void exitFunctionName(OALParser.FunctionNameContext 
ctx) { }
        /**
         * {@inheritDoc}
         *
         * <p>The default implementation does nothing.</p>
         */
-       @Override public void enterSource(@NotNull OALParser.SourceContext ctx) 
{ }
+       @Override public void 
enterFilterExpression(OALParser.FilterExpressionContext ctx) { }
        /**
         * {@inheritDoc}
         *
         * <p>The default implementation does nothing.</p>
         */
-       @Override public void exitSource(@NotNull OALParser.SourceContext ctx) 
{ }
+       @Override public void 
exitFilterExpression(OALParser.FilterExpressionContext ctx) { }
 
        /**
         * {@inheritDoc}
         *
         * <p>The default implementation does nothing.</p>
         */
-       @Override public void enterEveryRule(@NotNull ParserRuleContext ctx) { }
+       @Override public void enterEveryRule(ParserRuleContext ctx) { }
        /**
         * {@inheritDoc}
         *
         * <p>The default implementation does nothing.</p>
         */
-       @Override public void exitEveryRule(@NotNull ParserRuleContext ctx) { }
+       @Override public void exitEveryRule(ParserRuleContext ctx) { }
        /**
         * {@inheritDoc}
         *
         * <p>The default implementation does nothing.</p>
         */
-       @Override public void visitTerminal(@NotNull TerminalNode node) { }
+       @Override public void visitTerminal(TerminalNode node) { }
        /**
         * {@inheritDoc}
         *
         * <p>The default implementation does nothing.</p>
         */
-       @Override public void visitErrorNode(@NotNull ErrorNode node) { }
+       @Override public void visitErrorNode(ErrorNode node) { }
 }
\ No newline at end of file
diff --git 
a/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParserListener.java
 
b/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParserListener.java
index 451ddc7..2287337 100644
--- 
a/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParserListener.java
+++ 
b/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParserListener.java
@@ -1,6 +1,5 @@
-// Generated from org/apache/skywalking/oal/tool/grammar/OALParser.g4 by ANTLR 
4.3
+// Generated from org/apache/skywalking/oal/tool/grammar/OALParser.g4 by ANTLR 
4.7.1
 package org.apache.skywalking.oal.tool.grammar;
-import org.antlr.v4.runtime.misc.NotNull;
 import org.antlr.v4.runtime.tree.ParseTreeListener;
 
 /**
@@ -9,46 +8,83 @@ import org.antlr.v4.runtime.tree.ParseTreeListener;
  */
 public interface OALParserListener extends ParseTreeListener {
        /**
-        * Enter a parse tree produced by {@link OALParser#metricStatements}.
+        * Enter a parse tree produced by {@link OALParser#root}.
         * @param ctx the parse tree
         */
-       void enterMetricStatements(@NotNull OALParser.MetricStatementsContext 
ctx);
+       void enterRoot(OALParser.RootContext ctx);
        /**
-        * Exit a parse tree produced by {@link OALParser#metricStatements}.
+        * Exit a parse tree produced by {@link OALParser#root}.
         * @param ctx the parse tree
         */
-       void exitMetricStatements(@NotNull OALParser.MetricStatementsContext 
ctx);
-
+       void exitRoot(OALParser.RootContext ctx);
        /**
-        * Enter a parse tree produced by {@link OALParser#root}.
+        * Enter a parse tree produced by {@link 
OALParser#aggregationStatement}.
         * @param ctx the parse tree
         */
-       void enterRoot(@NotNull OALParser.RootContext ctx);
+       void enterAggregationStatement(OALParser.AggregationStatementContext 
ctx);
        /**
-        * Exit a parse tree produced by {@link OALParser#root}.
+        * Exit a parse tree produced by {@link OALParser#aggregationStatement}.
         * @param ctx the parse tree
         */
-       void exitRoot(@NotNull OALParser.RootContext ctx);
-
+       void exitAggregationStatement(OALParser.AggregationStatementContext 
ctx);
        /**
         * Enter a parse tree produced by {@link OALParser#metricStatement}.
         * @param ctx the parse tree
         */
-       void enterMetricStatement(@NotNull OALParser.MetricStatementContext 
ctx);
+       void enterMetricStatement(OALParser.MetricStatementContext ctx);
        /**
         * Exit a parse tree produced by {@link OALParser#metricStatement}.
         * @param ctx the parse tree
         */
-       void exitMetricStatement(@NotNull OALParser.MetricStatementContext ctx);
-
+       void exitMetricStatement(OALParser.MetricStatementContext ctx);
        /**
         * Enter a parse tree produced by {@link OALParser#source}.
         * @param ctx the parse tree
         */
-       void enterSource(@NotNull OALParser.SourceContext ctx);
+       void enterSource(OALParser.SourceContext ctx);
        /**
         * Exit a parse tree produced by {@link OALParser#source}.
         * @param ctx the parse tree
         */
-       void exitSource(@NotNull OALParser.SourceContext ctx);
+       void exitSource(OALParser.SourceContext ctx);
+       /**
+        * Enter a parse tree produced by {@link OALParser#variable}.
+        * @param ctx the parse tree
+        */
+       void enterVariable(OALParser.VariableContext ctx);
+       /**
+        * Exit a parse tree produced by {@link OALParser#variable}.
+        * @param ctx the parse tree
+        */
+       void exitVariable(OALParser.VariableContext ctx);
+       /**
+        * Enter a parse tree produced by {@link OALParser#aggregateFunction}.
+        * @param ctx the parse tree
+        */
+       void enterAggregateFunction(OALParser.AggregateFunctionContext ctx);
+       /**
+        * Exit a parse tree produced by {@link OALParser#aggregateFunction}.
+        * @param ctx the parse tree
+        */
+       void exitAggregateFunction(OALParser.AggregateFunctionContext ctx);
+       /**
+        * Enter a parse tree produced by {@link OALParser#functionName}.
+        * @param ctx the parse tree
+        */
+       void enterFunctionName(OALParser.FunctionNameContext ctx);
+       /**
+        * Exit a parse tree produced by {@link OALParser#functionName}.
+        * @param ctx the parse tree
+        */
+       void exitFunctionName(OALParser.FunctionNameContext ctx);
+       /**
+        * Enter a parse tree produced by {@link OALParser#filterExpression}.
+        * @param ctx the parse tree
+        */
+       void enterFilterExpression(OALParser.FilterExpressionContext ctx);
+       /**
+        * Exit a parse tree produced by {@link OALParser#filterExpression}.
+        * @param ctx the parse tree
+        */
+       void exitFilterExpression(OALParser.FilterExpressionContext ctx);
 }
\ No newline at end of file
diff --git a/oal-syntax/target/maven-archiver/pom.properties 
b/oal-syntax/target/maven-archiver/pom.properties
deleted file mode 100644
index c7b0c7a..0000000
--- a/oal-syntax/target/maven-archiver/pom.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-#Created by Apache Maven 3.3.9
-version=1.0-SNAPSHOT
-groupId=org.apache.skywalking
-artifactId=oal-syntax
diff --git 
a/oal-syntax/target/maven-shared-archive-resources/META-INF/DEPENDENCIES 
b/oal-syntax/target/maven-shared-archive-resources/META-INF/DEPENDENCIES
index d7e502c..2764812 100644
--- a/oal-syntax/target/maven-shared-archive-resources/META-INF/DEPENDENCIES
+++ b/oal-syntax/target/maven-shared-archive-resources/META-INF/DEPENDENCIES
@@ -28,10 +28,6 @@ From: 'Oracle' (http://www.oracle.com)
   - JSR 353 (JSON Processing) Default Provider (http://jsonp.java.net) 
org.glassfish:javax.json:bundle:1.0.4
     License: Dual license consisting of the CDDL v1.1 and GPL v2  
(https://glassfish.java.net/public/CDDL+GPL_1_1.html)
 
-From: 'The Apache Software Foundation' (https://www.apache.org/)
-  - Apache Commons CLI (http://commons.apache.org/proper/commons-cli/) 
commons-cli:commons-cli:jar:1.4
-    License: Apache License, Version 2.0  
(https://www.apache.org/licenses/LICENSE-2.0.txt)
-
 
 
 
diff --git a/oal-syntax/target/maven-status/antlr4/dependencies.ser 
b/oal-syntax/target/maven-status/antlr4/dependencies.ser
new file mode 100644
index 0000000..4b68ebf
Binary files /dev/null and 
b/oal-syntax/target/maven-status/antlr4/dependencies.ser differ
diff --git 
a/oal-syntax/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
 
b/oal-syntax/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
index 32fa965..eef357d 100644
--- 
a/oal-syntax/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
+++ 
b/oal-syntax/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
@@ -1,9 +1,12 @@
 org/apache/skywalking/oal/tool/grammar/OALParser$MetricStatementContext.class
-org/apache/skywalking/oal/tool/grammar/OALParserListener.class
-org/apache/skywalking/oal/tool/grammar/OALParser$MetricStatementsContext.class
+org/apache/skywalking/oal/tool/grammar/OALParser$AggregateFunctionContext.class
+org/apache/skywalking/oal/tool/grammar/OALParser$VariableContext.class
 org/apache/skywalking/oal/tool/grammar/OALLexer.class
-org/apache/skywalking/oal/tool/grammar/OALParserBaseListener.class
-org/apache/skywalking/oal/tool/grammar/OALParser$RootContext.class
-org/apache/skywalking/oal/tool/Main.class
+org/apache/skywalking/oal/tool/grammar/OALParser$AggregationStatementContext.class
 org/apache/skywalking/oal/tool/grammar/OALParser$SourceContext.class
 org/apache/skywalking/oal/tool/grammar/OALParser.class
+org/apache/skywalking/oal/tool/grammar/OALParserListener.class
+org/apache/skywalking/oal/tool/grammar/OALParser$FilterExpressionContext.class
+org/apache/skywalking/oal/tool/grammar/OALParser$FunctionNameContext.class
+org/apache/skywalking/oal/tool/grammar/OALParserBaseListener.class
+org/apache/skywalking/oal/tool/grammar/OALParser$RootContext.class
diff --git 
a/oal-syntax/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
 
b/oal-syntax/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
index d51dcd0..0273d5e 100644
--- 
a/oal-syntax/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
+++ 
b/oal-syntax/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -1,5 +1,4 @@
 
/Users/wusheng/Documents/GitHub/incubator-skywalking-oal-tool/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParserBaseListener.java
-/Users/wusheng/Documents/GitHub/incubator-skywalking-oal-tool/oal-syntax/src/main/java/org/apache/skywalking/oal/tool/Main.java
 
/Users/wusheng/Documents/GitHub/incubator-skywalking-oal-tool/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.java
 
/Users/wusheng/Documents/GitHub/incubator-skywalking-oal-tool/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.java
 
/Users/wusheng/Documents/GitHub/incubator-skywalking-oal-tool/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParserListener.java
diff --git 
a/oal-syntax/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
 
b/oal-syntax/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
deleted file mode 100644
index e69de29..0000000
diff --git a/oal-syntax/target/oal-syntax-1.0-SNAPSHOT.jar 
b/oal-syntax/target/oal-syntax-1.0-SNAPSHOT.jar
deleted file mode 100644
index 9dd4b56..0000000
Binary files a/oal-syntax/target/oal-syntax-1.0-SNAPSHOT.jar and /dev/null 
differ
diff --git a/oal-syntax/target/rat.txt b/oal-syntax/target/rat.txt
deleted file mode 100644
index 1c3a757..0000000
--- a/oal-syntax/target/rat.txt
+++ /dev/null
@@ -1,32 +0,0 @@
-
-*****************************************************
-Summary
--------
-Generated at: 2018-08-01T22:31:10+08:00
-
-Notes: 0
-Binaries: 0
-Archives: 0
-Standards: 6
-
-Apache Licensed: 6
-Generated Documents: 0
-
-JavaDocs are generated, thus a license header is optional.
-Generated files do not require license headers.
-
-0 Unknown Licenses
-
-*****************************************************
-  Files with Apache License headers will be marked AL
-  Binary files (which do not require any license headers) will be marked B
-  Compressed archives will be marked A
-  Notices, licenses etc. will be marked N
-  AL    
/Users/wusheng/Documents/GitHub/incubator-skywalking-oal-tool/oal-syntax/pom.xml
-  AL    
/Users/wusheng/Documents/GitHub/incubator-skywalking-oal-tool/oal-syntax/src/test/resources/oal_test.oal
-  AL    
/Users/wusheng/Documents/GitHub/incubator-skywalking-oal-tool/oal-syntax/src/main/java/org/apache/skywalking/oal/tool/Main.java
-  AL    
/Users/wusheng/Documents/GitHub/incubator-skywalking-oal-tool/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.tokens
-  AL    
/Users/wusheng/Documents/GitHub/incubator-skywalking-oal-tool/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.g4
-  AL    
/Users/wusheng/Documents/GitHub/incubator-skywalking-oal-tool/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.g4
- 
-*****************************************************
diff --git a/oal-syntax/target/test-classes/META-INF/DEPENDENCIES 
b/oal-syntax/target/test-classes/META-INF/DEPENDENCIES
deleted file mode 100644
index d7e502c..0000000
--- a/oal-syntax/target/test-classes/META-INF/DEPENDENCIES
+++ /dev/null
@@ -1,37 +0,0 @@
-// ------------------------------------------------------------------
-// Transitive dependencies of this project determined from the
-// maven pom organized by organization.
-// ------------------------------------------------------------------
-
-oal-syntax
-
-
-From: 'abego Software GmbH, Germany' (http://abego-software.de)
-  - abego TreeLayout Core (http://treelayout.sourceforge.net) 
org.abego.treelayout:org.abego.treelayout.core:bundle:1.0.3
-    License: BSD 3-Clause "New" or "Revised" License (BSD-3-Clause)  
(http://www.abego-software.de/legal/apl-v10.html)
-
-From: 'an unknown organization'
-  - ICU4J (http://icu-project.org/) com.ibm.icu:icu4j:jar:58.2
-    License: Unicode/ICU License  
(http://source.icu-project.org/repos/icu/trunk/icu4j/main/shared/licenses/LICENSE)
-  - StringTemplate 4 (http://www.stringtemplate.org) org.antlr:ST4:jar:4.0.8
-    License: BSD licence  (http://antlr.org/license.html)
-
-From: 'ANTLR' (http://www.antlr.org)
-  - ANTLR 3 Runtime (http://www.antlr.org) org.antlr:antlr-runtime:jar:3.5.2
-    License: BSD licence  (http://antlr.org/license.html)
-  - ANTLR 4 Tool (http://www.antlr.org) org.antlr:antlr4:jar:4.7.1
-    License: The BSD License  (http://www.antlr.org/license.html)
-  - ANTLR 4 Runtime (http://www.antlr.org/antlr4-runtime) 
org.antlr:antlr4-runtime:jar:4.7.1
-    License: The BSD License  (http://www.antlr.org/license.html)
-
-From: 'Oracle' (http://www.oracle.com)
-  - JSR 353 (JSON Processing) Default Provider (http://jsonp.java.net) 
org.glassfish:javax.json:bundle:1.0.4
-    License: Dual license consisting of the CDDL v1.1 and GPL v2  
(https://glassfish.java.net/public/CDDL+GPL_1_1.html)
-
-From: 'The Apache Software Foundation' (https://www.apache.org/)
-  - Apache Commons CLI (http://commons.apache.org/proper/commons-cli/) 
commons-cli:commons-cli:jar:1.4
-    License: Apache License, Version 2.0  
(https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-
-
-
diff --git a/oal-syntax/target/test-classes/META-INF/LICENSE 
b/oal-syntax/target/test-classes/META-INF/LICENSE
deleted file mode 100644
index d645695..0000000
--- a/oal-syntax/target/test-classes/META-INF/LICENSE
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
diff --git a/oal-syntax/target/test-classes/META-INF/NOTICE 
b/oal-syntax/target/test-classes/META-INF/NOTICE
deleted file mode 100644
index 82d5ff9..0000000
--- a/oal-syntax/target/test-classes/META-INF/NOTICE
+++ /dev/null
@@ -1,8 +0,0 @@
-
-oal-syntax
-Copyright 2018 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-
diff --git a/pom.xml b/pom.xml
index 14c47de..367b3f2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,6 +10,7 @@
     <version>1.0-SNAPSHOT</version>
     <modules>
         <module>oal-syntax</module>
+        <module>oal-parser</module>
     </modules>
 
     <parent>
diff --git a/target/rat.txt b/target/rat.txt
deleted file mode 100644
index 6fc5444..0000000
--- a/target/rat.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-
-*****************************************************
-Summary
--------
-Generated at: 2018-08-01T22:31:09+08:00
-
-Notes: 2
-Binaries: 0
-Archives: 0
-Standards: 2
-
-Apache Licensed: 2
-Generated Documents: 0
-
-JavaDocs are generated, thus a license header is optional.
-Generated files do not require license headers.
-
-0 Unknown Licenses
-
-*****************************************************
-  Files with Apache License headers will be marked AL
-  Binary files (which do not require any license headers) will be marked B
-  Compressed archives will be marked A
-  Notices, licenses etc. will be marked N
-  N     LICENSE
-  AL    pom.xml
-  N     NOTICE
-  AL    HEADER
- 
-*****************************************************

Reply via email to