Finish a g4 draft and command parser.
diff --git a/oal-syntax/pom.xml b/oal-syntax/pom.xml
index 19a93a4..7d847bb 100644
--- a/oal-syntax/pom.xml
+++ b/oal-syntax/pom.xml
@@ -36,6 +36,11 @@
             <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>
diff --git a/oal-syntax/src/main/antlr4/Expr.g4 b/oal-syntax/src/main/antlr4/Expr.g4
deleted file mode 100644
index ea22cfc..0000000
--- a/oal-syntax/src/main/antlr4/Expr.g4
+++ /dev/null
@@ -1,9 +0,0 @@
-grammar Expr;
-prog:	(expr NEWLINE)* ;
-expr:	expr ('*'|'/') expr
-    |	expr ('+'|'-') expr
-    |	INT
-    |	'(' expr ')'
-    ;
-NEWLINE : [\r\n]+ ;
-INT     : [0-9]+ ;
\ No newline at end of file
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
new file mode 100644
index 0000000..9345bc9
--- /dev/null
+++ b/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.g4
@@ -0,0 +1,103 @@
+/*
+ * 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.
+ *
+ */
+
+
+// Observability Analysis Language lexer
+lexer grammar OALLexer;
+
+@Header {package org.apache.skywalking.oal.tool.grammar;}
+
+// Keywords
+
+FROM: 'from';
+FILTER: 'filter';
+SRC_ALL: 'All';
+SRC_SERVICE: 'Service';
+SRC_SERVICE_INSTANCE: 'ServiceInstance';
+SRC_ENDPOINT: 'Endpoint';
+SRC_SERVICE_RELATION: 'ServiceRelation';
+SRC_SERVICE_INSTANCE_RELATION: 'ServiceInstanceRelation';
+SRC_ENDPOINT_RELATION: 'EndpointRelation';
+SRC_SERVICE_INSTANCE_JVM_CPU: 'ServiceInstance_JVM_CPU';
+SRC_SERVICE_INSTANCE_JVM_MEMORY: 'ServiceInstance_JVM_CPU';
+SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL: 'ServiceInstance_JVM_Memory_Pool';
+
+// Literals
+
+DECIMAL_LITERAL:    ('0' | [1-9] (Digits? | '_'+ Digits)) [lL]?;
+
+BOOL_LITERAL:       'true'
+            |       'false'
+            ;
+
+CHAR_LITERAL:       '\'' (~['\\\r\n] | EscapeSequence) '\'';
+
+STRING_LITERAL:     '"' (~["\\\r\n] | EscapeSequence)* '"';
+
+DelimitedComment
+    : '/*' ( DelimitedComment | . )*? '*/'
+      -> channel(HIDDEN)
+    ;
+
+LineComment
+    : '//' ~[\u000A\u000D]*
+      -> channel(HIDDEN)
+    ;
+
+// Identifiers
+
+IDENTIFIER:         Letter LetterOrDigit*;
+
+// Fragment rules
+
+fragment EscapeSequence
+    : '\\' [btnfr"'\\]
+    | '\\' ([0-3]? [0-7])? [0-7]
+    | '\\' 'u'+ HexDigit HexDigit HexDigit HexDigit
+    ;
+
+fragment HexDigits
+    : HexDigit ((HexDigit | '_')* HexDigit)?
+    ;
+
+fragment HexDigit
+    : [0-9a-fA-F]
+    ;
+
+fragment Digits
+    : [0-9] ([0-9_]* [0-9])?
+    ;
+
+fragment LetterOrDigit
+    : Letter
+    | [0-9]
+    ;
+
+fragment Letter
+    : [a-zA-Z$_] // these are the "java letters" below 0x7F
+    | ~[\u0000-\u007F\uD800-\uDBFF] // covers all characters above 0x7F which are not a surrogate
+    | [\uD800-\uDBFF] [\uDC00-\uDFFF] // covers UTF-16 surrogate pairs encodings for U+10000 to U+10FFFF
+    ;
+
+// Constructors symbols
+
+DOT:                                 '.';
+LR_BRACKET:                          '(';
+RR_BRACKET:                          ')';
+COMMA:                               ',';
+SEMI:                                ';';
\ 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
new file mode 100644
index 0000000..d245282
--- /dev/null
+++ b/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.tokens
@@ -0,0 +1,39 @@
+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
+IDENTIFIER=19
+DOT=20
+LR_BRACKET=21
+RR_BRACKET=22
+COMMA=23
+SEMI=24
+'from'=1
+'filter'=2
+'All'=3
+'Service'=4
+'ServiceInstance'=5
+'Endpoint'=6
+'ServiceRelation'=7
+'ServiceInstanceRelation'=8
+'EndpointRelation'=9
+'ServiceInstance_JVM_Memory_Pool'=12
+'.'=20
+'('=21
+')'=22
+','=23
+';'=24
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
new file mode 100644
index 0000000..65fdff1
--- /dev/null
+++ b/oal-syntax/src/main/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.g4
@@ -0,0 +1,44 @@
+/*
+ * 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.
+ *
+ */
+
+parser grammar OALParser;
+
+@Header {package org.apache.skywalking.oal.tool.grammar;}
+
+options { tokenVocab=OALLexer; }
+
+
+// Top Level Description
+
+root
+    : metricStatements? DelimitedComment ? LineComment ? EOF
+    ;
+
+metricStatements
+    : metricStatement*
+    ;
+
+metricStatement
+    : FROM '(' source  '.' IDENTIFIER ')'
+    ;
+
+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
+    ;
\ No newline at end of file
diff --git a/oal-syntax/src/main/java/org/apache/skywalking/oal/tool/Main.java b/oal-syntax/src/main/java/org/apache/skywalking/oal/tool/Main.java
new file mode 100644
index 0000000..19880c5
--- /dev/null
+++ b/oal-syntax/src/main/java/org/apache/skywalking/oal/tool/Main.java
@@ -0,0 +1,48 @@
+/*
+ * 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;
+
+import java.io.File;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+
+/**
+ * The main of SkyWalking OAL tool
+ */
+public class Main {
+    public static void main(String[] args) throws ParseException {
+        Options options = new Options();
+        options.addRequiredOption("s", "script-filepath", true, "Need the absolute file path of OAL script.");
+        options.addRequiredOption("o", "output", true, "Need the root output folder of the generated codes.");
+
+        CommandLineParser parser = new DefaultParser();
+        CommandLine line = parser.parse( options, args );
+
+        String scriptFilePath = line.getOptionValue("s");
+        String outputPath = line.getOptionValue("o");
+
+        File scriptFile = new File(scriptFilePath);
+        if (!scriptFile.exists()) {
+            throw new IllegalArgumentException("OAL script file [" + scriptFilePath + "] doesn't exist");
+        }
+    }
+}
diff --git a/oal-syntax/src/test/resources/oal_test.oal b/oal-syntax/src/test/resources/oal_test.oal
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/oal-syntax/src/test/resources/oal_test.oal
diff --git a/oal-syntax/target/classes/ExprBaseListener.class b/oal-syntax/target/classes/ExprBaseListener.class
deleted file mode 100644
index 732ec58..0000000
--- a/oal-syntax/target/classes/ExprBaseListener.class
+++ /dev/null
Binary files differ
diff --git a/oal-syntax/target/classes/ExprLexer.class b/oal-syntax/target/classes/ExprLexer.class
deleted file mode 100644
index 1626812..0000000
--- a/oal-syntax/target/classes/ExprLexer.class
+++ /dev/null
Binary files differ
diff --git a/oal-syntax/target/classes/ExprListener.class b/oal-syntax/target/classes/ExprListener.class
deleted file mode 100644
index 08fbdfc..0000000
--- a/oal-syntax/target/classes/ExprListener.class
+++ /dev/null
Binary files differ
diff --git a/oal-syntax/target/classes/ExprParser$ExprContext.class b/oal-syntax/target/classes/ExprParser$ExprContext.class
deleted file mode 100644
index 8619253..0000000
--- a/oal-syntax/target/classes/ExprParser$ExprContext.class
+++ /dev/null
Binary files differ
diff --git a/oal-syntax/target/classes/ExprParser$ProgContext.class b/oal-syntax/target/classes/ExprParser$ProgContext.class
deleted file mode 100644
index 015b59a..0000000
--- a/oal-syntax/target/classes/ExprParser$ProgContext.class
+++ /dev/null
Binary files differ
diff --git a/oal-syntax/target/classes/ExprParser.class b/oal-syntax/target/classes/ExprParser.class
deleted file mode 100644
index e920973..0000000
--- a/oal-syntax/target/classes/ExprParser.class
+++ /dev/null
Binary files differ
diff --git a/oal-syntax/target/classes/META-INF/DEPENDENCIES b/oal-syntax/target/classes/META-INF/DEPENDENCIES
index 2764812..d7e502c 100644
--- a/oal-syntax/target/classes/META-INF/DEPENDENCIES
+++ b/oal-syntax/target/classes/META-INF/DEPENDENCIES
@@ -28,6 +28,10 @@
   - 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/classes/org/apache/skywalking/oal/tool/Main.class b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/Main.class
new file mode 100644
index 0000000..5a3be3b
--- /dev/null
+++ b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/Main.class
Binary files differ
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
new file mode 100644
index 0000000..f9557cc
--- /dev/null
+++ b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALLexer.class
Binary files 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
new file mode 100644
index 0000000..16ec3bc
--- /dev/null
+++ b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$MetricStatementContext.class
Binary files 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
new file mode 100644
index 0000000..9f50c4b
--- /dev/null
+++ b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$MetricStatementsContext.class
Binary files 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
new file mode 100644
index 0000000..846b9bf
--- /dev/null
+++ b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$RootContext.class
Binary files 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
new file mode 100644
index 0000000..6dc4fd1
--- /dev/null
+++ b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser$SourceContext.class
Binary files 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
new file mode 100644
index 0000000..ce89ba0
--- /dev/null
+++ b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParser.class
Binary files differ
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
new file mode 100644
index 0000000..b79a112
--- /dev/null
+++ b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParserBaseListener.class
Binary files 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
new file mode 100644
index 0000000..5f93eea
--- /dev/null
+++ b/oal-syntax/target/classes/org/apache/skywalking/oal/tool/grammar/OALParserListener.class
Binary files differ
diff --git a/oal-syntax/target/generated-sources/antlr4/Expr.tokens b/oal-syntax/target/generated-sources/antlr4/Expr.tokens
deleted file mode 100644
index ea8dd4d..0000000
--- a/oal-syntax/target/generated-sources/antlr4/Expr.tokens
+++ /dev/null
@@ -1,14 +0,0 @@
-T__5=1
-NEWLINE=7
-T__4=2
-T__3=3
-T__2=4
-T__1=5
-T__0=6
-INT=8
-'-'=6
-'+'=5
-'*'=4
-')'=3
-'('=2
-'/'=1
diff --git a/oal-syntax/target/generated-sources/antlr4/ExprBaseListener.java b/oal-syntax/target/generated-sources/antlr4/ExprBaseListener.java
deleted file mode 100644
index 5087b09..0000000
--- a/oal-syntax/target/generated-sources/antlr4/ExprBaseListener.java
+++ /dev/null
@@ -1,64 +0,0 @@
-// Generated from Expr.g4 by ANTLR 4.3
-
-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;
-
-/**
- * This class provides an empty implementation of {@link ExprListener},
- * which can be extended to create a listener which only needs to handle a subset
- * of the available methods.
- */
-public class ExprBaseListener implements ExprListener {
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation does nothing.</p>
-	 */
-	@Override public void enterExpr(@NotNull ExprParser.ExprContext ctx) { }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation does nothing.</p>
-	 */
-	@Override public void exitExpr(@NotNull ExprParser.ExprContext ctx) { }
-
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation does nothing.</p>
-	 */
-	@Override public void enterProg(@NotNull ExprParser.ProgContext ctx) { }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation does nothing.</p>
-	 */
-	@Override public void exitProg(@NotNull ExprParser.ProgContext ctx) { }
-
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation does nothing.</p>
-	 */
-	@Override public void enterEveryRule(@NotNull ParserRuleContext ctx) { }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation does nothing.</p>
-	 */
-	@Override public void exitEveryRule(@NotNull ParserRuleContext ctx) { }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation does nothing.</p>
-	 */
-	@Override public void visitTerminal(@NotNull TerminalNode node) { }
-	/**
-	 * {@inheritDoc}
-	 *
-	 * <p>The default implementation does nothing.</p>
-	 */
-	@Override public void visitErrorNode(@NotNull ErrorNode node) { }
-}
\ No newline at end of file
diff --git a/oal-syntax/target/generated-sources/antlr4/ExprLexer.java b/oal-syntax/target/generated-sources/antlr4/ExprLexer.java
deleted file mode 100644
index e44c300..0000000
--- a/oal-syntax/target/generated-sources/antlr4/ExprLexer.java
+++ /dev/null
@@ -1,77 +0,0 @@
-// Generated from Expr.g4 by ANTLR 4.3
-import org.antlr.v4.runtime.Lexer;
-import org.antlr.v4.runtime.CharStream;
-import org.antlr.v4.runtime.Token;
-import org.antlr.v4.runtime.TokenStream;
-import org.antlr.v4.runtime.*;
-import org.antlr.v4.runtime.atn.*;
-import org.antlr.v4.runtime.dfa.DFA;
-import org.antlr.v4.runtime.misc.*;
-
-@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
-public class ExprLexer extends Lexer {
-	static { RuntimeMetaData.checkVersion("4.3", RuntimeMetaData.VERSION); }
-
-	protected static final DFA[] _decisionToDFA;
-	protected static final PredictionContextCache _sharedContextCache =
-		new PredictionContextCache();
-	public static final int
-		T__5=1, T__4=2, T__3=3, T__2=4, T__1=5, T__0=6, NEWLINE=7, INT=8;
-	public static String[] modeNames = {
-		"DEFAULT_MODE"
-	};
-
-	public static final String[] tokenNames = {
-		"'\\u0000'", "'\\u0001'", "'\\u0002'", "'\\u0003'", "'\\u0004'", "'\\u0005'", 
-		"'\\u0006'", "'\\u0007'", "'\b'"
-	};
-	public static final String[] ruleNames = {
-		"T__5", "T__4", "T__3", "T__2", "T__1", "T__0", "NEWLINE", "INT"
-	};
-
-
-	public ExprLexer(CharStream input) {
-		super(input);
-		_interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
-	}
-
-	@Override
-	public String getGrammarFileName() { return "Expr.g4"; }
-
-	@Override
-	public String[] getTokenNames() { return tokenNames; }
-
-	@Override
-	public String[] getRuleNames() { return ruleNames; }
-
-	@Override
-	public String getSerializedATN() { return _serializedATN; }
-
-	@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\n)\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\3\2\3\2\3\3\3\3"+
-		"\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\b\6\b!\n\b\r\b\16\b\"\3\t\6\t&\n\t"+
-		"\r\t\16\t\'\2\2\n\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\3\2\4\4\2\f\f\17"+
-		"\17\3\2\62;*\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\3\23\3\2\2\2\5\25\3\2\2\2\7"+
-		"\27\3\2\2\2\t\31\3\2\2\2\13\33\3\2\2\2\r\35\3\2\2\2\17 \3\2\2\2\21%\3"+
-		"\2\2\2\23\24\7\61\2\2\24\4\3\2\2\2\25\26\7*\2\2\26\6\3\2\2\2\27\30\7+"+
-		"\2\2\30\b\3\2\2\2\31\32\7,\2\2\32\n\3\2\2\2\33\34\7-\2\2\34\f\3\2\2\2"+
-		"\35\36\7/\2\2\36\16\3\2\2\2\37!\t\2\2\2 \37\3\2\2\2!\"\3\2\2\2\" \3\2"+
-		"\2\2\"#\3\2\2\2#\20\3\2\2\2$&\t\3\2\2%$\3\2\2\2&\'\3\2\2\2\'%\3\2\2\2"+
-		"\'(\3\2\2\2(\22\3\2\2\2\5\2\"\'\2";
-	public static final ATN _ATN =
-		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
-	static {
-		_decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
-		for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
-			_decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
-		}
-	}
-}
\ No newline at end of file
diff --git a/oal-syntax/target/generated-sources/antlr4/ExprLexer.tokens b/oal-syntax/target/generated-sources/antlr4/ExprLexer.tokens
deleted file mode 100644
index ea8dd4d..0000000
--- a/oal-syntax/target/generated-sources/antlr4/ExprLexer.tokens
+++ /dev/null
@@ -1,14 +0,0 @@
-T__5=1
-NEWLINE=7
-T__4=2
-T__3=3
-T__2=4
-T__1=5
-T__0=6
-INT=8
-'-'=6
-'+'=5
-'*'=4
-')'=3
-'('=2
-'/'=1
diff --git a/oal-syntax/target/generated-sources/antlr4/ExprListener.java b/oal-syntax/target/generated-sources/antlr4/ExprListener.java
deleted file mode 100644
index 30832ca..0000000
--- a/oal-syntax/target/generated-sources/antlr4/ExprListener.java
+++ /dev/null
@@ -1,31 +0,0 @@
-// Generated from Expr.g4 by ANTLR 4.3
-import org.antlr.v4.runtime.misc.NotNull;
-import org.antlr.v4.runtime.tree.ParseTreeListener;
-
-/**
- * This interface defines a complete listener for a parse tree produced by
- * {@link ExprParser}.
- */
-public interface ExprListener extends ParseTreeListener {
-	/**
-	 * Enter a parse tree produced by {@link ExprParser#expr}.
-	 * @param ctx the parse tree
-	 */
-	void enterExpr(@NotNull ExprParser.ExprContext ctx);
-	/**
-	 * Exit a parse tree produced by {@link ExprParser#expr}.
-	 * @param ctx the parse tree
-	 */
-	void exitExpr(@NotNull ExprParser.ExprContext ctx);
-
-	/**
-	 * Enter a parse tree produced by {@link ExprParser#prog}.
-	 * @param ctx the parse tree
-	 */
-	void enterProg(@NotNull ExprParser.ProgContext ctx);
-	/**
-	 * Exit a parse tree produced by {@link ExprParser#prog}.
-	 * @param ctx the parse tree
-	 */
-	void exitProg(@NotNull ExprParser.ProgContext ctx);
-}
\ No newline at end of file
diff --git a/oal-syntax/target/generated-sources/antlr4/ExprParser.java b/oal-syntax/target/generated-sources/antlr4/ExprParser.java
deleted file mode 100644
index 0c4d5cb..0000000
--- a/oal-syntax/target/generated-sources/antlr4/ExprParser.java
+++ /dev/null
@@ -1,258 +0,0 @@
-// Generated from Expr.g4 by ANTLR 4.3
-import org.antlr.v4.runtime.atn.*;
-import org.antlr.v4.runtime.dfa.DFA;
-import org.antlr.v4.runtime.*;
-import org.antlr.v4.runtime.misc.*;
-import org.antlr.v4.runtime.tree.*;
-import java.util.List;
-import java.util.Iterator;
-import java.util.ArrayList;
-
-@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
-public class ExprParser extends Parser {
-	static { RuntimeMetaData.checkVersion("4.3", RuntimeMetaData.VERSION); }
-
-	protected static final DFA[] _decisionToDFA;
-	protected static final PredictionContextCache _sharedContextCache =
-		new PredictionContextCache();
-	public static final int
-		T__5=1, T__4=2, T__3=3, T__2=4, T__1=5, T__0=6, NEWLINE=7, INT=8;
-	public static final String[] tokenNames = {
-		"<INVALID>", "'/'", "'('", "')'", "'*'", "'+'", "'-'", "NEWLINE", "INT"
-	};
-	public static final int
-		RULE_prog = 0, RULE_expr = 1;
-	public static final String[] ruleNames = {
-		"prog", "expr"
-	};
-
-	@Override
-	public String getGrammarFileName() { return "Expr.g4"; }
-
-	@Override
-	public String[] getTokenNames() { return tokenNames; }
-
-	@Override
-	public String[] getRuleNames() { return ruleNames; }
-
-	@Override
-	public String getSerializedATN() { return _serializedATN; }
-
-	@Override
-	public ATN getATN() { return _ATN; }
-
-	public ExprParser(TokenStream input) {
-		super(input);
-		_interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
-	}
-	public static class ProgContext extends ParserRuleContext {
-		public List<ExprContext> expr() {
-			return getRuleContexts(ExprContext.class);
-		}
-		public ExprContext expr(int i) {
-			return getRuleContext(ExprContext.class,i);
-		}
-		public List<TerminalNode> NEWLINE() { return getTokens(ExprParser.NEWLINE); }
-		public TerminalNode NEWLINE(int i) {
-			return getToken(ExprParser.NEWLINE, i);
-		}
-		public ProgContext(ParserRuleContext parent, int invokingState) {
-			super(parent, invokingState);
-		}
-		@Override public int getRuleIndex() { return RULE_prog; }
-		@Override
-		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof ExprListener ) ((ExprListener)listener).enterProg(this);
-		}
-		@Override
-		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof ExprListener ) ((ExprListener)listener).exitProg(this);
-		}
-	}
-
-	public final ProgContext prog() throws RecognitionException {
-		ProgContext _localctx = new ProgContext(_ctx, getState());
-		enterRule(_localctx, 0, RULE_prog);
-		int _la;
-		try {
-			enterOuterAlt(_localctx, 1);
-			{
-			setState(9);
-			_errHandler.sync(this);
-			_la = _input.LA(1);
-			while (_la==T__4 || _la==INT) {
-				{
-				{
-				setState(4); expr(0);
-				setState(5); match(NEWLINE);
-				}
-				}
-				setState(11);
-				_errHandler.sync(this);
-				_la = _input.LA(1);
-			}
-			}
-		}
-		catch (RecognitionException re) {
-			_localctx.exception = re;
-			_errHandler.reportError(this, re);
-			_errHandler.recover(this, re);
-		}
-		finally {
-			exitRule();
-		}
-		return _localctx;
-	}
-
-	public static class ExprContext extends ParserRuleContext {
-		public List<ExprContext> expr() {
-			return getRuleContexts(ExprContext.class);
-		}
-		public ExprContext expr(int i) {
-			return getRuleContext(ExprContext.class,i);
-		}
-		public TerminalNode INT() { return getToken(ExprParser.INT, 0); }
-		public ExprContext(ParserRuleContext parent, int invokingState) {
-			super(parent, invokingState);
-		}
-		@Override public int getRuleIndex() { return RULE_expr; }
-		@Override
-		public void enterRule(ParseTreeListener listener) {
-			if ( listener instanceof ExprListener ) ((ExprListener)listener).enterExpr(this);
-		}
-		@Override
-		public void exitRule(ParseTreeListener listener) {
-			if ( listener instanceof ExprListener ) ((ExprListener)listener).exitExpr(this);
-		}
-	}
-
-	public final ExprContext expr() throws RecognitionException {
-		return expr(0);
-	}
-
-	private ExprContext expr(int _p) throws RecognitionException {
-		ParserRuleContext _parentctx = _ctx;
-		int _parentState = getState();
-		ExprContext _localctx = new ExprContext(_ctx, _parentState);
-		ExprContext _prevctx = _localctx;
-		int _startState = 2;
-		enterRecursionRule(_localctx, 2, RULE_expr, _p);
-		int _la;
-		try {
-			int _alt;
-			enterOuterAlt(_localctx, 1);
-			{
-			setState(18);
-			switch (_input.LA(1)) {
-			case INT:
-				{
-				setState(13); match(INT);
-				}
-				break;
-			case T__4:
-				{
-				setState(14); match(T__4);
-				setState(15); expr(0);
-				setState(16); match(T__3);
-				}
-				break;
-			default:
-				throw new NoViableAltException(this);
-			}
-			_ctx.stop = _input.LT(-1);
-			setState(28);
-			_errHandler.sync(this);
-			_alt = getInterpreter().adaptivePredict(_input,3,_ctx);
-			while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
-				if ( _alt==1 ) {
-					if ( _parseListeners!=null ) triggerExitRuleEvent();
-					_prevctx = _localctx;
-					{
-					setState(26);
-					switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) {
-					case 1:
-						{
-						_localctx = new ExprContext(_parentctx, _parentState);
-						pushNewRecursionContext(_localctx, _startState, RULE_expr);
-						setState(20);
-						if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)");
-						setState(21);
-						_la = _input.LA(1);
-						if ( !(_la==T__5 || _la==T__2) ) {
-						_errHandler.recoverInline(this);
-						}
-						consume();
-						setState(22); expr(5);
-						}
-						break;
-
-					case 2:
-						{
-						_localctx = new ExprContext(_parentctx, _parentState);
-						pushNewRecursionContext(_localctx, _startState, RULE_expr);
-						setState(23);
-						if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)");
-						setState(24);
-						_la = _input.LA(1);
-						if ( !(_la==T__1 || _la==T__0) ) {
-						_errHandler.recoverInline(this);
-						}
-						consume();
-						setState(25); expr(4);
-						}
-						break;
-					}
-					} 
-				}
-				setState(30);
-				_errHandler.sync(this);
-				_alt = getInterpreter().adaptivePredict(_input,3,_ctx);
-			}
-			}
-		}
-		catch (RecognitionException re) {
-			_localctx.exception = re;
-			_errHandler.reportError(this, re);
-			_errHandler.recover(this, re);
-		}
-		finally {
-			unrollRecursionContexts(_parentctx);
-		}
-		return _localctx;
-	}
-
-	public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) {
-		switch (ruleIndex) {
-		case 1: return expr_sempred((ExprContext)_localctx, predIndex);
-		}
-		return true;
-	}
-	private boolean expr_sempred(ExprContext _localctx, int predIndex) {
-		switch (predIndex) {
-		case 0: return precpred(_ctx, 4);
-
-		case 1: return precpred(_ctx, 3);
-		}
-		return true;
-	}
-
-	public static final String _serializedATN =
-		"\3\u0430\ud6d1\u8206\uad2d\u4417\uaef1\u8d80\uaadd\3\n\"\4\2\t\2\4\3\t"+
-		"\3\3\2\3\2\3\2\7\2\n\n\2\f\2\16\2\r\13\2\3\3\3\3\3\3\3\3\3\3\3\3\5\3\25"+
-		"\n\3\3\3\3\3\3\3\3\3\3\3\3\3\7\3\35\n\3\f\3\16\3 \13\3\3\3\2\3\4\4\2\4"+
-		"\2\4\4\2\3\3\6\6\3\2\7\b#\2\13\3\2\2\2\4\24\3\2\2\2\6\7\5\4\3\2\7\b\7"+
-		"\t\2\2\b\n\3\2\2\2\t\6\3\2\2\2\n\r\3\2\2\2\13\t\3\2\2\2\13\f\3\2\2\2\f"+
-		"\3\3\2\2\2\r\13\3\2\2\2\16\17\b\3\1\2\17\25\7\n\2\2\20\21\7\4\2\2\21\22"+
-		"\5\4\3\2\22\23\7\5\2\2\23\25\3\2\2\2\24\16\3\2\2\2\24\20\3\2\2\2\25\36"+
-		"\3\2\2\2\26\27\f\6\2\2\27\30\t\2\2\2\30\35\5\4\3\7\31\32\f\5\2\2\32\33"+
-		"\t\3\2\2\33\35\5\4\3\6\34\26\3\2\2\2\34\31\3\2\2\2\35 \3\2\2\2\36\34\3"+
-		"\2\2\2\36\37\3\2\2\2\37\5\3\2\2\2 \36\3\2\2\2\6\13\24\34\36";
-	public static final ATN _ATN =
-		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
-	static {
-		_decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
-		for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
-			_decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
-		}
-	}
-}
\ No newline at end of file
diff --git a/oal-syntax/target/generated-sources/antlr4/OALLexer.tokens b/oal-syntax/target/generated-sources/antlr4/OALLexer.tokens
new file mode 100644
index 0000000..19d4b02
--- /dev/null
+++ b/oal-syntax/target/generated-sources/antlr4/OALLexer.tokens
@@ -0,0 +1,39 @@
+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
+'.'=20
+','=23
+'Service'=4
+')'=22
+'('=21
+'ServiceInstanceRelation'=8
+'ServiceInstance_JVM_Memory_Pool'=12
+'from'=1
+'All'=3
+'EndpointRelation'=9
+';'=24
+'Endpoint'=6
+'filter'=2
+'ServiceRelation'=7
+'ServiceInstance'=5
diff --git a/oal-syntax/target/generated-sources/antlr4/OALParser.tokens b/oal-syntax/target/generated-sources/antlr4/OALParser.tokens
new file mode 100644
index 0000000..19d4b02
--- /dev/null
+++ b/oal-syntax/target/generated-sources/antlr4/OALParser.tokens
@@ -0,0 +1,39 @@
+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
+'.'=20
+','=23
+'Service'=4
+')'=22
+'('=21
+'ServiceInstanceRelation'=8
+'ServiceInstance_JVM_Memory_Pool'=12
+'from'=1
+'All'=3
+'EndpointRelation'=9
+';'=24
+'Endpoint'=6
+'filter'=2
+'ServiceRelation'=7
+'ServiceInstance'=5
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
new file mode 100644
index 0000000..08cab30
--- /dev/null
+++ b/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALLexer.java
@@ -0,0 +1,215 @@
+// Generated from org/apache/skywalking/oal/tool/grammar/OALLexer.g4 by ANTLR 4.3
+package org.apache.skywalking.oal.tool.grammar;
+import org.antlr.v4.runtime.Lexer;
+import org.antlr.v4.runtime.CharStream;
+import org.antlr.v4.runtime.Token;
+import org.antlr.v4.runtime.TokenStream;
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.atn.*;
+import org.antlr.v4.runtime.dfa.DFA;
+import org.antlr.v4.runtime.misc.*;
+
+@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
+public class OALLexer extends Lexer {
+	static { RuntimeMetaData.checkVersion("4.3", RuntimeMetaData.VERSION); }
+
+	protected static final DFA[] _decisionToDFA;
+	protected static final PredictionContextCache _sharedContextCache =
+		new PredictionContextCache();
+	public static final int
+		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, IDENTIFIER=19, DOT=20, LR_BRACKET=21, 
+		RR_BRACKET=22, COMMA=23, SEMI=24;
+	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", 
+		"Digits", "LetterOrDigit", "Letter", "DOT", "LR_BRACKET", "RR_BRACKET", 
+		"COMMA", "SEMI"
+	};
+
+
+	public OALLexer(CharStream input) {
+		super(input);
+		_interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache);
+	}
+
+	@Override
+	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[] 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"+
+		"\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"+
+		"\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";
+	public static final ATN _ATN =
+		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
+	static {
+		_decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
+		for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
+			_decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
+		}
+	}
+}
\ 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
new file mode 100644
index 0000000..e237ef9
--- /dev/null
+++ b/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParser.java
@@ -0,0 +1,294 @@
+// Generated from org/apache/skywalking/oal/tool/grammar/OALParser.g4 by ANTLR 4.3
+package org.apache.skywalking.oal.tool.grammar;
+import org.antlr.v4.runtime.atn.*;
+import org.antlr.v4.runtime.dfa.DFA;
+import org.antlr.v4.runtime.*;
+import org.antlr.v4.runtime.misc.*;
+import org.antlr.v4.runtime.tree.*;
+import java.util.List;
+import java.util.Iterator;
+import java.util.ArrayList;
+
+@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
+public class OALParser extends Parser {
+	static { RuntimeMetaData.checkVersion("4.3", 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", "'.'", "'('", "')'", "','", "';'"
+	};
+	public static final int
+		RULE_root = 0, RULE_metricStatements = 1, RULE_metricStatement = 2, RULE_source = 3;
+	public static final String[] ruleNames = {
+		"root", "metricStatements", "metricStatement", "source"
+	};
+
+	@Override
+	public String getGrammarFileName() { return "OALParser.g4"; }
+
+	@Override
+	public String[] getTokenNames() { return tokenNames; }
+
+	@Override
+	public String[] getRuleNames() { return ruleNames; }
+
+	@Override
+	public String getSerializedATN() { return _serializedATN; }
+
+	@Override
+	public ATN getATN() { return _ATN; }
+
+	public OALParser(TokenStream input) {
+		super(input);
+		_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 TerminalNode DelimitedComment() { return getToken(OALParser.DelimitedComment, 0); }
+		public TerminalNode LineComment() { return getToken(OALParser.LineComment, 0); }
+		public RootContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_root; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof OALParserListener ) ((OALParserListener)listener).enterRoot(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof OALParserListener ) ((OALParserListener)listener).exitRoot(this);
+		}
+	}
+
+	public final RootContext root() throws RecognitionException {
+		RootContext _localctx = new RootContext(_ctx, getState());
+		enterRule(_localctx, 0, RULE_root);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(9);
+			switch ( getInterpreter().adaptivePredict(_input,0,_ctx) ) {
+			case 1:
+				{
+				setState(8); metricStatements();
+				}
+				break;
+			}
+			setState(12);
+			_la = _input.LA(1);
+			if (_la==DelimitedComment) {
+				{
+				setState(11); match(DelimitedComment);
+				}
+			}
+
+			setState(15);
+			_la = _input.LA(1);
+			if (_la==LineComment) {
+				{
+				setState(14); match(LineComment);
+				}
+			}
+
+			setState(17); match(EOF);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class MetricStatementsContext extends ParserRuleContext {
+		public List<MetricStatementContext> metricStatement() {
+			return getRuleContexts(MetricStatementContext.class);
+		}
+		public MetricStatementContext metricStatement(int i) {
+			return getRuleContext(MetricStatementContext.class,i);
+		}
+		public MetricStatementsContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_metricStatements; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof OALParserListener ) ((OALParserListener)listener).enterMetricStatements(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof OALParserListener ) ((OALParserListener)listener).exitMetricStatements(this);
+		}
+	}
+
+	public final MetricStatementsContext metricStatements() throws RecognitionException {
+		MetricStatementsContext _localctx = new MetricStatementsContext(_ctx, getState());
+		enterRule(_localctx, 2, RULE_metricStatements);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(22);
+			_errHandler.sync(this);
+			_la = _input.LA(1);
+			while (_la==FROM) {
+				{
+				{
+				setState(19); metricStatement();
+				}
+				}
+				setState(24);
+				_errHandler.sync(this);
+				_la = _input.LA(1);
+			}
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class MetricStatementContext extends ParserRuleContext {
+		public SourceContext source() {
+			return getRuleContext(SourceContext.class,0);
+		}
+		public TerminalNode FROM() { return getToken(OALParser.FROM, 0); }
+		public TerminalNode IDENTIFIER() { return getToken(OALParser.IDENTIFIER, 0); }
+		public MetricStatementContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_metricStatement; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof OALParserListener ) ((OALParserListener)listener).enterMetricStatement(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof OALParserListener ) ((OALParserListener)listener).exitMetricStatement(this);
+		}
+	}
+
+	public final MetricStatementContext metricStatement() throws RecognitionException {
+		MetricStatementContext _localctx = new MetricStatementContext(_ctx, getState());
+		enterRule(_localctx, 4, RULE_metricStatement);
+		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);
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	public static class SourceContext extends ParserRuleContext {
+		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_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 SourceContext(ParserRuleContext parent, int invokingState) {
+			super(parent, invokingState);
+		}
+		@Override public int getRuleIndex() { return RULE_source; }
+		@Override
+		public void enterRule(ParseTreeListener listener) {
+			if ( listener instanceof OALParserListener ) ((OALParserListener)listener).enterSource(this);
+		}
+		@Override
+		public void exitRule(ParseTreeListener listener) {
+			if ( listener instanceof OALParserListener ) ((OALParserListener)listener).exitSource(this);
+		}
+	}
+
+	public final SourceContext source() throws RecognitionException {
+		SourceContext _localctx = new SourceContext(_ctx, getState());
+		enterRule(_localctx, 6, RULE_source);
+		int _la;
+		try {
+			enterOuterAlt(_localctx, 1);
+			{
+			setState(32);
+			_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();
+			}
+		}
+		catch (RecognitionException re) {
+			_localctx.exception = re;
+			_errHandler.reportError(this, re);
+			_errHandler.recover(this, re);
+		}
+		finally {
+			exitRule();
+		}
+		return _localctx;
+	}
+
+	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";
+	public static final ATN _ATN =
+		new ATNDeserializer().deserialize(_serializedATN.toCharArray());
+	static {
+		_decisionToDFA = new DFA[_ATN.getNumberOfDecisions()];
+		for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) {
+			_decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i);
+		}
+	}
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..9a3aabe
--- /dev/null
+++ b/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParserBaseListener.java
@@ -0,0 +1,91 @@
+// Generated from org/apache/skywalking/oal/tool/grammar/OALParser.g4 by ANTLR 4.3
+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;
+
+/**
+ * This class provides an empty implementation of {@link OALParserListener},
+ * which can be extended to create a listener which only needs to handle a subset
+ * of the available methods.
+ */
+public class OALParserBaseListener implements OALParserListener {
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterMetricStatements(@NotNull OALParser.MetricStatementsContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitMetricStatements(@NotNull OALParser.MetricStatementsContext ctx) { }
+
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterRoot(@NotNull OALParser.RootContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitRoot(@NotNull OALParser.RootContext ctx) { }
+
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterMetricStatement(@NotNull OALParser.MetricStatementContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitMetricStatement(@NotNull OALParser.MetricStatementContext ctx) { }
+
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterSource(@NotNull OALParser.SourceContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitSource(@NotNull OALParser.SourceContext ctx) { }
+
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void enterEveryRule(@NotNull ParserRuleContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void exitEveryRule(@NotNull ParserRuleContext ctx) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void visitTerminal(@NotNull TerminalNode node) { }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation does nothing.</p>
+	 */
+	@Override public void visitErrorNode(@NotNull 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
new file mode 100644
index 0000000..451ddc7
--- /dev/null
+++ b/oal-syntax/target/generated-sources/antlr4/org/apache/skywalking/oal/tool/grammar/OALParserListener.java
@@ -0,0 +1,54 @@
+// Generated from org/apache/skywalking/oal/tool/grammar/OALParser.g4 by ANTLR 4.3
+package org.apache.skywalking.oal.tool.grammar;
+import org.antlr.v4.runtime.misc.NotNull;
+import org.antlr.v4.runtime.tree.ParseTreeListener;
+
+/**
+ * This interface defines a complete listener for a parse tree produced by
+ * {@link OALParser}.
+ */
+public interface OALParserListener extends ParseTreeListener {
+	/**
+	 * Enter a parse tree produced by {@link OALParser#metricStatements}.
+	 * @param ctx the parse tree
+	 */
+	void enterMetricStatements(@NotNull OALParser.MetricStatementsContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link OALParser#metricStatements}.
+	 * @param ctx the parse tree
+	 */
+	void exitMetricStatements(@NotNull OALParser.MetricStatementsContext ctx);
+
+	/**
+	 * Enter a parse tree produced by {@link OALParser#root}.
+	 * @param ctx the parse tree
+	 */
+	void enterRoot(@NotNull OALParser.RootContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link OALParser#root}.
+	 * @param ctx the parse tree
+	 */
+	void exitRoot(@NotNull OALParser.RootContext ctx);
+
+	/**
+	 * Enter a parse tree produced by {@link OALParser#metricStatement}.
+	 * @param ctx the parse tree
+	 */
+	void enterMetricStatement(@NotNull OALParser.MetricStatementContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link OALParser#metricStatement}.
+	 * @param ctx the parse tree
+	 */
+	void exitMetricStatement(@NotNull OALParser.MetricStatementContext ctx);
+
+	/**
+	 * Enter a parse tree produced by {@link OALParser#source}.
+	 * @param ctx the parse tree
+	 */
+	void enterSource(@NotNull OALParser.SourceContext ctx);
+	/**
+	 * Exit a parse tree produced by {@link OALParser#source}.
+	 * @param ctx the parse tree
+	 */
+	void exitSource(@NotNull OALParser.SourceContext ctx);
+}
\ No newline at end of file
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 2764812..d7e502c 100644
--- a/oal-syntax/target/maven-shared-archive-resources/META-INF/DEPENDENCIES
+++ b/oal-syntax/target/maven-shared-archive-resources/META-INF/DEPENDENCIES
@@ -28,6 +28,10 @@
   - 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/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/oal-syntax/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
index 004152f..8fd0c8f 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,6 +1,8 @@
-ExprParser.class
-ExprParser$ExprContext.class
-ExprBaseListener.class
-ExprLexer.class
-ExprListener.class
-ExprParser$ProgContext.class
+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/OALLexer.class
+org/apache/skywalking/oal/tool/grammar/OALParserBaseListener.class
+org/apache/skywalking/oal/tool/grammar/OALParser$RootContext.class
+org/apache/skywalking/oal/tool/grammar/OALParser$SourceContext.class
+org/apache/skywalking/oal/tool/grammar/OALParser.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 422e840..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,4 +1,4 @@
-/Users/wusheng/Documents/GitHub/incubator-skywalking-oal-tool/oal-syntax/target/generated-sources/antlr4/ExprBaseListener.java
-/Users/wusheng/Documents/GitHub/incubator-skywalking-oal-tool/oal-syntax/target/generated-sources/antlr4/ExprListener.java
-/Users/wusheng/Documents/GitHub/incubator-skywalking-oal-tool/oal-syntax/target/generated-sources/antlr4/ExprLexer.java
-/Users/wusheng/Documents/GitHub/incubator-skywalking-oal-tool/oal-syntax/target/generated-sources/antlr4/ExprParser.java
+/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/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/test-classes/META-INF/DEPENDENCIES b/oal-syntax/target/test-classes/META-INF/DEPENDENCIES
new file mode 100644
index 0000000..d7e502c
--- /dev/null
+++ b/oal-syntax/target/test-classes/META-INF/DEPENDENCIES
@@ -0,0 +1,37 @@
+// ------------------------------------------------------------------
+// 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
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/oal-syntax/target/test-classes/META-INF/LICENSE
@@ -0,0 +1,202 @@
+
+                                 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
new file mode 100644
index 0000000..82d5ff9
--- /dev/null
+++ b/oal-syntax/target/test-classes/META-INF/NOTICE
@@ -0,0 +1,8 @@
+
+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/oal-syntax/target/test-classes/oal_test.oal b/oal-syntax/target/test-classes/oal_test.oal
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/oal-syntax/target/test-classes/oal_test.oal