13b119661e0284a3bfbbac95d00251e6a3d94417
[yangtools.git] / yang / yang-parser-impl / src / main / antlr / YangParser.g4
1 //
2 // Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
3 //
4 // This program and the accompanying materials are made available under the
5 // terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 // and is available at http://www.eclipse.org/legal/epl-v10.html
7 //
8 parser grammar YangParser;
9
10 @header {
11 package org.opendaylight.yangtools.antlrv4.code.gen;
12 }
13
14 options{
15     tokenVocab=YangLexer;
16 }
17
18
19 yang : module_stmt | submodule_stmt ;
20
21 string : STRING (PLUS STRING)*;
22
23 // string validated in YangParserListenerImpl.handleUnknownNode()
24 identifier_stmt : IDENTIFIER string? (stmtend | (LEFT_BRACE unknown_statement* RIGHT_BRACE));
25 // string validated in YangParserListenerImpl.handleUnknownNode()
26 unknown_statement : (YIN_ELEMENT_KEYWORD | YANG_VERSION_KEYWORD | WHEN_KEYWORD | VALUE_KEYWORD | USES_KEYWORD | UNITS_KEYWORD | UNIQUE_KEYWORD |
27                     TYPEDEF_KEYWORD | TYPE_KEYWORD | SUBMODULE_KEYWORD | RPC_KEYWORD | REVISION_DATE_KEYWORD | REVISION_KEYWORD |
28                     REQUIRE_INSTANCE_KEYWORD | REFINE_KEYWORD | RANGE_KEYWORD | PRESENCE_KEYWORD | PREFIX_KEYWORD |
29                     POSITION_KEYWORD | PATTERN_KEYWORD | PATH_KEYWORD | OUTPUT_KEYWORD | ORGANIZATION_KEYWORD|  ORDERED_BY_KEYWORD | NOTIFICATION_KEYWORD|
30                     NAMESPACE_KEYWORD | MUST_KEYWORD | MODULE_KEYWORD | MIN_ELEMENTS_KEYWORD | MAX_ELEMENTS_KEYWORD | MANDATORY_KEYWORD | LIST_KEYWORD |
31                     LENGTH_KEYWORD | LEAF_LIST_KEYWORD | LEAF_KEYWORD | KEY_KEYWORD | INPUT_KEYWORD | INCLUDE_KEYWORD | IMPORT_KEYWORD | IF_FEATURE_KEYWORD |
32                     IDENTITY_KEYWORD | GROUPING_KEYWORD | FRACTION_DIGITS_KEYWORD | FEATURE_KEYWORD | DEVIATE_KEYWORD | DEVIATION_KEYWORD | EXTENSION_KEYWORD |
33                     ERROR_MESSAGE_KEYWORD | ERROR_APP_TAG_KEYWORD | ENUM_KEYWORD | DESCRIPTION_KEYWORD | STATUS_KEYWORD | DEFAULT_KEYWORD | CONTAINER_KEYWORD | CONTACT_KEYWORD |
34                     CONFIG_KEYWORD | CHOICE_KEYWORD |  CASE_KEYWORD | BIT_KEYWORD | BELONGS_TO_KEYWORD | BASE_KEYWORD | AUGMENT_KEYWORD |
35                     ANYXML_KEYWORD | REFERENCE_KEYWORD | IDENTIFIER) string? (SEMICOLON | (LEFT_BRACE
36                     (unknown_statement |
37                     identifier_stmt)* RIGHT_BRACE)*);
38
39 stmtend : (SEMICOLON) | (LEFT_BRACE identifier_stmt? RIGHT_BRACE);
40
41 /* DO NOT replace stmtsep in rest of grammar with identifier_stmt!!! It might seems as code duplicity here, but this one is necessary.
42    Body of identifier_stmt generated from this grammar in YangParserListener is implemented in YangParserListenerImpl.
43    To ensure that all of the identifier_stmts will be resolved correctly the YangParserListenerImpl contains code that handles
44    specifcly identifier_stmts -> i.e. transforms identifier_stmt into QName. The stmtsep is used for parsing extension statements
45    placed outside of body_stmt.
46  */
47 stmtsep : IDENTIFIER string? (stmtend | (LEFT_BRACE unknown_statement* RIGHT_BRACE));
48 // string validated in DeviationBuilder.setDeviate() as REPLACE_KEYWORD
49 deviate_replace_stmt : DEVIATE_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |type_stmt | units_stmt | default_stmt | config_stmt | mandatory_stmt | min_elements_stmt | max_elements_stmt )* RIGHT_BRACE));
50 // string validated in DeviationBuilder.setDeviate() as DELETE_KEYWORD
51 deviate_delete_stmt : DEVIATE_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |units_stmt | must_stmt | unique_stmt | default_stmt )* RIGHT_BRACE));
52 // string validated in DeviationBuilder.setDeviate() as ADD_KEYWORD
53 deviate_add_stmt : DEVIATE_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |units_stmt | must_stmt | unique_stmt | default_stmt | config_stmt | mandatory_stmt  | min_elements_stmt  | max_elements_stmt )* RIGHT_BRACE));
54 // string validated in DeviationBuilder.setDeviate() as NOT_SUPPORTED_KEYWORD
55 deviate_not_supported_stmt : DEVIATE_KEYWORD string (SEMICOLON | (LEFT_BRACE identifier_stmt? RIGHT_BRACE));
56 // string validated in YangModelBasicValidationListener.enterDeviation_stmt()
57 deviation_stmt : DEVIATION_KEYWORD string LEFT_BRACE (identifier_stmt |description_stmt | reference_stmt | deviate_not_supported_stmt | deviate_add_stmt | deviate_replace_stmt | deviate_delete_stmt)+ RIGHT_BRACE;
58 // string validated in YangModelBasicValidationListener.enterNotification_stmt()
59 notification_stmt : NOTIFICATION_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |if_feature_stmt | status_stmt | description_stmt | reference_stmt | typedef_stmt | grouping_stmt | data_def_stmt )* RIGHT_BRACE));
60 output_stmt : OUTPUT_KEYWORD LEFT_BRACE (identifier_stmt |typedef_stmt | grouping_stmt | data_def_stmt )* RIGHT_BRACE;
61 input_stmt : INPUT_KEYWORD LEFT_BRACE (identifier_stmt |typedef_stmt | grouping_stmt | data_def_stmt )* RIGHT_BRACE;
62 // string valided in YangModelBasicValidationListener.enterRpc_stmt()
63 rpc_stmt : RPC_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |if_feature_stmt  | status_stmt | description_stmt | reference_stmt | typedef_stmt | grouping_stmt | input_stmt | output_stmt )* RIGHT_BRACE));
64 // string validated in ParserListenerUtils.stringFromStringContext()
65 when_stmt : WHEN_KEYWORD string (SEMICOLON | (LEFT_BRACE (identifier_stmt |description_stmt | reference_stmt )* RIGHT_BRACE));
66
67 // string validated in YangModelBasicValidationListener.enterAugment_stmt()
68 augment_stmt : AUGMENT_KEYWORD string LEFT_BRACE  (identifier_stmt |when_stmt | if_feature_stmt | status_stmt | description_stmt | reference_stmt | data_def_stmt | case_stmt)* RIGHT_BRACE;
69 // string not validated
70 uses_augment_stmt : AUGMENT_KEYWORD string LEFT_BRACE (identifier_stmt |when_stmt | if_feature_stmt | status_stmt | description_stmt | reference_stmt | data_def_stmt | case_stmt)* RIGHT_BRACE;
71 refine_anyxml_stmts : (identifier_stmt |must_stmt | config_stmt | mandatory_stmt | description_stmt | reference_stmt )*;
72 refine_case_stmts : (identifier_stmt |description_stmt | reference_stmt )*;
73 refine_choice_stmts : (identifier_stmt |default_stmt | config_stmt | mandatory_stmt | description_stmt | reference_stmt )*;
74 refine_list_stmts : (identifier_stmt |must_stmt | config_stmt | min_elements_stmt | max_elements_stmt | description_stmt | reference_stmt )*;
75 refine_leaf_list_stmts : (identifier_stmt |must_stmt | config_stmt | min_elements_stmt | max_elements_stmt | description_stmt | reference_stmt )*;
76 refine_leaf_stmts : (identifier_stmt |must_stmt | default_stmt | config_stmt | mandatory_stmt | description_stmt | reference_stmt )*;
77 refine_container_stmts : (identifier_stmt |must_stmt | presence_stmt | config_stmt | description_stmt | reference_stmt )*;
78 refine_pom : (refine_container_stmts | refine_leaf_stmts | refine_leaf_list_stmts | refine_list_stmts | refine_choice_stmts | refine_case_stmts | refine_anyxml_stmts);
79 // string validated in YangModelBasicValidationListener.enterRefine_stmt()
80 refine_stmt : REFINE_KEYWORD string (SEMICOLON | (LEFT_BRACE  (refine_pom) RIGHT_BRACE));
81 // string validated in YangModelBasicValidationListener.enterUses_stmt()
82 uses_stmt : USES_KEYWORD string (SEMICOLON | (LEFT_BRACE  (identifier_stmt |when_stmt | if_feature_stmt | status_stmt | description_stmt | reference_stmt | refine_stmt | uses_augment_stmt )* RIGHT_BRACE));
83 // string validated in YangModelBasicValidationListener.enterAnyxml_stmt()
84 anyxml_stmt : ANYXML_KEYWORD string (SEMICOLON | (LEFT_BRACE  (identifier_stmt |when_stmt | if_feature_stmt | must_stmt | config_stmt | mandatory_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE));
85 // string validated in YangModelBasicValidationListener.enterCase_stmt()
86 case_stmt : CASE_KEYWORD string (SEMICOLON | (LEFT_BRACE  (identifier_stmt |when_stmt | if_feature_stmt | status_stmt | description_stmt | reference_stmt | data_def_stmt )* RIGHT_BRACE));
87 short_case_stmt : container_stmt | leaf_stmt | leaf_list_stmt | list_stmt | anyxml_stmt;
88 // string validated in YangModelBasicValidationListener.enterChoice_stmt()
89 choice_stmt : CHOICE_KEYWORD string (SEMICOLON | (LEFT_BRACE  (identifier_stmt |when_stmt | if_feature_stmt | default_stmt | config_stmt | mandatory_stmt | status_stmt | description_stmt | reference_stmt | short_case_stmt | case_stmt)* RIGHT_BRACE));
90 // string validated in YangModelBasicValidationListener.enterUnique_stmt()
91 unique_stmt : UNIQUE_KEYWORD string stmtend;
92 // string validated in YangModelBasicValidationListener.enterKey_stmt()
93 key_stmt : KEY_KEYWORD string stmtend;
94 // string validated in YangModelBasicValidationListener.enterList_stmt()
95 list_stmt : LIST_KEYWORD string LEFT_BRACE  (when_stmt | if_feature_stmt | must_stmt | key_stmt | unique_stmt | config_stmt | min_elements_stmt | max_elements_stmt | ordered_by_stmt | status_stmt | description_stmt | reference_stmt | typedef_stmt | grouping_stmt | data_def_stmt | identifier_stmt)* RIGHT_BRACE;
96 // string validated in YangModelBasicValidationListener.enterLeaf_list_stmt()
97 leaf_list_stmt : LEAF_LIST_KEYWORD string LEFT_BRACE  (identifier_stmt |when_stmt | if_feature_stmt | type_stmt | units_stmt | must_stmt | config_stmt | min_elements_stmt | max_elements_stmt | ordered_by_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE;
98 // string validated in YangModelBasicValidationListener.enterLeaf_stmt()
99 leaf_stmt : LEAF_KEYWORD string LEFT_BRACE  (identifier_stmt |when_stmt | if_feature_stmt | type_stmt | units_stmt | must_stmt | default_stmt | config_stmt | mandatory_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE;
100 // string validated in YangModelBasicValidationListener.enterContainer_stmt()
101 container_stmt : CONTAINER_KEYWORD string (SEMICOLON | (LEFT_BRACE  (when_stmt | if_feature_stmt | must_stmt | presence_stmt | config_stmt | status_stmt | description_stmt | reference_stmt | typedef_stmt | grouping_stmt | data_def_stmt | identifier_stmt)* RIGHT_BRACE));
102 // string validated in YangModelBasicValidationListener.enterGrouping_stmt()
103 grouping_stmt : GROUPING_KEYWORD string (SEMICOLON | (LEFT_BRACE (status_stmt | description_stmt | reference_stmt | typedef_stmt | grouping_stmt | data_def_stmt | identifier_stmt)* RIGHT_BRACE));
104 // string validated in ParserListenerUtils.createEnumPair()
105 value_stmt : VALUE_KEYWORD string stmtend;
106 // string validated in ParserListenerUtils.parseMaxElements()
107 max_value_arg : string;
108 // string validated in ParserListenerUtils.parseMinElements()
109 min_value_arg : string;
110 max_elements_stmt : MAX_ELEMENTS_KEYWORD max_value_arg stmtend;
111 min_elements_stmt : MIN_ELEMENTS_KEYWORD min_value_arg stmtend;
112 // string validated in ParserListenerUtils.parseMust()
113 error_app_tag_stmt : ERROR_APP_TAG_KEYWORD string stmtend;
114 // string validated in ParserListenerUtils.parseMust()
115 error_message_stmt : ERROR_MESSAGE_KEYWORD string stmtend;
116 // string validated in ParserListenerUtils.parseMust()
117 must_stmt : MUST_KEYWORD string (SEMICOLON | (LEFT_BRACE  (identifier_stmt |error_message_stmt | error_app_tag_stmt | description_stmt | reference_stmt )* RIGHT_BRACE));
118 // string validated in YangModelBasicValidationListener.enterOrdered_by_arg() as USER_KEYWORD | SYSTEM_KEYWORD
119 ordered_by_arg : string;
120 ordered_by_stmt : ORDERED_BY_KEYWORD ordered_by_arg stmtend;
121 // string not validated
122 presence_stmt : PRESENCE_KEYWORD string stmtend;
123 // string validated in YangModelBasicValidationListener.enterMandatory_arg() as TRUE_KEYWORD | FALSE_KEYWORD
124 mandatory_arg :string;
125 mandatory_stmt : MANDATORY_KEYWORD mandatory_arg stmtend;
126 // string validated in YangModelBasicValidationListener.enterConfig_arg() as TRUE_KEYWORD | FALSE_KEYWORD
127 config_arg : string;
128 config_stmt : CONFIG_KEYWORD config_arg stmtend;
129 // string validated in YangModelBasicValidationListener.enterStatus_arg() as CURRENT_KEYWORD | OBSOLETE_KEYWORD | DEPRECATED_KEYWORD
130 status_arg : string;
131 status_stmt : STATUS_KEYWORD status_arg stmtend;
132 // string validated in ParserListenerUtils.parseBit()
133 position_stmt : POSITION_KEYWORD string stmtend;
134 // string validated in ParserListenerUtils.parseBit()
135 bit_stmt : BIT_KEYWORD string (SEMICOLON | (LEFT_BRACE  (identifier_stmt |position_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE));
136 bits_specification : bit_stmt (bit_stmt | identifier_stmt)*;
137 union_specification : type_stmt (identifier_stmt | type_stmt )*;
138 identityref_specification : base_stmt  ;
139 instance_identifier_specification : (require_instance_stmt )?;
140 // string validated in ParserListenerUtils.isRequireInstance() as TRUE_KEYWORD | FALSE_KEYWORD
141 require_instance_arg :string;
142 require_instance_stmt : REQUIRE_INSTANCE_KEYWORD require_instance_arg stmtend;
143 // string validated in ParserListenerUtils.parseLeafrefPath()
144 path_stmt : PATH_KEYWORD string stmtend;
145 leafref_specification : path_stmt;
146 // string validated in ParserListenerUtils.createEnumPair()
147 enum_stmt : ENUM_KEYWORD string (SEMICOLON | (LEFT_BRACE  (identifier_stmt |value_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE));
148 enum_specification : enum_stmt (identifier_stmt | enum_stmt )*;
149 // string not validated
150 default_stmt : DEFAULT_KEYWORD string stmtend;
151 // string validated in ParserListenerUtils.parsePatternConstraint()
152 pattern_stmt : PATTERN_KEYWORD string (SEMICOLON | (LEFT_BRACE  (identifier_stmt |error_message_stmt | error_app_tag_stmt | description_stmt | reference_stmt )* RIGHT_BRACE));
153 // string validated in ParserListenerUtils.parseLengthConstraints()
154 length_stmt : LENGTH_KEYWORD string (SEMICOLON | (LEFT_BRACE  (identifier_stmt |error_message_stmt | error_app_tag_stmt | description_stmt | reference_stmt )* RIGHT_BRACE));
155 string_restrictions : (length_stmt | identifier_stmt | pattern_stmt)*;
156 // string validated in ParserListenerUtils.parseFractionDigits()
157 fraction_digits_stmt : FRACTION_DIGITS_KEYWORD string stmtend;
158 decimal64_specification : (numerical_restrictions? (identifier_stmt)* fraction_digits_stmt | fraction_digits_stmt (identifier_stmt)* numerical_restrictions?);
159 // string validated in ParserListenerUtils.parseRangeConstraints()
160 range_stmt : RANGE_KEYWORD string (SEMICOLON | (LEFT_BRACE  (identifier_stmt |error_message_stmt | error_app_tag_stmt | description_stmt | reference_stmt )* RIGHT_BRACE));
161 numerical_restrictions : range_stmt ;
162 type_body_stmts : (identifier_stmt)* (numerical_restrictions | decimal64_specification | string_restrictions | enum_specification | leafref_specification | identityref_specification | instance_identifier_specification | bits_specification | union_specification) (identifier_stmt)*;
163 // string validated in YangModelBasicValidationListener.enterType_stmt()
164 type_stmt : TYPE_KEYWORD string (SEMICOLON | (LEFT_BRACE  type_body_stmts RIGHT_BRACE));
165 // string validated in YangModelBasicValidationListener.enterTypedef_stmt()
166 typedef_stmt : TYPEDEF_KEYWORD string LEFT_BRACE  (identifier_stmt | type_stmt | units_stmt | default_stmt | status_stmt | description_stmt | reference_stmt )+ RIGHT_BRACE;
167 // string validated in YangModelBasicValidationListener.enterIf_feature_stmt()
168 if_feature_stmt : IF_FEATURE_KEYWORD string stmtend;
169 // string validated in YangModelBasicValidationListener.enterFeature_stmt()
170 feature_stmt : FEATURE_KEYWORD string (SEMICOLON | (LEFT_BRACE  (identifier_stmt | if_feature_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE));
171 // string validated in YangModelBasicValidationListener.enterBase_stmt()
172 base_stmt : BASE_KEYWORD string stmtend;
173 // string validated in YangModelBasicValidationListener.enterIdentity_stmt()
174 identity_stmt : IDENTITY_KEYWORD string (SEMICOLON | (LEFT_BRACE  (identifier_stmt | base_stmt | status_stmt | description_stmt | reference_stmt )* RIGHT_BRACE));
175 // string validated in YangModelBasicValidationListener.enterYin_element_arg() as TRUE_KEYWORD | FALSE_KEYWORD
176 yin_element_arg : string;
177 yin_element_stmt : YIN_ELEMENT_KEYWORD yin_element_arg stmtend;
178
179 // string validated in YangModelBasicValidationListener.enterArgument_stmt()
180 argument_stmt : ARGUMENT_KEYWORD string (SEMICOLON | (LEFT_BRACE identifier_stmt* yin_element_stmt? identifier_stmt* RIGHT_BRACE));
181 // string validated in YangModelBasicValidationListener.enterExtension_stmt()
182 extension_stmt : EXTENSION_KEYWORD string (SEMICOLON | (LEFT_BRACE  (argument_stmt | status_stmt | description_stmt | reference_stmt | unknown_statement)* RIGHT_BRACE));
183 // string validated in YangModelBasicValidationListener.enterRevision_date_stmt()
184 revision_date_stmt : REVISION_DATE_KEYWORD string stmtend;
185 // string validated in YangModelBasicValidationListener.enterRevision_stmt()
186 revision_stmt : REVISION_KEYWORD string (SEMICOLON | (LEFT_BRACE stmtsep* (description_stmt )? (reference_stmt )? (unknown_statement)? RIGHT_BRACE));
187 // string not validated
188 units_stmt : UNITS_KEYWORD string stmtend;
189 // string not validated
190 reference_stmt : REFERENCE_KEYWORD string stmtend;
191 // string not validated
192 description_stmt : DESCRIPTION_KEYWORD string stmtend;
193 // string not validated
194 contact_stmt : CONTACT_KEYWORD string stmtend;
195 // string not validated
196 organization_stmt : ORGANIZATION_KEYWORD string stmtend;
197 // string validated in YangModelBasicValidationListener.enterBelongs_to_stmt()
198 belongs_to_stmt : BELONGS_TO_KEYWORD string LEFT_BRACE  stmtsep* prefix_stmt  RIGHT_BRACE;
199 // string validated in YangModelBasicValidationListener.enterPrefix_stmt()
200 prefix_stmt : PREFIX_KEYWORD string stmtend;
201 // string validated in YangModelBasicValidationListener.enterNamespace_stmt()
202 namespace_stmt : NAMESPACE_KEYWORD string stmtend;
203 // string validated in YangModelBasicValidationListener.enterInclude_stmt()
204 include_stmt : INCLUDE_KEYWORD string (SEMICOLON | (LEFT_BRACE stmtsep* (revision_date_stmt )? RIGHT_BRACE));
205 // string validated in YangModelBasicValidationListener.enterImport_stmt()
206 import_stmt : IMPORT_KEYWORD string LEFT_BRACE stmtsep* prefix_stmt  (revision_date_stmt )? RIGHT_BRACE;
207 // string validated in YangModelBasicValidationListener.enterModule_header_stmts() and/or YangModelBasicValidationListener.enterSubmodule_header_stmts()
208 yang_version_stmt : YANG_VERSION_KEYWORD string stmtend;
209 data_def_stmt : container_stmt | leaf_stmt | leaf_list_stmt | list_stmt | choice_stmt | anyxml_stmt | uses_stmt;
210 body_stmts : (( identifier_stmt| extension_stmt | feature_stmt | identity_stmt | typedef_stmt | grouping_stmt | data_def_stmt | augment_stmt | rpc_stmt | notification_stmt | deviation_stmt) )*;
211 revision_stmts :  (revision_stmt | stmtsep)*;
212 linkage_stmts : (import_stmt stmtsep* | include_stmt stmtsep*)*;
213 meta_stmts : (organization_stmt stmtsep* | contact_stmt stmtsep* | description_stmt stmtsep* | reference_stmt stmtsep*)*;
214 submodule_header_stmts : (yang_version_stmt stmtsep* | belongs_to_stmt stmtsep*)+ ;
215 module_header_stmts :  (yang_version_stmt stmtsep* | namespace_stmt stmtsep* | prefix_stmt stmtsep*)+ ;
216 // string validated in YangModelBasicValidationListener.enterSubmodule_stmt()
217 submodule_stmt : SUBMODULE_KEYWORD string LEFT_BRACE stmtsep* submodule_header_stmts linkage_stmts meta_stmts revision_stmts body_stmts RIGHT_BRACE;
218 // string validated in YangModelBasicValidationListener.enterModule_stmt()
219 module_stmt : MODULE_KEYWORD string LEFT_BRACE stmtsep* module_header_stmts linkage_stmts meta_stmts revision_stmts body_stmts RIGHT_BRACE;