[ONOS-3877] Implement Yang grammar for leaf,leaf-list,augment,grouping/uses
[ONOS-3917] YANG LEXER

Change-Id: Ic2476cd97b9b2b5b557a93fb975cc89002ff4464
diff --git a/utils/yangutils/src/main/resources/YangLexer.g4 b/utils/yangutils/src/main/resources/YangLexer.g4
new file mode 100644
index 0000000..12bb19b
--- /dev/null
+++ b/utils/yangutils/src/main/resources/YangLexer.g4
@@ -0,0 +1,137 @@
+/*
+ * Copyright 2016 Open Networking Laboratory
+ *
+ * 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.
+ */
+
+/**
+ * This is a YANG grammar for lexer based on which ANTLR will generate YANG lexer.
+ */
+
+lexer grammar YangLexer;
+
+    // Statements keywords
+    ANYXML_KEYWORD      : 'anyxml';
+    ARGUMENT_KEYWORD    : 'argument';
+    AUGMENT_KEYWORD     : 'augment';
+    BASE_KEYWORD        : 'base';
+    BELONGS_TO_KEYWORD  : 'belongs-to';
+    BIT_KEYWORD         : 'bit';
+    CASE_KEYWORD        : 'case';
+    CHOICE_KEYWORD      : 'choice';
+    CONFIG_KEYWORD      : 'config';
+    CONTACT_KEYWORD     : 'contact';
+    CONTAINER_KEYWORD   : 'container';
+    DEFAULT_KEYWORD     : 'default';
+    DESCRIPTION_KEYWORD : 'description';
+    ENUM_KEYWORD        : 'enum';
+    ERROR_APP_TAG_KEYWORD : 'error-app-tag';
+    ERROR_MESSAGE_KEYWORD : 'error-message';
+    EXTENSION_KEYWORD   : 'extension';
+    DEVIATION_KEYWORD   : 'deviation';
+    DEVIATE_KEYWORD     : 'deviate';
+    FEATURE_KEYWORD     : 'feature';
+    FRACTION_DIGITS_KEYWORD : 'fraction-digits';
+    GROUPING_KEYWORD    : 'grouping';
+    IDENTITY_KEYWORD    : 'identity';
+    IF_FEATURE_KEYWORD  : 'if-feature';
+    IMPORT_KEYWORD      : 'import';
+    INCLUDE_KEYWORD     : 'include';
+    INPUT_KEYWORD       : 'input';
+    KEY_KEYWORD         : 'key';
+    LEAF_KEYWORD        : 'leaf';
+    LEAF_LIST_KEYWORD   : 'leaf-list';
+    LENGTH_KEYWORD      : 'length';
+    LIST_KEYWORD        : 'list';
+    MANDATORY_KEYWORD   : 'mandatory';
+    MAX_ELEMENTS_KEYWORD : 'max-elements';
+    MIN_ELEMENTS_KEYWORD : 'min-elements';
+    MODULE_KEYWORD      : 'module';
+    MUST_KEYWORD        : 'must';
+    NAMESPACE_KEYWORD   : 'namespace';
+    NOTIFICATION_KEYWORD: 'notification';
+    ORDERED_BY_KEYWORD  : 'ordered-by';
+    ORGANIZATION_KEYWORD: 'organization';
+    OUTPUT_KEYWORD      : 'output';
+    PATH_KEYWORD        : 'path';
+    PATTERN_KEYWORD     : 'pattern';
+    POSITION_KEYWORD    : 'position';
+    PREFIX_KEYWORD      : 'prefix';
+    PRESENCE_KEYWORD    : 'presence';
+    RANGE_KEYWORD       : 'range';
+    REFERENCE_KEYWORD   : 'reference';
+    REFINE_KEYWORD      : 'refine';
+    REQUIRE_INSTANCE_KEYWORD : 'require-instance';
+    REVISION_KEYWORD    : 'revision';
+    REVISION_DATE_KEYWORD : 'revision-date';
+    RPC_KEYWORD         : 'rpc';
+    STATUS_KEYWORD      : 'status';
+    SUBMODULE_KEYWORD   : 'submodule';
+    TYPE_KEYWORD        : 'type';
+    TYPEDEF_KEYWORD     : 'typedef';
+    UNIQUE_KEYWORD      : 'unique';
+    UNITS_KEYWORD       : 'units';
+    USES_KEYWORD        : 'uses';
+    VALUE_KEYWORD       : 'value';
+    WHEN_KEYWORD        : 'when';
+    YANG_VERSION_KEYWORD: 'yang-version';
+    YIN_ELEMENT_KEYWORD : 'yin-element';
+    ADD_KEYWORD         : 'add';
+    CURRENT_KEYWORD     : 'current';
+    DELETE_KEYWORD      : 'delete';
+    DEPRECATED_KEYWORD  : 'deprecated';
+    FALSE_KEYWORD       : 'false';
+    MAX_KEYWORD         : 'max';
+    MIN_KEYWORD         : 'min';
+    NOT_SUPPORTED_KEYWORD : 'not-supported';
+    OBSOLETE_KEYWORD    : 'obsolete';
+    REPLACE_KEYWORD     : 'replace';
+    SYSTEM_KEYWORD      : 'system';
+    TRUE_KEYWORD        : 'true';
+    UNBOUNDED_KEYWORD   : 'unbounded';
+    USER_KEYWORD        : 'user';
+
+    // Lexer tokens to be skipped
+    COMMENT
+        :   '/*' .*? '*/'    -> channel(HIDDEN)
+        ;
+    WS  :   [ \r\t\u000C\n]+ -> channel(HIDDEN)
+        ;
+    LINE_COMMENT
+        : '//' ~[\r\n]* '\r'? '\n' -> channel(HIDDEN)
+        ;
+
+    // Additional rules
+    INTEGER             : DIGIT+;
+    DATE_ARG            : DIGIT DIGIT DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT;
+    LEFT_CURLY_BRACE    : '{';
+    RIGHT_CURLY_BRACE   : '}';
+    IDENTIFIER          : (ALPHA | '_')
+                          (ALPHA | DIGIT | '_' | '-' | '.')*;
+    STMTEND             : ';';
+    DQUOTE              : '"';
+    COLON               : ':';
+    PLUS : '+';
+    MINUS: '-';
+
+    STRING : ((~( '\r' | '\n' | '\t' | ' ' | ';' | '{' | '"' | '\'')~( '\r' | '\n' | '\t' | ' ' | ';' | '{' )* ) | SUB_STRING );
+
+    //Fragment rules
+    fragment SUB_STRING : ('"' (ESC | ~["])*'"') | ('\'' (ESC | ~['])*'\'') ;
+    fragment ESC :  '\\' (["\\/bfnrt] | UNICODE) ;
+    fragment UNICODE : 'u' HEX HEX HEX HEX ;
+    fragment HEX : [0-9a-fA-F] ;
+    fragment ALPHA      : [A-Za-z];
+    fragment DIGIT      : [0-9];
+    fragment URN        : [u][r][n];
+    fragment HTTP       : [h][t][t][p];
\ No newline at end of file