# source file: yin.rng default namespace = "urn:ietf:params:xml:ns:yang:yin:1" namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0" namespace dc = "http://purl.org/dc/terms" dc:title [ "RELAX NG Schema for YIN" ] dc:creator [ "Ladislav Lhotka" ] dc:date [ "2009-03-03" ] dc:subject [ "YIN, XML syntax for YANG" ] dc:identifier [ "urn:ietf:params:xml:ns:yang:yin:1" ] dc:description [ "RELAX NG schema defines grammar for data models\x{a}" ~ " expressed in YIN, an XML syntax equivalent to YANG." ] ## The document element may be either "module" or "submodule. start = module-stmt | submodule-stmt module-stmt = element module { attribute name { identifier }, module-header-stmts, linkage-stmts, meta-stmts, revision-stmts, body-stmts } submodule-stmt = element submodule { attribute name { identifier }, submodule-header-stmts, linkage-stmts, meta-stmts, revision-stmts, body-stmts } module-header-stmts = yang-version-stmt? & namespace-stmt & prefix-stmt submodule-header-stmts = yang-version-stmt? & belongs-to-stmt meta-stmts = organization-stmt? & contact-stmt? & description-stmt? & reference-stmt? linkage-stmts = (import-stmt | include-stmt)* revision-stmts = revision-stmt* body-stmts = (feature-stmt | identity-stmt | extension-stmt | typedef-stmt | grouping-stmt | data-def-stmt | rpc-stmt | notification-stmt)* feature-stmt = element feature { attribute name { identifier }, if-feature-stmt*, status-stmt?, description-stmt?, reference-stmt? } if-feature-stmt = element if-feature { attribute name { identifier } } identity-stmt = element identity { attribute name { identifier }, base-stmt? } base-stmt = element base { attribute name { identifier-ref } } data-def-stmt = container-stmt | leaf-stmt | leaf-list-stmt | list-stmt | choice-stmt | anyxml-stmt | uses-stmt | augment-stmt case-data-def-stmt = container-stmt | leaf-stmt | leaf-list-stmt | list-stmt | anyxml-stmt | uses-stmt | augment-stmt yang-version-stmt = element yang-version { attribute value { "1" } } import-stmt = element import { attribute module { identifier }, prefix-stmt } include-stmt = element include { attribute module { identifier } } namespace-stmt = element namespace { attribute uri { xsd:anyURI } } prefix-stmt = element prefix { attribute value { identifier } } belongs-to-stmt = element belongs-to { attribute module { identifier }, prefix-stmt } organization-stmt = element organization { element info { text } } contact-stmt = element contact { element info { text } } description-stmt = element description { element text { text } } reference-stmt = element reference { attribute info { xsd:string } } units-stmt = element units { attribute name { xsd:string } } revision-stmt = element revision { attribute date { xsd:date }, description-stmt? } extension-stmt = element extension { attribute name { identifier }, argument-stmt?, status-stmt?, description-stmt?, reference-stmt? } argument-stmt = element argument { attribute name { identifier }, yin-element-stmt? } yin-element-stmt = element yin-element { attribute value { xsd:boolean } } typedef-stmt = element typedef { attribute name { identifier }, (type-stmt & units-stmt? & default-stmt? & status-stmt? & description-stmt? & reference-stmt?) } type-stmt = element type { (attribute name { identifier-ref }, (range-stmt | (length-stmt & pattern-stmts))) | numeric-type | string-type | enumeration-type | bits-type | binary-type | leafref-type | identityref-type | union-type | instance-identifier-type } numeric-type = attribute name { "int8" | "int16" | "int32" | "int64" | "uint8" | "uint16" | "uint32" | "uint64" | "float32" | "float64" }, range-stmt range-stmt = element range { attribute value { range-expr }, (error-message-stmt? & error-app-tag-stmt? & description-stmt? & reference-stmt?) }? string-type = attribute name { "string" }, (length-stmt & pattern-stmts) length-stmt = element length { attribute value { length-expr }, (error-message-stmt? & error-app-tag-stmt? & description-stmt? & reference-stmt?) }? pattern-stmts = element pattern { attribute value { xsd:string }, (error-message-stmt? & error-app-tag-stmt? & description-stmt? & reference-stmt?) }* default-stmt = element default { attribute value { xsd:string } } enumeration-type = attribute name { "enumeration" }, enum-stmt+ enum-stmt = element enum { attribute name { identifier }, (value-stmt? & status-stmt? & description-stmt? & reference-stmt?) } bits-type = attribute name { "bits" }, bit-stmt+ bit-stmt = element bit { attribute name { identifier }, (position-stmt? & status-stmt? & description-stmt? & reference-stmt?) } position-stmt = element position { attribute value { xsd:nonNegativeInteger } } binary-type = attribute name { "binary" }, length-stmt? leafref-type = attribute name { "leafref" }, (element path { attribute value { path-arg } } & require-instance-element?) require-instance-element = element require-instance { xsd:boolean } identityref-type = attribute name { "identityref" }, base-stmt union-type = attribute name { "union" }, type-stmt+ instance-identifier-type = attribute name { "instance-identifier" }, require-instance-element? status-stmt = element status { attribute value { status-arg } } status-arg = "current" | "obsolete" | "deprecated" config-stmt = element config { attribute value { xsd:boolean } } mandatory-stmt = element mandatory { attribute value { xsd:boolean } } presence-stmt = element presence { attribute value { xsd:string } } ordered-by-stmt = element ordered-by { attribute value { ordered-by-arg } } ordered-by-arg = "user" | "system" must-stmt = element must { attribute condition { xsd:string }, (error-message-stmt? & error-app-tag-stmt? & description-stmt? & reference-stmt?) } error-message-stmt = element error-message { element value { text } } error-app-tag-stmt = element error-app-tag { attribute value { xsd:string } } min-elements-stmt = element min-elements { attribute value { xsd:nonNegativeInteger } } max-elements-stmt = element max-elements { attribute value { "unbounded" | xsd:positiveInteger } } value-stmt = element value { attribute value { xsd:integer } } grouping-stmt = element grouping { attribute name { identifier }, (status-stmt? & description-stmt? & reference-stmt? & (typedef-stmt | grouping-stmt | data-def-stmt)*) } container-stmt = element container { attribute name { identifier }, (when-stmt? & if-feature-stmt* & must-stmt* & presence-stmt? & config-stmt? & status-stmt? & description-stmt? & reference-stmt? & (typedef-stmt | grouping-stmt | data-def-stmt)*) } leaf-stmt = element leaf { attribute name { identifier }, (when-stmt? & if-feature-stmt* & type-stmt & units-stmt? & must-stmt* & default-stmt? & config-stmt? & mandatory-stmt? & status-stmt? & description-stmt? & reference-stmt?) } leaf-list-stmt = element leaf-list { attribute name { identifier }, (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?) } list-stmt = element list { attribute name { identifier }, (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+) } key-stmt = element key { attribute value { list { identifier+ } } } unique-stmt = element unique { attribute tag { list { descendant-schema-nodeid+ } } } choice-stmt = element choice { attribute name { identifier }, (when-stmt? & if-feature-stmt* & default-stmt? & config-stmt? & mandatory-stmt? & status-stmt? & description-stmt? & reference-stmt? & (short-case-stmt | case-stmt)*) } short-case-stmt = container-stmt | leaf-stmt | leaf-list-stmt | list-stmt | anyxml-stmt case-stmt = element case { attribute name { identifier }, (when-stmt? & if-feature-stmt* & status-stmt? & description-stmt? & reference-stmt? & case-data-def-stmt*) } anyxml-stmt = element anyxml { attribute name { identifier }, (when-stmt? & if-feature-stmt* & must-stmt* & config-stmt? & mandatory-stmt? & status-stmt? & description-stmt? & reference-stmt?) } uses-stmt = element uses { attribute name { identifier-ref }, (when-stmt? & if-feature-stmt* & status-stmt? & description-stmt? & reference-stmt? & refine-stmt* & uses-augment-stmt*) } refine-stmt = element refine { attribute target-node { descendant-schema-nodeid }, (refine-container-stmts | refine-leaf-stmts | refine-leaf-list-stmts | refine-list-stmts | refine-choice-stmts | refine-case-stmts | refine-anyxml-stmts) } refine-container-stmts = must-stmt* & presence-stmt? & config-stmt? & description-stmt? & reference-stmt? refine-leaf-stmts = must-stmt* & default-stmt? & config-stmt? & mandatory-stmt? & description-stmt? & reference-stmt? refine-leaf-list-stmts = must-stmt* & config-stmt? & min-elements-stmt? & max-elements-stmt? & description-stmt? & reference-stmt? refine-list-stmts = must-stmt* & config-stmt? & min-elements-stmt? & max-elements-stmt? & description-stmt? & reference-stmt? refine-choice-stmts = default-stmt? & config-stmt? & mandatory-stmt? & description-stmt? & reference-stmt? refine-case-stmts = description-stmt? & reference-stmt? refine-anyxml-stmts = config-stmt? & mandatory-stmt? & description-stmt? & reference-stmt? uses-augment-stmt = element augment { attribute target-node { descendant-schema-nodeid }, (when-stmt? & if-feature-stmt* & status-stmt? & description-stmt? & reference-stmt? & (data-def-stmt | case-stmt)+) } augment-stmt = element augment { attribute target-node { absolute-schema-nodeid }, (when-stmt? & if-feature-stmt* & status-stmt? & description-stmt? & reference-stmt? & (data-def-stmt | case-stmt)+) } when-stmt = element when { attribute condition { xsd:string } } rpc-stmt = element rpc { attribute name { identifier }, (if-feature-stmt* & status-stmt? & description-stmt? & reference-stmt? & (typedef-stmt | grouping-stmt)*), input-stmt?, output-stmt? } input-stmt = element input { (typedef-stmt | grouping-stmt)* & data-def-stmt+ } output-stmt = element output { (typedef-stmt | grouping-stmt)* & data-def-stmt+ } notification-stmt = element notification { attribute name { identifier }, (if-feature-stmt* & status-stmt? & description-stmt? & reference-stmt? & (typedef-stmt | grouping-stmt | data-def-stmt)*) } # Regular expressions for lexical terms identifier = xsd:NCName { pattern = "[_A-Za-z][_\-A-Za-z0-9.]*" } identifier-ref = xsd:Name { pattern = "([_A-Za-z][_\-A-Za-z0-9.]*:)?[_A-Za-z][_\-A-Za-z0-9.]*" } range-expr = xsd:string { pattern = "\s*(-INF|INF|min|max|\-?(0|[1-9][0-9]*)(\.[0-9]+(E[\-+]?[0-9]+)?)?)(\s*\.\.\s*(-INF|INF|min|max|\-?(0|[1-9][0-9]*)(\.[0-9]+(E[\-+]?[0-9]+)?)?))?(\s*\|\s*(-INF|INF|min|max|\-?(0|[1-9][0-9]*)(\.[0-9]+(E[\-+]?[0-9]+)?)?)(\s*\.\.\s*(-INF|INF|min|max|\-?(0|[1-9][0-9]*)(\.[0-9]+(E[\-+]?[0-9]+)?)?))?)*\s*" } length-expr = xsd:string { pattern = "\s*(min|max|(0|[1-9][0-9]*))(\s*\.\.\s*(min|max|(0|[1-9][0-9]*)))?(\s*\|\s*(min|max|(0|[1-9][0-9]*))(\s*\.\.\s*(min|max|(0|[1-9][0-9]*)))?)*\s*" } path-arg = xsd:string { pattern = "((/([_A-Za-z][._\-A-Za-z0-9]*:)?[_A-Za-z][._\-A-Za-z0-9]*(\[\s*([_A-Za-z][._\-A-Za-z0-9]*:)?[_A-Za-z][._\-A-Za-z0-9]*\s*=\s*([$]this/(\.\./)+(([_A-Za-z][._\-A-Za-z0-9]*:)?[_A-Za-z][._\-A-Za-z0-9]*/)*([_A-Za-z][._\-A-Za-z0-9]*:)?[_A-Za-z][._\-A-Za-z0-9]*)\s*\])*)+|(\.\./)*([_A-Za-z][._\-A-Za-z0-9]*:)?[_A-Za-z][._\-A-Za-z0-9]*(\[\s*([_A-Za-z][._\-A-Za-z0-9]*:)?[_A-Za-z][._\-A-Za-z0-9]*\s*=\s*([$]this/(\.\./)+(([_A-Za-z][._\-A-Za-z0-9]*:)?[_A-Za-z][._\-A-Za-z0-9]*/)*([_A-Za-z][._\-A-Za-z0-9]*:)?[_A-Za-z][._\-A-Za-z0-9]*)\s*\])?(/([_A-Za-z][._\-A-Za-z0-9]*:)?[_A-Za-z][._\-A-Za-z0-9]*(\[\s*([_A-Za-z][._\-A-Za-z0-9]*:)?[_A-Za-z][._\-A-Za-z0-9]*\s*=\s*([$]this/(\.\./)+(([_A-Za-z][._\-A-Za-z0-9]*:)?[_A-Za-z][._\-A-Za-z0-9]*/)*([_A-Za-z][._\-A-Za-z0-9]*:)?[_A-Za-z][._\-A-Za-z0-9]*)\s*\])*)+)" } absolute-schema-nodeid = xsd:string { pattern = "(/([_A-Za-z][._\-A-Za-z0-9]*:)?[_A-Za-z][._\-A-Za-z0-9]*)+" } descendant-schema-nodeid = xsd:string { pattern = "([_A-Za-z][._\-A-Za-z0-9]*:)?[_A-Za-z][._\-A-Za-z0-9]*(/([_A-Za-z][._\-A-Za-z0-9]*:)?[_A-Za-z][._\-A-Za-z0-9]*)*" }