pubid 2.0.1 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. checksums.yaml +4 -4
  2. data/data/parg/adobe.json +1 -1
  3. data/data/parg/amca.json +1 -1
  4. data/data/parg/ansi.json +1 -1
  5. data/data/parg/api.json +1 -1
  6. data/data/parg/ashrae.json +1 -1
  7. data/data/parg/asme.json +1 -1
  8. data/data/parg/astm.json +1 -1
  9. data/data/parg/bipm.json +1 -1
  10. data/data/parg/bsi.json +1 -1
  11. data/data/parg/ccsds.json +1 -1
  12. data/data/parg/cen_cenelec.json +1 -1
  13. data/data/parg/cie.json +1 -1
  14. data/data/parg/csa.json +1 -1
  15. data/data/parg/ecma.json +1 -1
  16. data/data/parg/etsi.json +1 -1
  17. data/data/parg/evs.json +1 -1
  18. data/data/parg/gost.json +1 -1
  19. data/data/parg/iana.json +1 -1
  20. data/data/parg/idf.json +1 -1
  21. data/data/parg/iec.json +1 -1
  22. data/data/parg/iho.json +1 -0
  23. data/data/parg/isbn.json +1 -1
  24. data/data/parg/itu.json +1 -1
  25. data/data/parg/jcgm.json +1 -1
  26. data/data/parg/jis.json +1 -1
  27. data/data/parg/nist.json +1 -1
  28. data/data/parg/oiml.json +1 -1
  29. data/data/parg/omg.json +1 -1
  30. data/data/parg/plateau.json +1 -1
  31. data/data/parg/tgpp.json +1 -1
  32. data/data/parg/un.json +1 -1
  33. data/lib/pubid/adobe/identifier.rb +1 -1
  34. data/lib/pubid/adobe/parser.rb +2 -113
  35. data/lib/pubid/amca/identifiers/base.rb +1 -1
  36. data/lib/pubid/amca/parser.rb +1 -145
  37. data/lib/pubid/ansi/identifier.rb +1 -1
  38. data/lib/pubid/ansi/parser.rb +1 -82
  39. data/lib/pubid/api/builder.rb +32 -1
  40. data/lib/pubid/api/identifier.rb +1 -1
  41. data/lib/pubid/api/parser.rb +1 -131
  42. data/lib/pubid/ashrae/identifiers/base.rb +1 -1
  43. data/lib/pubid/ashrae/parser.rb +3 -710
  44. data/lib/pubid/asme/builder.rb +6 -4
  45. data/lib/pubid/asme/identifier.rb +1 -2
  46. data/lib/pubid/asme/parser.rb +1 -328
  47. data/lib/pubid/astm/builder.rb +12 -3
  48. data/lib/pubid/astm/identifier.rb +1 -2
  49. data/lib/pubid/astm/parser.rb +1 -227
  50. data/lib/pubid/bipm/identifier.rb +8 -1
  51. data/lib/pubid/bipm/parser.rb +2 -224
  52. data/lib/pubid/bsi/builder.rb +2 -4
  53. data/lib/pubid/bsi/parser.rb +1 -666
  54. data/lib/pubid/bsi/single_identifier.rb +38 -1
  55. data/lib/pubid/calconnect/parser.rb +2 -40
  56. data/lib/pubid/ccsds/identifier.rb +1 -1
  57. data/lib/pubid/ccsds/parser.rb +1 -66
  58. data/lib/pubid/cen_cenelec/identifier.rb +16 -1
  59. data/lib/pubid/cen_cenelec/parser.rb +3 -136
  60. data/lib/pubid/cie/identifier.rb +1 -1
  61. data/lib/pubid/cie/parser.rb +3 -378
  62. data/lib/pubid/conformance.rb +1 -1
  63. data/lib/pubid/csa/builder.rb +41 -18
  64. data/lib/pubid/csa/identifier.rb +12 -4
  65. data/lib/pubid/csa/identifiers/amendment.rb +28 -0
  66. data/lib/pubid/csa/identifiers.rb +1 -0
  67. data/lib/pubid/csa/parser.rb +16 -397
  68. data/lib/pubid/doi/parser.rb +2 -37
  69. data/lib/pubid/easc/builder.rb +1 -1
  70. data/lib/pubid/easc/parser.rb +2 -70
  71. data/lib/pubid/ecma/CLAUDE.md +8 -1
  72. data/lib/pubid/ecma/identifier.rb +13 -8
  73. data/lib/pubid/ecma/parser.rb +2 -54
  74. data/lib/pubid/ecma/renderer.rb +3 -7
  75. data/lib/pubid/errors.rb +18 -13
  76. data/lib/pubid/etsi/builder.rb +8 -5
  77. data/lib/pubid/etsi/identifiers/base.rb +1 -1
  78. data/lib/pubid/etsi/parser.rb +1 -132
  79. data/lib/pubid/evs/identifier.rb +7 -0
  80. data/lib/pubid/evs/parser.rb +1 -8
  81. data/lib/pubid/evs.rb +1 -1
  82. data/lib/pubid/gb/identifier.rb +6 -0
  83. data/lib/pubid/gb/parser.rb +2 -51
  84. data/lib/pubid/gost/identifier.rb +9 -1
  85. data/lib/pubid/gost/parser.rb +4 -81
  86. data/lib/pubid/iala/parser.rb +2 -121
  87. data/lib/pubid/iana/identifier.rb +1 -1
  88. data/lib/pubid/iana/parser.rb +2 -24
  89. data/lib/pubid/identifier.rb +78 -1
  90. data/lib/pubid/idf/builder.rb +42 -0
  91. data/lib/pubid/idf/identifier.rb +1 -1
  92. data/lib/pubid/idf/parser.rb +1 -137
  93. data/lib/pubid/idf.rb +1 -2
  94. data/lib/pubid/iec/builder.rb +158 -50
  95. data/lib/pubid/iec/identifier.rb +1 -1
  96. data/lib/pubid/iec/parser.rb +3 -430
  97. data/lib/pubid/ieee/aiee/identifier.rb +2 -1
  98. data/lib/pubid/ieee/aiee.rb +0 -1
  99. data/lib/pubid/ieee/builder.rb +2 -2
  100. data/lib/pubid/ieee/identifiers/base.rb +1 -1
  101. data/lib/pubid/ieee/ire/identifier.rb +2 -1
  102. data/lib/pubid/ieee/ire.rb +0 -1
  103. data/lib/pubid/ieee/nesc.rb +0 -1
  104. data/lib/pubid/ieee/parser.rb +1 -1257
  105. data/lib/pubid/ietf/identifiers/base.rb +17 -1
  106. data/lib/pubid/ietf/parser.rb +2 -47
  107. data/lib/pubid/ietf/renderer.rb +17 -2
  108. data/lib/pubid/iho/CLAUDE.md +89 -0
  109. data/lib/pubid/iho/builder.rb +4 -1
  110. data/lib/pubid/iho/identifiers/base.rb +28 -2
  111. data/lib/pubid/iho/renderer.rb +8 -0
  112. data/lib/pubid/iho/urn_generator.rb +11 -1
  113. data/lib/pubid/iho/urn_parser.rb +21 -11
  114. data/lib/pubid/iho.rb +0 -1
  115. data/lib/pubid/isbn/identifier.rb +1 -1
  116. data/lib/pubid/isbn/parser.rb +2 -31
  117. data/lib/pubid/iso/builder.rb +1 -1
  118. data/lib/pubid/iso/identifiers/directives.rb +6 -3
  119. data/lib/pubid/iso/identifiers/guide.rb +6 -3
  120. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +6 -3
  121. data/lib/pubid/iso/normalizer.rb +1 -1
  122. data/lib/pubid/iso/parser.rb +1 -539
  123. data/lib/pubid/iso/supplement_identifier.rb +6 -3
  124. data/lib/pubid/iso/utilities.rb +4 -5
  125. data/lib/pubid/iso.rb +1 -19
  126. data/lib/pubid/itu/builder.rb +36 -20
  127. data/lib/pubid/itu/identifiers/base.rb +15 -2
  128. data/lib/pubid/itu/parser.rb +1 -775
  129. data/lib/pubid/jcgm/builder.rb +35 -0
  130. data/lib/pubid/jcgm/parser.rb +1 -151
  131. data/lib/pubid/jcgm.rb +1 -2
  132. data/lib/pubid/jis/builder.rb +18 -29
  133. data/lib/pubid/jis/identifier.rb +1 -1
  134. data/lib/pubid/jis/parser.rb +1 -128
  135. data/lib/pubid/nist/builder.rb +5 -1
  136. data/lib/pubid/nist/caster.rb +13 -3
  137. data/lib/pubid/nist/identifiers/base.rb +37 -2
  138. data/lib/pubid/nist/identifiers/circular.rb +2 -2
  139. data/lib/pubid/nist/identifiers/circular_supplement.rb +2 -2
  140. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +2 -2
  141. data/lib/pubid/nist/identifiers/crpl_report.rb +2 -2
  142. data/lib/pubid/nist/identifiers/handbook.rb +2 -2
  143. data/lib/pubid/nist/identifiers/internal_report.rb +2 -2
  144. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +2 -2
  145. data/lib/pubid/nist/identifiers/monograph.rb +2 -2
  146. data/lib/pubid/nist/identifiers/report.rb +2 -2
  147. data/lib/pubid/nist/parser.rb +19 -775
  148. data/lib/pubid/nist/router.rb +4 -1
  149. data/lib/pubid/nist/supplement_identifier.rb +2 -2
  150. data/lib/pubid/oasis/parser.rb +2 -16
  151. data/lib/pubid/ogc/parser.rb +2 -26
  152. data/lib/pubid/oiml/identifiers/certification_system.rb +7 -0
  153. data/lib/pubid/oiml/identifiers/dual_published.rb +2 -2
  154. data/lib/pubid/oiml/parser.rb +1 -303
  155. data/lib/pubid/oiml.rb +1 -2
  156. data/lib/pubid/omg/identifier.rb +6 -1
  157. data/lib/pubid/omg/parser.rb +2 -76
  158. data/lib/pubid/parser.rb +5 -4
  159. data/lib/pubid/parsers/mr_string.rb +1 -1
  160. data/lib/pubid/plateau/parser.rb +1 -66
  161. data/lib/pubid/plateau.rb +1 -2
  162. data/lib/pubid/renderers/directives_renderer.rb +1 -1
  163. data/lib/pubid/renderers/iwa_renderer.rb +1 -1
  164. data/lib/pubid/renderers/publisher_stripper.rb +82 -0
  165. data/lib/pubid/renderers/supplement_renderer.rb +1 -1
  166. data/lib/pubid/renderers.rb +1 -0
  167. data/lib/pubid/sae/parser.rb +1 -48
  168. data/lib/pubid/tgpp/identifier.rb +1 -1
  169. data/lib/pubid/tgpp/parser.rb +2 -59
  170. data/lib/pubid/un/identifier.rb +1 -1
  171. data/lib/pubid/un/parser.rb +1 -18
  172. data/lib/pubid/version.rb +1 -1
  173. data/lib/pubid/w3c/parser.rb +2 -27
  174. data/lib/pubid/xsf/identifier.rb +10 -6
  175. data/lib/pubid/xsf/parser.rb +3 -31
  176. data/lib/pubid/xsf/renderer.rb +2 -4
  177. data/lib/pubid.rb +8 -9
  178. metadata +6 -23
  179. data/lib/pubid/ieee/aiee/parser.rb +0 -130
  180. data/lib/pubid/ieee/ire/parser.rb +0 -109
  181. data/lib/pubid/ieee/nesc/parser.rb +0 -155
  182. data/lib/pubid/iho/parser.rb +0 -68
  183. data/lib/pubid/parser/common_parse_methods.rb +0 -13
  184. data/lib/pubid/parser/common_parse_rules.rb +0 -56
  185. data/lib/pubid/parser/grammar.rb +0 -96
data/data/parg/oiml.json CHANGED
@@ -1 +1 @@
1
- {"bindings":null,"version":"0.1.0","grammar":"PubidOiml","shape":"parsanol-tree/v2","binding_version":1,"entries":{"identifier":{"root":"identifier","grammar":{"atoms":[{"Entity":{"atom":42}},{"Str":{"pattern":"OIML"}},{"Named":{"name":"publisher","atom":1}},{"Entity":{"atom":4}},{"Str":{"pattern":"-"}},{"Entity":{"atom":6}},{"Str":{"pattern":" "}},{"Alternative":{"atoms":[3,5]}},{"Str":{"pattern":"CS"}},{"Named":{"name":"cs_series","atom":8}},{"Entity":{"atom":6}},{"Str":{"pattern":"PD"}},{"Str":{"pattern":"OD"}},{"Str":{"pattern":"CID"}},{"Alternative":{"atoms":[11,12,13]}},{"Named":{"name":"cs_family","atom":14}},{"Entity":{"atom":4}},{"Entity":{"atom":6}},{"Alternative":{"atoms":[16,17]}},{"Named":{"name":"cs_separator","atom":18}},{"Entity":{"atom":21}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":20,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"number","atom":22}},{"Entity":{"atom":6}},{"Str":{"pattern":"Edition"}},{"Entity":{"atom":6}},{"Entity":{"atom":21}},{"Repetition":{"atom":27,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"edition","atom":28}},{"Entity":{"atom":6}},{"Entity":{"atom":32}},{"Str":{"pattern":"("}},{"Str":{"pattern":"Amendment"}},{"Entity":{"atom":6}},{"Entity":{"atom":21}},{"Repetition":{"atom":35,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"cs_amendment","atom":36}},{"Entity":{"atom":39}},{"Str":{"pattern":")"}},{"Sequence":{"atoms":[30,31,33,34,37,38]}},{"Repetition":{"atom":40,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[2,7,9,10,15,19,23,24,25,26,29,41]}},{"Entity":{"atom":267}},{"Str":{"pattern":"Amendment"}},{"Entity":{"atom":6}},{"Entity":{"atom":32}},{"Entity":{"atom":56}},{"Entity":{"atom":51}},{"Str":{"pattern":"19"}},{"Str":{"pattern":"20"}},{"Alternative":{"atoms":[49,50]}},{"Entity":{"atom":21}},{"Repetition":{"atom":52,"min":2,"max":null,"tag":"Repetition"}},{"Entity":{"atom":21}},{"Lookahead":{"atom":54,"positive":false}},{"Sequence":{"atoms":[48,53,55]}},{"Named":{"name":"year","atom":47}},{"Entity":{"atom":39}},{"Entity":{"atom":6}},{"Str":{"pattern":"to"}},{"Entity":{"atom":6}},{"Entity":{"atom":216}},{"Entity":{"atom":67}},{"Str":{"pattern":"OIML"}},{"Named":{"name":"publisher","atom":64}},{"Entity":{"atom":6}},{"Sequence":{"atoms":[65,66]}},{"Entity":{"atom":80}},{"Entity":{"atom":77}},{"Re":{"pattern":"[B]"}},{"Re":{"pattern":"[D]"}},{"Re":{"pattern":"[E]"}},{"Re":{"pattern":"[G]"}},{"Re":{"pattern":"[R]"}},{"Re":{"pattern":"[S]"}},{"Re":{"pattern":"[V]"}},{"Alternative":{"atoms":[70,71,72,73,74,75,76]}},{"Named":{"name":"type","atom":69}},{"Entity":{"atom":6}},{"Sequence":{"atoms":[78,79]}},{"Entity":{"atom":144}},{"Entity":{"atom":86}},{"Entity":{"atom":85}},{"Entity":{"atom":21}},{"Repetition":{"atom":84,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"number","atom":83}},{"Entity":{"atom":98}},{"Entity":{"atom":4}},{"Entity":{"atom":85}},{"Entity":{"atom":91}},{"Str":{"pattern":"/"}},{"Entity":{"atom":4}},{"Entity":{"atom":85}},{"Sequence":{"atoms":[90,92,93]}},{"Repetition":{"atom":94,"min":0,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[89,95]}},{"Named":{"name":"part","atom":96}},{"Sequence":{"atoms":[88,97]}},{"Entity":{"atom":103}},{"Entity":{"atom":4}},{"Entity":{"atom":85}},{"Named":{"name":"subpart","atom":101}},{"Sequence":{"atoms":[100,102]}},{"Entity":{"atom":132}},{"Entity":{"atom":124}},{"Entity":{"atom":4}},{"Str":{"pattern":"GUM"}},{"Entity":{"atom":6}},{"Entity":{"atom":85}},{"Sequence":{"atoms":[107,108,109]}},{"Entity":{"atom":114}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Re":{"pattern":"[\\x61-\\x7a]"}},{"Alternative":{"atoms":[112,113]}},{"Repetition":{"atom":111,"min":1,"max":null,"tag":"Repetition"}},{"Str":{"pattern":"_"}},{"Repetition":{"atom":116,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":85}},{"Sequence":{"atoms":[117,118]}},{"Repetition":{"atom":119,"min":0,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[115,120]}},{"Alternative":{"atoms":[110,121]}},{"Named":{"name":"code_suffix","atom":122}},{"Sequence":{"atoms":[106,123]}},{"Entity":{"atom":131}},{"Entity":{"atom":6}},{"Str":{"pattern":"Brochure"}},{"Named":{"name":"code_suffix","atom":127}},{"Str":{"pattern":""}},{"Named":{"name":"space_suffix","atom":129}},{"Sequence":{"atoms":[126,128,130]}},{"Alternative":{"atoms":[105,125]}},{"Repetition":{"atom":104,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[82,87,99,133]}},{"Entity":{"atom":86}},{"Entity":{"atom":98}},{"Entity":{"atom":132}},{"Repetition":{"atom":137,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[135,136,138]}},{"Entity":{"atom":86}},{"Entity":{"atom":132}},{"Repetition":{"atom":141,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[140,142]}},{"Alternative":{"atoms":[134,139,143]}},{"Entity":{"atom":195}},{"Entity":{"atom":178}},{"Str":{"pattern":", "}},{"Entity":{"atom":6}},{"Alternative":{"atoms":[147,148]}},{"Entity":{"atom":165}},{"Str":{"pattern":"6th"}},{"Str":{"pattern":"5th"}},{"Str":{"pattern":"4th"}},{"Str":{"pattern":"3rd"}},{"Str":{"pattern":"2nd"}},{"Str":{"pattern":"1st"}},{"Entity":{"atom":85}},{"Str":{"pattern":"th"}},{"Str":{"pattern":"nd"}},{"Str":{"pattern":"rd"}},{"Str":{"pattern":"st"}},{"Alternative":{"atoms":[158,159,160,161]}},{"Sequence":{"atoms":[157,162]}},{"Alternative":{"atoms":[151,152,153,154,155,156,163]}},{"Named":{"name":"edition","atom":164}},{"Repetition":{"atom":150,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":6}},{"Repetition":{"atom":167,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":172}},{"Str":{"pattern":"Edition"}},{"Str":{"pattern":"edition"}},{"Alternative":{"atoms":[170,171]}},{"Entity":{"atom":6}},{"Repetition":{"atom":173,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":56}},{"Named":{"name":"year","atom":175}},{"Sequence":{"atoms":[149,166,168,169,174,176]}},{"Named":{"name":"edition_format","atom":177}},{"Entity":{"atom":6}},{"Repetition":{"atom":179,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":182}},{"Str":{"pattern":":"}},{"Entity":{"atom":6}},{"Repetition":{"atom":183,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":56}},{"Named":{"name":"year","atom":185}},{"Sequence":{"atoms":[180,181,184,186]}},{"Entity":{"atom":6}},{"Repetition":{"atom":188,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":32}},{"Entity":{"atom":56}},{"Named":{"name":"year","atom":191}},{"Entity":{"atom":39}},{"Sequence":{"atoms":[189,190,192,193]}},{"Alternative":{"atoms":[146,187,194]}},{"Repetition":{"atom":145,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":214}},{"Entity":{"atom":6}},{"Entity":{"atom":207}},{"Entity":{"atom":85}},{"Entity":{"atom":202}},{"Str":{"pattern":"."}},{"Entity":{"atom":85}},{"Sequence":{"atoms":[200,201,203]}},{"Entity":{"atom":85}},{"Alternative":{"atoms":[204,205]}},{"Named":{"name":"iteration","atom":206}},{"Repetition":{"atom":199,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":213}},{"Str":{"pattern":"WD"}},{"Str":{"pattern":"CD"}},{"Alternative":{"atoms":[210,211]}},{"Named":{"name":"stage","atom":212}},{"Sequence":{"atoms":[198,208,209]}},{"Repetition":{"atom":197,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[63,68,81,196,215]}},{"Named":{"name":"base","atom":62}},{"Entity":{"atom":264}},{"Entity":{"atom":258}},{"Entity":{"atom":6}},{"Entity":{"atom":32}},{"Entity":{"atom":254}},{"Entity":{"atom":233}},{"Re":{"pattern":"[E]"}},{"Re":{"pattern":"[F]"}},{"Re":{"pattern":"[R]"}},{"Re":{"pattern":"[X]"}},{"Re":{"pattern":"[D]"}},{"Re":{"pattern":"[S]"}},{"Re":{"pattern":"[C]"}},{"Re":{"pattern":"[A]"}},{"Re":{"pattern":"[U]"}},{"Alternative":{"atoms":[224,225,226,227,228,229,230,231,232]}},{"Entity":{"atom":91}},{"Entity":{"atom":233}},{"Sequence":{"atoms":[223,234,235]}},{"Entity":{"atom":242}},{"Str":{"pattern":"PO"}},{"Str":{"pattern":"PT"}},{"Str":{"pattern":"PE"}},{"Str":{"pattern":"SR"}},{"Alternative":{"atoms":[238,239,240,241]}},{"Entity":{"atom":244}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Entity":{"atom":246}},{"Re":{"pattern":"[\\x61-\\x7a]"}},{"Repetition":{"atom":245,"min":2,"max":2,"tag":"Repetition"}},{"Sequence":{"atoms":[243,247]}},{"Entity":{"atom":233}},{"Entity":{"atom":252}},{"Entity":{"atom":246}},{"Repetition":{"atom":251,"min":2,"max":2,"tag":"Repetition"}},{"Alternative":{"atoms":[236,237,248,249,250]}},{"Named":{"name":"language","atom":253}},{"Entity":{"atom":39}},{"Str":{"pattern":""}},{"Named":{"name":"space_before_lang","atom":256}},{"Sequence":{"atoms":[220,221,222,255,257]}},{"Entity":{"atom":263}},{"Entity":{"atom":32}},{"Entity":{"atom":254}},{"Entity":{"atom":39}},{"Sequence":{"atoms":[260,261,262]}},{"Alternative":{"atoms":[219,259]}},{"Named":{"name":"language","atom":218}},{"Repetition":{"atom":265,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[44,45,46,57,58,59,60,61,217,266]}},{"Entity":{"atom":294}},{"Entity":{"atom":67}},{"Entity":{"atom":80}},{"Entity":{"atom":144}},{"Named":{"name":"base_code","atom":271}},{"Entity":{"atom":6}},{"Str":{"pattern":"Amendment"}},{"Named":{"name":"amd_marker","atom":274}},{"Entity":{"atom":6}},{"Entity":{"atom":172}},{"Entity":{"atom":6}},{"Repetition":{"atom":278,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":56}},{"Named":{"name":"year","atom":280}},{"Sequence":{"atoms":[276,277,279,281]}},{"Named":{"name":"edition_format","atom":282}},{"Entity":{"atom":182}},{"Entity":{"atom":6}},{"Repetition":{"atom":285,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":56}},{"Named":{"name":"year","atom":287}},{"Sequence":{"atoms":[284,286,288]}},{"Alternative":{"atoms":[283,289]}},{"Entity":{"atom":264}},{"Named":{"name":"language","atom":291}},{"Repetition":{"atom":292,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[269,270,272,273,275,290,293]}},{"Entity":{"atom":324}},{"Entity":{"atom":216}},{"Named":{"name":"base","atom":296}},{"Entity":{"atom":6}},{"Str":{"pattern":"Annex"}},{"Entity":{"atom":6}},{"Entity":{"atom":308}},{"Entity":{"atom":244}},{"Entity":{"atom":4}},{"Entity":{"atom":244}},{"Sequence":{"atoms":[303,304]}},{"Repetition":{"atom":305,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[302,306]}},{"Named":{"name":"annex_letter","atom":307}},{"Entity":{"atom":6}},{"Entity":{"atom":172}},{"Entity":{"atom":6}},{"Entity":{"atom":56}},{"Named":{"name":"year","atom":312}},{"Sequence":{"atoms":[309,310,311,313]}},{"Entity":{"atom":182}},{"Entity":{"atom":56}},{"Named":{"name":"year","atom":316}},{"Sequence":{"atoms":[315,317]}},{"Alternative":{"atoms":[314,318]}},{"Repetition":{"atom":319,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":264}},{"Named":{"name":"language","atom":321}},{"Repetition":{"atom":322,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[297,298,299,300,301,320,323]}},{"Entity":{"atom":347}},{"Entity":{"atom":216}},{"Named":{"name":"base","atom":326}},{"Entity":{"atom":6}},{"Str":{"pattern":"Annexes"}},{"Named":{"name":"annex_marker","atom":329}},{"Entity":{"atom":6}},{"Entity":{"atom":172}},{"Entity":{"atom":6}},{"Entity":{"atom":56}},{"Named":{"name":"year","atom":334}},{"Sequence":{"atoms":[331,332,333,335]}},{"Named":{"name":"edition_format","atom":336}},{"Entity":{"atom":182}},{"Entity":{"atom":56}},{"Named":{"name":"year","atom":339}},{"Sequence":{"atoms":[338,340]}},{"Alternative":{"atoms":[337,341]}},{"Repetition":{"atom":342,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":264}},{"Named":{"name":"language","atom":344}},{"Repetition":{"atom":345,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[327,328,330,343,346]}},{"Entity":{"atom":365}},{"Entity":{"atom":216}},{"Named":{"name":"base","atom":349}},{"Entity":{"atom":352}},{"Str":{"pattern":"+"}},{"Str":{"pattern":"Amendment"}},{"Str":{"pattern":"Errata"}},{"Alternative":{"atoms":[353,354]}},{"Named":{"name":"plus_marker","atom":355}},{"Entity":{"atom":182}},{"Entity":{"atom":56}},{"Named":{"name":"year","atom":358}},{"Sequence":{"atoms":[357,359]}},{"Repetition":{"atom":360,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":264}},{"Named":{"name":"language","atom":362}},{"Repetition":{"atom":363,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[350,351,356,361,364]}},{"Entity":{"atom":383}},{"Entity":{"atom":216}},{"Named":{"name":"base","atom":367}},{"Entity":{"atom":6}},{"Str":{"pattern":"Amendment"}},{"Str":{"pattern":"Errata"}},{"Alternative":{"atoms":[370,371]}},{"Named":{"name":"trailing_marker","atom":372}},{"Entity":{"atom":6}},{"Entity":{"atom":21}},{"Repetition":{"atom":375,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"number","atom":376}},{"Sequence":{"atoms":[374,377]}},{"Repetition":{"atom":378,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":264}},{"Named":{"name":"language","atom":380}},{"Repetition":{"atom":381,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[368,369,373,379,382]}},{"Entity":{"atom":435}},{"Str":{"pattern":"OIML"}},{"Named":{"name":"publisher","atom":385}},{"Entity":{"atom":6}},{"Str":{"pattern":"Bulletin"}},{"Named":{"name":"type","atom":388}},{"Entity":{"atom":412}},{"Entity":{"atom":6}},{"Entity":{"atom":402}},{"Re":{"pattern":"[I]"}},{"Re":{"pattern":"[V]"}},{"Re":{"pattern":"[X]"}},{"Re":{"pattern":"[L]"}},{"Re":{"pattern":"[C]"}},{"Re":{"pattern":"[D]"}},{"Re":{"pattern":"[M]"}},{"Alternative":{"atoms":[393,394,395,396,397,398,399]}},{"Repetition":{"atom":400,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"volume_roman","atom":401}},{"Entity":{"atom":32}},{"Entity":{"atom":21}},{"Repetition":{"atom":404,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"issue_arabic","atom":405}},{"Entity":{"atom":39}},{"Entity":{"atom":6}},{"Entity":{"atom":21}},{"Repetition":{"atom":409,"min":8,"max":8,"tag":"Repetition"}},{"Named":{"name":"article_id","atom":410}},{"Sequence":{"atoms":[391,392,403,406,407,408,411]}},{"Entity":{"atom":429}},{"Entity":{"atom":6}},{"Entity":{"atom":56}},{"Named":{"name":"year","atom":415}},{"Entity":{"atom":4}},{"Entity":{"atom":420}},{"Entity":{"atom":21}},{"Repetition":{"atom":419,"min":2,"max":null,"tag":"Repetition"}},{"Named":{"name":"issue","atom":418}},{"Sequence":{"atoms":[417,421]}},{"Repetition":{"atom":422,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":4}},{"Entity":{"atom":420}},{"Named":{"name":"sequence","atom":425}},{"Sequence":{"atoms":[424,426]}},{"Repetition":{"atom":427,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[414,416,423,428]}},{"Alternative":{"atoms":[390,413]}},{"Repetition":{"atom":430,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":264}},{"Named":{"name":"language","atom":432}},{"Repetition":{"atom":433,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[386,387,389,431,434]}},{"Entity":{"atom":446}},{"Entity":{"atom":67}},{"Entity":{"atom":80}},{"Entity":{"atom":144}},{"Entity":{"atom":195}},{"Repetition":{"atom":440,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":214}},{"Repetition":{"atom":442,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":264}},{"Repetition":{"atom":444,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[437,438,439,441,443,445]}},{"Alternative":{"atoms":[0,43,268,295,325,348,366,384,436]}}],"root":447},"bindings":[]}},"preprocess":{},"tables":{},"lint":{"order_warnings":["rule roman_numeral: branches 1 and 2 are order-dependent (shared first bytes; ordered choice is decisive)","rule full_number: branches 1 and 2 are order-dependent (shared first bytes; ordered choice is decisive)","rule full_number: branches 1 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule full_number: branches 2 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule date: branches 1 and 2 are order-dependent (shared first bytes; ordered choice is decisive)","rule date: branches 1 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule date: branches 2 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule lang_multi_oiml: branches 1 and 2 are order-dependent (shared first bytes; ordered choice is decisive)","rule lang_multi_oiml: branches 1 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule lang_multi_oiml: branches 2 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 1 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 1 and 4 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 1 and 5 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 1 and 6 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 1 and 7 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 1 and 8 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 1 and 9 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 3 and 4 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 3 and 5 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 3 and 6 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 3 and 7 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 3 and 8 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 3 and 9 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 4 and 5 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 4 and 6 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 4 and 7 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 4 and 8 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 4 and 9 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 5 and 6 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 5 and 7 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 5 and 8 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 5 and 9 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 6 and 7 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 6 and 8 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 6 and 9 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 7 and 8 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 7 and 9 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 8 and 9 are order-dependent (shared first bytes; ordered choice is decisive)"]},"default_entry":"identifier","render":{},"derive":{},"tests":[{"entry":"identifier","kind":"accept","input":"OIML V 2 Edition 2007","expect":{}},{"entry":"identifier","kind":"accept","input":"OIML R 137-1:2012","expect":{}},{"entry":"identifier","kind":"accept","input":"OIML D 11","expect":{}},{"entry":"identifier","kind":"reject","input":"nonsense","expect":{}}],"docs":{},"source":"# Port of lib/pubid/oiml/parser.rb — OIML identifiers: the base form,\n# drafts, amendments (full/short/+/trailing), annexes, bulletins.\n\ngrammar PubidOiml version \"0.1.0\" mode \"v1\" {\n # The monorepo's doc_type is [BDEGRSV] — X is deliberately absent\n # (\"OIML X 99\" must be rejected).\n letter_bdegrsvx = %x42 / %x44 / %x45 / %x47 / %x52 / %x53 / %x56\n digit = %x30-39\n letter = %x41-5A / %x61-7A\n digits = 1*digit\n two_digits = 2*digit\n space = \" \"\n dash = \"-\"\n colon = \":\"\n slash = \"/\"\n lparen = \"(\"\n rparen = \")\"\n dot = \".\"\n plus = \"+\"\n century = \"19\" / \"20\"\n year_digits = century 2*digit !digit\n\n publisher = \"OIML\" as publisher space\n doc_type = letter_bdegrsvx as type space\n two_digits_c = two_digits\n\n bulletin_date = space year_digits as year [(dash two_digits as issue)] [(dash two_digits as sequence)]\n roman_numeral = 1*%x49 / 1*(%x49 / %x56 / %x58 / %x4C / %x43 / %x44 / %x4D)\n roman = (1*(%x49 / %x56 / %x58 / %x4C / %x43 / %x44 / %x4D)) as volume_roman\n bulletin_citation = space roman lparen (1*digit) as issue_arabic rparen space (8digit) as article_id\n bulletin_identifier = \"OIML\" as publisher space \"Bulletin\" as type [bulletin_citation / bulletin_date] [language_portion as language]\n\n number_only = digits as number\n part_number = dash (digits *(slash dash digits)) as part\n subpart_number = dash digits as subpart\n named_suffix_gum = dash (\"GUM\" space digits / (1*letter *(([\"_\"] digits)))) as code_suffix\n named_suffix_brochure = space \"Brochure\" as code_suffix (\"\" as space_suffix)\n named_suffix = named_suffix_gum / named_suffix_brochure\n full_number = (number_only part_number subpart_number [named_suffix]) / (number_only part_number [named_suffix]) / (number_only [named_suffix])\n\n edition_number = (\"6th\" / \"5th\" / \"4th\" / \"3rd\" / \"2nd\" / \"1st\" / (digits (\"th\" / \"nd\" / \"rd\" / \"st\"))) as edition\n edition_text = \"Edition\" / \"edition\"\n edition_portion = ((\", \" / space) [edition_number] [space] edition_text [space] year_digits as year) as edition_format\n date = edition_portion / ([space] colon [space] year_digits as year) / ([space] lparen year_digits as year rparen)\n stage_iteration = ((digits dot digits) / digits) as iteration\n stage_abbr = (\"WD\" / \"CD\") as stage\n draft_stage = space [stage_iteration] stage_abbr\n\n lang_single = %x45 / %x46 / %x52 / %x58 / %x44 / %x53 / %x43 / %x41 / %x55\n lang_multi_oiml = \"PO\" / \"PT\" / \"PE\" / \"SR\"\n lang_multi = 2*2lower\n lower = %x61-7A\n language_code = ((lang_single slash lang_single) / lang_multi_oiml / (upper 2*2lower) / lang_single / lang_multi) as language\n language_with_space = space lparen language_code rparen (\"\" as space_before_lang)\n language_without_space = lparen language_code rparen\n language_portion = language_with_space / language_without_space\n\n amendment_identifier = \"Amendment\" space lparen year_digits as year rparen space \"to\" space (base_without_language as base) [language_portion as language]\n amendment_short = publisher doc_type (full_number as base_code) space \"Amendment\" as amd_marker ((space edition_text [space] year_digits as year) as edition_format / (colon [space] year_digits as year)) [language_portion as language]\n trailing_supplement_identifier = (base_without_language as base) space (\"Amendment\" / \"Errata\") as trailing_marker [space ((1*digit)) as number] [language_portion as language]\n plus_supplement_identifier = (base_without_language as base) plus (\"Amendment\" / \"Errata\") as plus_marker [(colon year_digits as year)] [language_portion as language]\n annex_identifier = (base_without_language as base) space \"Annexes\" as annex_marker [((space edition_text space year_digits as year) as edition_format / (colon year_digits as year))] [language_portion as language]\n annex_letter_value = (upper [(dash upper)]) as annex_letter\n annex_letter_identifier = (base_without_language as base) space \"Annex\" space annex_letter_value [((space edition_text space year_digits as year) / (colon year_digits as year))] [language_portion as language]\n base_without_language = publisher doc_type full_number [date] [draft_stage]\n base = publisher doc_type full_number [date] [draft_stage] [language_portion]\n\n cs_identifier = (\"OIML\" as publisher (dash / space) \"CS\" as cs_series space (\"PD\" / \"OD\" / \"CID\") as cs_family (dash / space) as cs_separator (1*digit) as number space \"Edition\" space (1*digit) as edition [(space lparen \"Amendment\" space (1*digit) as cs_amendment rparen)])\n identifier = cs_identifier / amendment_identifier / amendment_short / annex_letter_identifier / annex_identifier / plus_supplement_identifier / trailing_supplement_identifier / bulletin_identifier / base\n\n upper = %x41-5A\n entry identifier: identifier\n\n test {\n accept \"OIML V 2 Edition 2007\"\n accept \"OIML R 137-1:2012\"\n accept \"OIML D 11\"\n reject \"nonsense\"\n }\n}\n","source_hash":"03fba4fca48e913117bf95a58cd6574d2a66adb4a63999a5fdef61ee8451d832","unicode_tables":"onigmo (Ruby 3.4.8)","compiler_version":"1.3.114","edition":1,"checksum":"sha256:5d4c4062cfd2476f1f8b82d28582f69ab18af07bb6a7d444b7e6b3ca1928d6b6"}
1
+ {"bindings":null,"version":"0.1.0","grammar":"PubidOiml","shape":"parsanol-tree/v2","binding_version":1,"entries":{"identifier":{"root":"identifier","grammar":{"atoms":[{"Entity":{"atom":45}},{"Str":{"pattern":"OIML"}},{"Named":{"name":"publisher","atom":1}},{"Entity":{"atom":4}},{"Str":{"pattern":"-"}},{"Named":{"name":"dash","atom":3}},{"Entity":{"atom":7}},{"Str":{"pattern":" "}},{"Alternative":{"atoms":[5,6]}},{"Str":{"pattern":"CS"}},{"Named":{"name":"cs_series","atom":9}},{"Entity":{"atom":7}},{"Str":{"pattern":"PD"}},{"Str":{"pattern":"OD"}},{"Str":{"pattern":"CID"}},{"Alternative":{"atoms":[12,13,14]}},{"Named":{"name":"cs_family","atom":15}},{"Entity":{"atom":4}},{"Entity":{"atom":7}},{"Alternative":{"atoms":[17,18]}},{"Named":{"name":"cs_separator","atom":19}},{"Entity":{"atom":22}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":21,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"doc_number","atom":23}},{"Entity":{"atom":7}},{"Str":{"pattern":"Edition"}},{"Entity":{"atom":7}},{"Entity":{"atom":22}},{"Repetition":{"atom":28,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"edition","atom":29}},{"Entity":{"atom":7}},{"Entity":{"atom":33}},{"Str":{"pattern":"("}},{"Named":{"name":"lparen","atom":32}},{"Str":{"pattern":"Amendment"}},{"Entity":{"atom":7}},{"Entity":{"atom":22}},{"Repetition":{"atom":37,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"cs_amendment","atom":38}},{"Entity":{"atom":41}},{"Str":{"pattern":")"}},{"Named":{"name":"rparen","atom":40}},{"Sequence":{"atoms":[31,34,35,36,39,42]}},{"Repetition":{"atom":43,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[2,8,10,11,16,20,24,25,26,27,30,44]}},{"Entity":{"atom":300}},{"Str":{"pattern":"Amendment"}},{"Entity":{"atom":7}},{"Entity":{"atom":33}},{"Named":{"name":"lparen","atom":49}},{"Entity":{"atom":54}},{"Str":{"pattern":"19"}},{"Str":{"pattern":"20"}},{"Alternative":{"atoms":[52,53]}},{"Entity":{"atom":22}},{"Repetition":{"atom":55,"min":2,"max":null,"tag":"Repetition"}},{"Entity":{"atom":22}},{"Lookahead":{"atom":57,"positive":false}},{"Sequence":{"atoms":[51,56,58]}},{"Named":{"name":"supplement_year","atom":59}},{"Entity":{"atom":41}},{"Named":{"name":"rparen","atom":61}},{"Entity":{"atom":7}},{"Str":{"pattern":"to"}},{"Entity":{"atom":7}},{"Entity":{"atom":248}},{"Entity":{"atom":71}},{"Str":{"pattern":"OIML"}},{"Named":{"name":"publisher","atom":68}},{"Entity":{"atom":7}},{"Sequence":{"atoms":[69,70]}},{"Entity":{"atom":84}},{"Entity":{"atom":81}},{"Re":{"pattern":"[B]"}},{"Re":{"pattern":"[D]"}},{"Re":{"pattern":"[E]"}},{"Re":{"pattern":"[G]"}},{"Re":{"pattern":"[R]"}},{"Re":{"pattern":"[S]"}},{"Re":{"pattern":"[V]"}},{"Alternative":{"atoms":[74,75,76,77,78,79,80]}},{"Named":{"name":"type","atom":73}},{"Entity":{"atom":7}},{"Sequence":{"atoms":[82,83]}},{"Entity":{"atom":154}},{"Entity":{"atom":89}},{"Entity":{"atom":22}},{"Repetition":{"atom":87,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"number","atom":88}},{"Entity":{"atom":104}},{"Entity":{"atom":4}},{"Named":{"name":"dash","atom":91}},{"Entity":{"atom":22}},{"Repetition":{"atom":93,"min":1,"max":null,"tag":"Repetition"}},{"Entity":{"atom":96}},{"Str":{"pattern":"/"}},{"Entity":{"atom":4}},{"Entity":{"atom":22}},{"Repetition":{"atom":98,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[95,97,99]}},{"Repetition":{"atom":100,"min":0,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[94,101]}},{"Named":{"name":"part","atom":102}},{"Sequence":{"atoms":[92,103]}},{"Entity":{"atom":111}},{"Entity":{"atom":4}},{"Named":{"name":"dash","atom":106}},{"Entity":{"atom":22}},{"Repetition":{"atom":108,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"subpart","atom":109}},{"Sequence":{"atoms":[107,110]}},{"Entity":{"atom":142}},{"Entity":{"atom":135}},{"Entity":{"atom":4}},{"Named":{"name":"dash","atom":114}},{"Str":{"pattern":"GUM"}},{"Entity":{"atom":7}},{"Entity":{"atom":22}},{"Repetition":{"atom":118,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[116,117,119]}},{"Entity":{"atom":124}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Re":{"pattern":"[\\x61-\\x7a]"}},{"Alternative":{"atoms":[122,123]}},{"Repetition":{"atom":121,"min":1,"max":null,"tag":"Repetition"}},{"Str":{"pattern":"_"}},{"Repetition":{"atom":126,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":22}},{"Repetition":{"atom":128,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[127,129]}},{"Repetition":{"atom":130,"min":0,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[125,131]}},{"Alternative":{"atoms":[120,132]}},{"Named":{"name":"code_suffix","atom":133}},{"Sequence":{"atoms":[115,134]}},{"Entity":{"atom":141}},{"Entity":{"atom":7}},{"Named":{"name":"space_suffix","atom":137}},{"Str":{"pattern":"Brochure"}},{"Named":{"name":"code_suffix","atom":139}},{"Sequence":{"atoms":[138,140]}},{"Alternative":{"atoms":[113,136]}},{"Repetition":{"atom":112,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[86,90,105,143]}},{"Entity":{"atom":89}},{"Entity":{"atom":104}},{"Entity":{"atom":142}},{"Repetition":{"atom":147,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[145,146,148]}},{"Entity":{"atom":89}},{"Entity":{"atom":142}},{"Repetition":{"atom":151,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[150,152]}},{"Alternative":{"atoms":[144,149,153]}},{"Entity":{"atom":224}},{"Entity":{"atom":194}},{"Str":{"pattern":", "}},{"Entity":{"atom":7}},{"Alternative":{"atoms":[157,158]}},{"Entity":{"atom":176}},{"Str":{"pattern":"6th"}},{"Str":{"pattern":"5th"}},{"Str":{"pattern":"4th"}},{"Str":{"pattern":"3rd"}},{"Str":{"pattern":"2nd"}},{"Str":{"pattern":"1st"}},{"Entity":{"atom":22}},{"Repetition":{"atom":167,"min":1,"max":null,"tag":"Repetition"}},{"Str":{"pattern":"th"}},{"Str":{"pattern":"nd"}},{"Str":{"pattern":"rd"}},{"Str":{"pattern":"st"}},{"Alternative":{"atoms":[169,170,171,172]}},{"Sequence":{"atoms":[168,173]}},{"Alternative":{"atoms":[161,162,163,164,165,166,174]}},{"Named":{"name":"edition","atom":175}},{"Repetition":{"atom":160,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":7}},{"Repetition":{"atom":178,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":183}},{"Str":{"pattern":"Edition"}},{"Str":{"pattern":"edition"}},{"Alternative":{"atoms":[181,182]}},{"Named":{"name":"edition_format","atom":180}},{"Entity":{"atom":7}},{"Repetition":{"atom":185,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":54}},{"Entity":{"atom":22}},{"Repetition":{"atom":188,"min":2,"max":null,"tag":"Repetition"}},{"Entity":{"atom":22}},{"Lookahead":{"atom":190,"positive":false}},{"Sequence":{"atoms":[187,189,191]}},{"Named":{"name":"year","atom":192}},{"Sequence":{"atoms":[159,177,179,184,186,193]}},{"Entity":{"atom":7}},{"Repetition":{"atom":195,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":198}},{"Str":{"pattern":":"}},{"Named":{"name":"colon","atom":197}},{"Entity":{"atom":7}},{"Repetition":{"atom":200,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":54}},{"Entity":{"atom":22}},{"Repetition":{"atom":203,"min":2,"max":null,"tag":"Repetition"}},{"Entity":{"atom":22}},{"Lookahead":{"atom":205,"positive":false}},{"Sequence":{"atoms":[202,204,206]}},{"Named":{"name":"year","atom":207}},{"Sequence":{"atoms":[196,199,201,208]}},{"Entity":{"atom":7}},{"Repetition":{"atom":210,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":33}},{"Named":{"name":"lparen","atom":212}},{"Entity":{"atom":54}},{"Entity":{"atom":22}},{"Repetition":{"atom":215,"min":2,"max":null,"tag":"Repetition"}},{"Entity":{"atom":22}},{"Lookahead":{"atom":217,"positive":false}},{"Sequence":{"atoms":[214,216,218]}},{"Named":{"name":"year","atom":219}},{"Entity":{"atom":41}},{"Named":{"name":"rparen","atom":221}},{"Sequence":{"atoms":[211,213,220,222]}},{"Alternative":{"atoms":[156,209,223]}},{"Repetition":{"atom":155,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":246}},{"Entity":{"atom":7}},{"Entity":{"atom":239}},{"Entity":{"atom":22}},{"Repetition":{"atom":229,"min":1,"max":null,"tag":"Repetition"}},{"Entity":{"atom":232}},{"Str":{"pattern":"."}},{"Entity":{"atom":22}},{"Repetition":{"atom":233,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[230,231,234]}},{"Entity":{"atom":22}},{"Repetition":{"atom":236,"min":1,"max":null,"tag":"Repetition"}},{"Alternative":{"atoms":[235,237]}},{"Named":{"name":"iteration","atom":238}},{"Repetition":{"atom":228,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":245}},{"Str":{"pattern":"WD"}},{"Str":{"pattern":"CD"}},{"Alternative":{"atoms":[242,243]}},{"Named":{"name":"stage","atom":244}},{"Sequence":{"atoms":[227,240,241]}},{"Repetition":{"atom":226,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[67,72,85,225,247]}},{"Named":{"name":"base","atom":66}},{"Entity":{"atom":298}},{"Entity":{"atom":290}},{"Entity":{"atom":7}},{"Named":{"name":"space_before_lang","atom":252}},{"Entity":{"atom":33}},{"Named":{"name":"lparen","atom":254}},{"Entity":{"atom":287}},{"Entity":{"atom":267}},{"Re":{"pattern":"[E]"}},{"Re":{"pattern":"[F]"}},{"Re":{"pattern":"[R]"}},{"Re":{"pattern":"[X]"}},{"Re":{"pattern":"[D]"}},{"Re":{"pattern":"[S]"}},{"Re":{"pattern":"[C]"}},{"Re":{"pattern":"[A]"}},{"Re":{"pattern":"[U]"}},{"Alternative":{"atoms":[258,259,260,261,262,263,264,265,266]}},{"Entity":{"atom":96}},{"Entity":{"atom":267}},{"Sequence":{"atoms":[257,268,269]}},{"Entity":{"atom":276}},{"Str":{"pattern":"PO"}},{"Str":{"pattern":"PT"}},{"Str":{"pattern":"PE"}},{"Str":{"pattern":"SR"}},{"Alternative":{"atoms":[272,273,274,275]}},{"Entity":{"atom":278}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Entity":{"atom":280}},{"Re":{"pattern":"[\\x61-\\x7a]"}},{"Repetition":{"atom":279,"min":2,"max":2,"tag":"Repetition"}},{"Sequence":{"atoms":[277,281]}},{"Entity":{"atom":267}},{"Entity":{"atom":280}},{"Repetition":{"atom":284,"min":2,"max":2,"tag":"Repetition"}},{"Alternative":{"atoms":[270,271,282,283,285]}},{"Named":{"name":"language","atom":286}},{"Entity":{"atom":41}},{"Named":{"name":"rparen","atom":288}},{"Sequence":{"atoms":[253,255,256,289]}},{"Entity":{"atom":297}},{"Entity":{"atom":33}},{"Named":{"name":"lparen","atom":292}},{"Entity":{"atom":287}},{"Entity":{"atom":41}},{"Named":{"name":"rparen","atom":295}},{"Sequence":{"atoms":[293,294,296]}},{"Alternative":{"atoms":[251,291]}},{"Repetition":{"atom":250,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[47,48,50,60,62,63,64,65,249,299]}},{"Entity":{"atom":337}},{"Entity":{"atom":71}},{"Entity":{"atom":84}},{"Entity":{"atom":154}},{"Named":{"name":"base_code","atom":304}},{"Entity":{"atom":7}},{"Str":{"pattern":"Amendment"}},{"Named":{"name":"amd_marker","atom":307}},{"Entity":{"atom":7}},{"Entity":{"atom":183}},{"Named":{"name":"supplement_edition_format","atom":310}},{"Entity":{"atom":7}},{"Repetition":{"atom":312,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":54}},{"Entity":{"atom":22}},{"Repetition":{"atom":315,"min":2,"max":null,"tag":"Repetition"}},{"Entity":{"atom":22}},{"Lookahead":{"atom":317,"positive":false}},{"Sequence":{"atoms":[314,316,318]}},{"Named":{"name":"supplement_year","atom":319}},{"Sequence":{"atoms":[309,311,313,320]}},{"Entity":{"atom":198}},{"Named":{"name":"colon","atom":322}},{"Entity":{"atom":7}},{"Repetition":{"atom":324,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":54}},{"Entity":{"atom":22}},{"Repetition":{"atom":327,"min":2,"max":null,"tag":"Repetition"}},{"Entity":{"atom":22}},{"Lookahead":{"atom":329,"positive":false}},{"Sequence":{"atoms":[326,328,330]}},{"Named":{"name":"supplement_year","atom":331}},{"Sequence":{"atoms":[323,325,332]}},{"Alternative":{"atoms":[321,333]}},{"Entity":{"atom":298}},{"Repetition":{"atom":335,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[302,303,305,306,308,334,336]}},{"Entity":{"atom":378}},{"Entity":{"atom":248}},{"Named":{"name":"base","atom":339}},{"Entity":{"atom":7}},{"Str":{"pattern":"Annex"}},{"Entity":{"atom":7}},{"Entity":{"atom":351}},{"Entity":{"atom":278}},{"Entity":{"atom":4}},{"Entity":{"atom":278}},{"Sequence":{"atoms":[346,347]}},{"Repetition":{"atom":348,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[345,349]}},{"Named":{"name":"annex_letter","atom":350}},{"Entity":{"atom":7}},{"Entity":{"atom":183}},{"Named":{"name":"edition_text","atom":353}},{"Entity":{"atom":7}},{"Entity":{"atom":54}},{"Entity":{"atom":22}},{"Repetition":{"atom":357,"min":2,"max":null,"tag":"Repetition"}},{"Entity":{"atom":22}},{"Lookahead":{"atom":359,"positive":false}},{"Sequence":{"atoms":[356,358,360]}},{"Named":{"name":"supplement_year","atom":361}},{"Sequence":{"atoms":[352,354,355,362]}},{"Entity":{"atom":198}},{"Named":{"name":"colon","atom":364}},{"Entity":{"atom":54}},{"Entity":{"atom":22}},{"Repetition":{"atom":367,"min":2,"max":null,"tag":"Repetition"}},{"Entity":{"atom":22}},{"Lookahead":{"atom":369,"positive":false}},{"Sequence":{"atoms":[366,368,370]}},{"Named":{"name":"supplement_year","atom":371}},{"Sequence":{"atoms":[365,372]}},{"Alternative":{"atoms":[363,373]}},{"Repetition":{"atom":374,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":298}},{"Repetition":{"atom":376,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[340,341,342,343,344,375,377]}},{"Entity":{"atom":411}},{"Entity":{"atom":248}},{"Named":{"name":"base","atom":380}},{"Entity":{"atom":7}},{"Str":{"pattern":"Annexes"}},{"Named":{"name":"annex_marker","atom":383}},{"Entity":{"atom":7}},{"Entity":{"atom":183}},{"Named":{"name":"supplement_edition_format","atom":386}},{"Entity":{"atom":7}},{"Entity":{"atom":54}},{"Entity":{"atom":22}},{"Repetition":{"atom":390,"min":2,"max":null,"tag":"Repetition"}},{"Entity":{"atom":22}},{"Lookahead":{"atom":392,"positive":false}},{"Sequence":{"atoms":[389,391,393]}},{"Named":{"name":"supplement_year","atom":394}},{"Sequence":{"atoms":[385,387,388,395]}},{"Entity":{"atom":198}},{"Named":{"name":"colon","atom":397}},{"Entity":{"atom":54}},{"Entity":{"atom":22}},{"Repetition":{"atom":400,"min":2,"max":null,"tag":"Repetition"}},{"Entity":{"atom":22}},{"Lookahead":{"atom":402,"positive":false}},{"Sequence":{"atoms":[399,401,403]}},{"Named":{"name":"supplement_year","atom":404}},{"Sequence":{"atoms":[398,405]}},{"Alternative":{"atoms":[396,406]}},{"Repetition":{"atom":407,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":298}},{"Repetition":{"atom":409,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[381,382,384,408,410]}},{"Entity":{"atom":435}},{"Entity":{"atom":248}},{"Named":{"name":"base","atom":413}},{"Entity":{"atom":416}},{"Str":{"pattern":"+"}},{"Named":{"name":"plus","atom":415}},{"Str":{"pattern":"Amendment"}},{"Str":{"pattern":"Errata"}},{"Alternative":{"atoms":[418,419]}},{"Named":{"name":"plus_marker","atom":420}},{"Entity":{"atom":198}},{"Named":{"name":"colon","atom":422}},{"Entity":{"atom":54}},{"Entity":{"atom":22}},{"Repetition":{"atom":425,"min":2,"max":null,"tag":"Repetition"}},{"Entity":{"atom":22}},{"Lookahead":{"atom":427,"positive":false}},{"Sequence":{"atoms":[424,426,428]}},{"Named":{"name":"supplement_year","atom":429}},{"Sequence":{"atoms":[423,430]}},{"Repetition":{"atom":431,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":298}},{"Repetition":{"atom":433,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[414,417,421,432,434]}},{"Entity":{"atom":452}},{"Entity":{"atom":248}},{"Named":{"name":"base","atom":437}},{"Entity":{"atom":7}},{"Str":{"pattern":"Amendment"}},{"Str":{"pattern":"Errata"}},{"Alternative":{"atoms":[440,441]}},{"Named":{"name":"trailing_marker","atom":442}},{"Entity":{"atom":7}},{"Entity":{"atom":22}},{"Repetition":{"atom":445,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"supplement_number","atom":446}},{"Sequence":{"atoms":[444,447]}},{"Repetition":{"atom":448,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":298}},{"Repetition":{"atom":450,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[438,439,443,449,451]}},{"Entity":{"atom":512}},{"Str":{"pattern":"OIML"}},{"Named":{"name":"publisher","atom":454}},{"Entity":{"atom":7}},{"Str":{"pattern":"Bulletin"}},{"Named":{"name":"type","atom":457}},{"Entity":{"atom":483}},{"Entity":{"atom":7}},{"Entity":{"atom":471}},{"Re":{"pattern":"[I]"}},{"Re":{"pattern":"[V]"}},{"Re":{"pattern":"[X]"}},{"Re":{"pattern":"[L]"}},{"Re":{"pattern":"[C]"}},{"Re":{"pattern":"[D]"}},{"Re":{"pattern":"[M]"}},{"Alternative":{"atoms":[462,463,464,465,466,467,468]}},{"Repetition":{"atom":469,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"volume_roman","atom":470}},{"Entity":{"atom":33}},{"Named":{"name":"lparen","atom":472}},{"Entity":{"atom":22}},{"Repetition":{"atom":474,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"issue_arabic","atom":475}},{"Entity":{"atom":41}},{"Named":{"name":"rparen","atom":477}},{"Entity":{"atom":7}},{"Entity":{"atom":22}},{"Repetition":{"atom":480,"min":8,"max":null,"tag":"Repetition"}},{"Named":{"name":"article_id","atom":481}},{"Sequence":{"atoms":[460,461,473,476,478,479,482]}},{"Entity":{"atom":507}},{"Entity":{"atom":7}},{"Entity":{"atom":54}},{"Entity":{"atom":22}},{"Repetition":{"atom":487,"min":2,"max":null,"tag":"Repetition"}},{"Entity":{"atom":22}},{"Lookahead":{"atom":489,"positive":false}},{"Sequence":{"atoms":[486,488,490]}},{"Named":{"name":"doc_year","atom":491}},{"Entity":{"atom":4}},{"Named":{"name":"dash","atom":493}},{"Entity":{"atom":22}},{"Repetition":{"atom":495,"min":2,"max":null,"tag":"Repetition"}},{"Named":{"name":"issue","atom":496}},{"Sequence":{"atoms":[494,497]}},{"Repetition":{"atom":498,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":4}},{"Named":{"name":"dash","atom":500}},{"Entity":{"atom":22}},{"Repetition":{"atom":502,"min":2,"max":null,"tag":"Repetition"}},{"Named":{"name":"sequence","atom":503}},{"Sequence":{"atoms":[501,504]}},{"Repetition":{"atom":505,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[485,492,499,506]}},{"Alternative":{"atoms":[459,484]}},{"Repetition":{"atom":508,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":298}},{"Repetition":{"atom":510,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[455,456,458,509,511]}},{"Entity":{"atom":591}},{"Entity":{"atom":71}},{"Entity":{"atom":84}},{"Entity":{"atom":535}},{"Entity":{"atom":520}},{"Entity":{"atom":22}},{"Repetition":{"atom":518,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"doc_number","atom":519}},{"Entity":{"atom":104}},{"Entity":{"atom":111}},{"Entity":{"atom":142}},{"Repetition":{"atom":523,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[517,521,522,524]}},{"Entity":{"atom":520}},{"Entity":{"atom":104}},{"Entity":{"atom":142}},{"Repetition":{"atom":528,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[526,527,529]}},{"Entity":{"atom":520}},{"Entity":{"atom":142}},{"Repetition":{"atom":532,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[531,533]}},{"Alternative":{"atoms":[525,530,534]}},{"Entity":{"atom":585}},{"Entity":{"atom":556}},{"Str":{"pattern":", "}},{"Entity":{"atom":7}},{"Alternative":{"atoms":[538,539]}},{"Entity":{"atom":176}},{"Repetition":{"atom":541,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":7}},{"Repetition":{"atom":543,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":183}},{"Named":{"name":"doc_edition_format","atom":545}},{"Entity":{"atom":7}},{"Repetition":{"atom":547,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":54}},{"Entity":{"atom":22}},{"Repetition":{"atom":550,"min":2,"max":null,"tag":"Repetition"}},{"Entity":{"atom":22}},{"Lookahead":{"atom":552,"positive":false}},{"Sequence":{"atoms":[549,551,553]}},{"Named":{"name":"doc_year","atom":554}},{"Sequence":{"atoms":[540,542,544,546,548,555]}},{"Entity":{"atom":7}},{"Repetition":{"atom":557,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":198}},{"Named":{"name":"colon","atom":559}},{"Entity":{"atom":7}},{"Repetition":{"atom":561,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":54}},{"Entity":{"atom":22}},{"Repetition":{"atom":564,"min":2,"max":null,"tag":"Repetition"}},{"Entity":{"atom":22}},{"Lookahead":{"atom":566,"positive":false}},{"Sequence":{"atoms":[563,565,567]}},{"Named":{"name":"doc_year","atom":568}},{"Sequence":{"atoms":[558,560,562,569]}},{"Entity":{"atom":7}},{"Repetition":{"atom":571,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":33}},{"Named":{"name":"lparen","atom":573}},{"Entity":{"atom":54}},{"Entity":{"atom":22}},{"Repetition":{"atom":576,"min":2,"max":null,"tag":"Repetition"}},{"Entity":{"atom":22}},{"Lookahead":{"atom":578,"positive":false}},{"Sequence":{"atoms":[575,577,579]}},{"Named":{"name":"doc_year","atom":580}},{"Entity":{"atom":41}},{"Named":{"name":"rparen","atom":582}},{"Sequence":{"atoms":[572,574,581,583]}},{"Alternative":{"atoms":[537,570,584]}},{"Repetition":{"atom":536,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":246}},{"Repetition":{"atom":587,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":298}},{"Repetition":{"atom":589,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[514,515,516,586,588,590]}},{"Alternative":{"atoms":[0,46,301,338,379,412,436,453,513]}}],"root":592},"bindings":[{"capture":"base","path":"base","type":"raw","card":null,"preprocess":null},{"capture":"base_code","path":"base_code","type":"raw","card":null,"preprocess":null},{"capture":"doc_number","path":"number","type":"string","card":null,"preprocess":null},{"capture":"supplement_number","path":"number","type":"string","card":null,"preprocess":null},{"capture":"part","path":"part","type":"string","card":null,"preprocess":null},{"capture":"subpart","path":"subpart","type":"string","card":null,"preprocess":null},{"capture":"code_suffix","path":"code_suffix","type":"string","card":null,"preprocess":null},{"capture":"space_suffix","path":"space_suffix","type":"string","card":null,"preprocess":null},{"capture":"publisher","path":"publisher","type":"string","card":null,"preprocess":null},{"capture":"type","path":"type","type":"string","card":null,"preprocess":null},{"capture":"doc_year","path":"year","type":"string","card":null,"preprocess":null},{"capture":"supplement_year","path":"year","type":"string","card":null,"preprocess":null},{"capture":"issue","path":"issue","type":"string","card":null,"preprocess":null},{"capture":"sequence","path":"sequence","type":"string","card":null,"preprocess":null},{"capture":"volume_roman","path":"volume_roman","type":"string","card":null,"preprocess":null},{"capture":"issue_arabic","path":"issue_arabic","type":"string","card":null,"preprocess":null},{"capture":"article_id","path":"article_id","type":"string","card":null,"preprocess":null},{"capture":"language","path":"language","type":"string","card":null,"preprocess":null},{"capture":"space_before_lang","path":"space_before_lang","type":"string","card":null,"preprocess":null},{"capture":"edition","path":"edition","type":"string","card":null,"preprocess":null},{"capture":"iteration","path":"iteration","type":"string","card":null,"preprocess":null},{"capture":"stage","path":"stage","type":"string","card":null,"preprocess":null},{"capture":"amd_marker","path":"amd_marker","type":"string","card":null,"preprocess":null},{"capture":"doc_edition_format","path":"edition_format","type":"string","card":null,"preprocess":null},{"capture":"supplement_edition_format","path":"edition_format","type":"string","card":null,"preprocess":null},{"capture":"trailing_marker","path":"trailing_marker","type":"string","card":null,"preprocess":null},{"capture":"plus_marker","path":"plus_marker","type":"string","card":null,"preprocess":null},{"capture":"annex_marker","path":"annex_marker","type":"string","card":null,"preprocess":null},{"capture":"annex_letter","path":"annex_letter","type":"string","card":null,"preprocess":null},{"capture":"cs_series","path":"cs_series","type":"string","card":null,"preprocess":null},{"capture":"cs_family","path":"cs_family","type":"string","card":null,"preprocess":null},{"capture":"cs_separator","path":"cs_separator","type":"string","card":null,"preprocess":null},{"capture":"cs_amendment","path":"cs_amendment","type":"string","card":null,"preprocess":null}]}},"preprocess":{},"tables":{},"lint":{"order_warnings":["rule roman_numeral: branches 1 and 2 are order-dependent (shared first bytes; ordered choice is decisive)","rule full_number: branches 1 and 2 are order-dependent (shared first bytes; ordered choice is decisive)","rule full_number: branches 1 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule full_number: branches 2 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule full_number_plain: branches 1 and 2 are order-dependent (shared first bytes; ordered choice is decisive)","rule full_number_plain: branches 1 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule full_number_plain: branches 2 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule date: branches 1 and 2 are order-dependent (shared first bytes; ordered choice is decisive)","rule date: branches 1 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule date: branches 2 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule date_plain: branches 1 and 2 are order-dependent (shared first bytes; ordered choice is decisive)","rule date_plain: branches 1 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule date_plain: branches 2 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule lang_multi_oiml: branches 1 and 2 are order-dependent (shared first bytes; ordered choice is decisive)","rule lang_multi_oiml: branches 1 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule lang_multi_oiml: branches 2 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 1 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 1 and 4 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 1 and 5 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 1 and 6 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 1 and 7 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 1 and 8 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 1 and 9 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 3 and 4 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 3 and 5 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 3 and 6 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 3 and 7 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 3 and 8 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 3 and 9 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 4 and 5 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 4 and 6 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 4 and 7 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 4 and 8 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 4 and 9 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 5 and 6 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 5 and 7 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 5 and 8 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 5 and 9 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 6 and 7 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 6 and 8 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 6 and 9 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 7 and 8 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 7 and 9 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 8 and 9 are order-dependent (shared first bytes; ordered choice is decisive)"]},"default_entry":"identifier","render":{},"derive":{},"tests":[{"entry":"identifier","kind":"accept","input":"OIML V 2 Edition 2007","expect":{}},{"entry":"identifier","kind":"accept","input":"OIML R 137-1:2012","expect":{}},{"entry":"identifier","kind":"accept","input":"OIML D 11","expect":{}},{"entry":"identifier","kind":"accept","input":"OIML D 11 Brochure","expect":{}},{"entry":"identifier","kind":"accept","input":"OIML R 126:2015 Errata (E)","expect":{}},{"entry":"identifier","kind":"accept","input":"OIML B 20 Annexes","expect":{}},{"entry":"identifier","kind":"accept","input":"OIML V 2 (E)","expect":{}},{"entry":"identifier","kind":"accept","input":"OIML-CS PD-05 Edition 6 (Amendment 1)","expect":{}},{"entry":"identifier","kind":"accept","input":"OIML R 138:2009 Amendment 1","expect":{}},{"entry":"identifier","kind":"reject","input":"nonsense","expect":{}}],"docs":{},"source":"# Port of lib/pubid/oiml/parser.rb — OIML identifiers: the base form,\n# drafts, amendments (full/short/+/trailing), annexes, bulletins.\n#\n# Edition-2 conversion. The builder dispatches on the supplement\n# wrappers (parsed_hash[:base] -> build_supplement recursing into the\n# nested hash; parsed_hash[:base_code] on the short amendment), so both\n# keep their v1 shape and bind uncast with (raw). Because the flat\n# binding layer is global by capture name, the base's number (nested\n# key :number, read by the recursive build) is a different capture from\n# the two spellings the TOP-LEVEL :number must carry: the plain\n# document's number (doc_number) and the trailing supplement's own\n# ordinal (supplement_number) — both bind to the output key :number,\n# and the branches are disjoint so they never collide. Zero-width\n# markers: (\"\" as space_suffix) is re-spelled as a real-token capture\n# of the space it flagged (`space as space_suffix` — the key stays\n# present exactly when the \"Brochure\" suffix matched, so the builder's\n# .key? check and the space-separated rendering are unchanged);\n# (\"\" as space_before_lang) likewise becomes `space as space_before_lang`.\n# The composite edition_format wrapper becomes a real-token capture of\n# the \"Edition\"/\"edition\" word (truthiness and the long-format flag are\n# preserved; the builder re-reads year/edition flat). Pure-raw rule\n# bodies are inlined at capture sites (digits, alnum, lang_multi,\n# year_digits) so every capture binds one span.\n\ngrammar PubidOiml version \"0.1.0\" edition 2 {\n # The monorepo's doc_type is [BDEGRSV] — X is deliberately absent\n # (\"OIML X 99\" must be rejected).\n letter_bdegrsvx = %x42 / %x44 / %x45 / %x47 / %x52 / %x53 / %x56\n digit = %x30-39\n letter = %x41-5A / %x61-7A\n upper = %x41-5A\n lower = %x61-7A\n space = \" \"\n dash = \"-\"\n colon = \":\"\n slash = \"/\"\n lparen = \"(\"\n rparen = \")\"\n dot = \".\"\n plus = \"+\"\n century = \"19\" / \"20\"\n year_digits = century 2*digit !digit\n\n publisher = \"OIML\" as publisher space\n doc_type = letter_bdegrsvx as type space\n\n bulletin_date = {\n space\n (century 2*digit !digit) as doc_year\n [(dash (2*digit) as issue)]\n [(dash (2*digit) as sequence)]\n }\n roman_numeral = 1*%x49 / 1*(%x49 / %x56 / %x58 / %x4C / %x43 / %x44 / %x4D)\n roman = (1*(%x49 / %x56 / %x58 / %x4C / %x43 / %x44 / %x4D)) as volume_roman\n bulletin_citation = {\n space\n roman\n lparen\n ((1*digit)) as issue_arabic\n rparen\n space\n ((8*digit)) as article_id\n }\n bulletin_identifier = {\n \"OIML\" as publisher\n space\n \"Bulletin\" as type\n [bulletin_citation / bulletin_date]\n [language_portion]\n }\n\n number_only = ((1*digit)) as number\n part_number = dash (((1*digit) *((slash dash (1*digit)))) as part)\n subpart_number = dash ((1*digit)) as subpart\n named_suffix_gum = dash (\"GUM\" space (1*digit) / ((1*letter) *(([\"_\"] (1*digit))))) as code_suffix\n named_suffix_brochure = (space) as space_suffix \"Brochure\" as code_suffix\n named_suffix = named_suffix_gum / named_suffix_brochure\n full_number = {\n (\n ((number_only) part_number subpart_number [named_suffix])\n / ((number_only) part_number [named_suffix])\n / ((number_only) [named_suffix])\n )\n }\n doc_number_only = ((1*digit)) as doc_number\n full_number_plain = {\n (\n ((doc_number_only) part_number subpart_number [named_suffix])\n / ((doc_number_only) part_number [named_suffix])\n / ((doc_number_only) [named_suffix])\n )\n }\n\n edition_number = {\n (\n \"6th\"\n / \"5th\"\n / \"4th\"\n / \"3rd\"\n / \"2nd\"\n / \"1st\"\n / ((1*digit) (\"th\" / \"nd\" / \"rd\" / \"st\"))\n ) as edition\n }\n edition_text = \"Edition\" / \"edition\"\n edition_portion = {\n (\n (\", \" / space)\n [(edition_number)]\n [space]\n (edition_text) as edition_format\n [space]\n (century 2*digit !digit) as year\n )\n }\n date = {\n edition_portion\n / ([space] colon [space] (century 2*digit !digit) as year)\n / ([space] lparen (century 2*digit !digit) as year rparen)\n }\n edition_portion_plain = {\n (\n (\", \" / space)\n [(edition_number)]\n [space]\n (edition_text) as doc_edition_format\n [space]\n (century 2*digit !digit) as doc_year\n )\n }\n date_plain = {\n edition_portion_plain\n / ([space] colon [space] (century 2*digit !digit) as doc_year)\n / ([space] lparen (century 2*digit !digit) as doc_year rparen)\n }\n stage_iteration = ((((1*digit) dot (1*digit))) / (1*digit)) as iteration\n stage_abbr = (\"WD\" / \"CD\") as stage\n draft_stage = space [stage_iteration] stage_abbr\n\n lang_single = %x45 / %x46 / %x52 / %x58 / %x44 / %x53 / %x43 / %x41 / %x55\n lang_multi_oiml = \"PO\" / \"PT\" / \"PE\" / \"SR\"\n language_code = {\n (\n (\n ((lang_single) slash (lang_single))\n / lang_multi_oiml\n / ((upper) 2*2lower)\n / (lang_single)\n / (2*2lower)\n ) as language\n )\n }\n language_with_space = (space) as space_before_lang lparen language_code rparen\n language_without_space = lparen language_code rparen\n language_portion = language_with_space / language_without_space\n\n amendment_identifier = {\n \"Amendment\"\n space\n lparen\n (century 2*digit !digit) as supplement_year\n rparen\n space\n \"to\"\n space\n ((base_without_language)) as base\n [language_portion]\n }\n amendment_short = {\n publisher\n doc_type\n ((full_number)) as base_code\n space\n \"Amendment\" as amd_marker\n (\n (\n (\n space (edition_text) as supplement_edition_format\n [space]\n (century 2*digit !digit) as supplement_year\n )\n )\n / (colon [space] (century 2*digit !digit) as supplement_year)\n )\n [language_portion]\n }\n trailing_supplement_identifier = {\n ((base_without_language)) as base\n space\n (\"Amendment\" / \"Errata\") as trailing_marker\n [space ((1*digit)) as supplement_number]\n [language_portion]\n }\n plus_supplement_identifier = {\n ((base_without_language)) as base\n plus\n (\"Amendment\" / \"Errata\") as plus_marker\n [(colon (century 2*digit !digit) as supplement_year)]\n [language_portion]\n }\n annex_identifier = {\n ((base_without_language)) as base\n space\n \"Annexes\" as annex_marker\n [\n (\n (\n (\n space (edition_text) as supplement_edition_format\n space\n (century 2*digit !digit) as supplement_year\n )\n )\n / (colon (century 2*digit !digit) as supplement_year)\n )\n ]\n [language_portion]\n }\n annex_letter_value = (((upper) [(dash upper)])) as annex_letter\n annex_letter_identifier = {\n ((base_without_language)) as base\n space\n \"Annex\"\n space\n annex_letter_value\n [\n (\n (\n (\n space\n edition_text\n space\n (century 2*digit !digit) as supplement_year\n )\n )\n / (colon (century 2*digit !digit) as supplement_year)\n )\n ]\n [language_portion]\n }\n base_without_language = publisher doc_type full_number [date] [draft_stage]\n base = publisher doc_type full_number_plain [date_plain] [draft_stage] [language_portion]\n\n cs_identifier = {\n (\n \"OIML\" as publisher\n (dash / space)\n \"CS\" as cs_series\n space\n (\"PD\" / \"OD\" / \"CID\") as cs_family\n (dash / space) as cs_separator\n ((1*digit)) as doc_number\n space\n \"Edition\"\n space\n ((1*digit)) as edition\n [(space lparen \"Amendment\" space ((1*digit)) as cs_amendment rparen)]\n )\n }\n identifier = {\n cs_identifier\n / amendment_identifier\n / amendment_short\n / annex_letter_identifier\n / annex_identifier\n / plus_supplement_identifier\n / trailing_supplement_identifier\n / bulletin_identifier\n / base\n }\n\n entry identifier: identifier\n\n bindings identifier {\n base -> base (raw)\n base_code -> base_code (raw)\n doc_number -> number (string)\n supplement_number -> number (string)\n part -> part (string)\n subpart -> subpart (string)\n code_suffix -> code_suffix (string)\n space_suffix -> space_suffix (string)\n publisher -> publisher (string)\n type -> type (string)\n doc_year -> year (string)\n supplement_year -> year (string)\n issue -> issue (string)\n sequence -> sequence (string)\n volume_roman -> volume_roman (string)\n issue_arabic -> issue_arabic (string)\n article_id -> article_id (string)\n language -> language (string)\n space_before_lang -> space_before_lang (string)\n edition -> edition (string)\n iteration -> iteration (string)\n stage -> stage (string)\n amd_marker -> amd_marker (string)\n doc_edition_format -> edition_format (string)\n supplement_edition_format -> edition_format (string)\n trailing_marker -> trailing_marker (string)\n plus_marker -> plus_marker (string)\n annex_marker -> annex_marker (string)\n annex_letter -> annex_letter (string)\n cs_series -> cs_series (string)\n cs_family -> cs_family (string)\n cs_separator -> cs_separator (string)\n cs_amendment -> cs_amendment (string)\n }\n\n test {\n accept \"OIML V 2 Edition 2007\"\n accept \"OIML R 137-1:2012\"\n accept \"OIML D 11\"\n accept \"OIML D 11 Brochure\"\n accept \"OIML R 126:2015 Errata (E)\"\n accept \"OIML B 20 Annexes\"\n accept \"OIML V 2 (E)\"\n accept \"OIML-CS PD-05 Edition 6 (Amendment 1)\"\n accept \"OIML R 138:2009 Amendment 1\"\n reject \"nonsense\"\n }\n}\n","source_hash":"f0e077831923b3f664d772c035f33738a1d4d564611947cdd9b0295f7583f6c4","unicode_tables":"onigmo (Ruby 3.4.8)","compiler_version":"1.3.114","edition":2,"checksum":"sha256:6e5fd037da22a72a0516d92730f37bda2c5ccede32403b1be3fac6416a21992b"}
data/data/parg/omg.json CHANGED
@@ -1 +1 @@
1
- {"bindings":null,"version":"0.1.0","grammar":"PubidOmg","shape":"parsanol-tree/v2","binding_version":1,"entries":{"identifier":{"root":"identifier","grammar":{"atoms":[{"Str":{"pattern":"OMG"}},{"Entity":{"atom":2}},{"Str":{"pattern":" "}},{"Entity":{"atom":24}},{"Entity":{"atom":7}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Re":{"pattern":"[\\x61-\\x7a]"}},{"Alternative":{"atoms":[5,6]}},{"Entity":{"atom":13}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Re":{"pattern":"[\\x61-\\x7a]"}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Re":{"pattern":"[+]"}},{"Alternative":{"atoms":[9,10,11,12]}},{"Repetition":{"atom":8,"min":1,"max":null,"tag":"Repetition"}},{"Entity":{"atom":18}},{"Re":{"pattern":"[\\-]"}},{"Re":{"pattern":"[/]"}},{"Alternative":{"atoms":[16,17]}},{"Entity":{"atom":13}},{"Repetition":{"atom":19,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[15,20]}},{"Repetition":{"atom":21,"min":0,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[4,14,22]}},{"Named":{"name":"acronym","atom":23}},{"Entity":{"atom":2}},{"Entity":{"atom":63}},{"Entity":{"atom":28}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":27,"min":1,"max":null,"tag":"Repetition"}},{"Entity":{"atom":31}},{"Str":{"pattern":"."}},{"Entity":{"atom":28}},{"Repetition":{"atom":32,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[30,33]}},{"Repetition":{"atom":34,"min":0,"max":null,"tag":"Repetition"}},{"Entity":{"atom":60}},{"Str":{"pattern":" beta"}},{"Entity":{"atom":42}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Re":{"pattern":"[\\x61-\\x7a]"}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Alternative":{"atoms":[39,40,41]}},{"Lookahead":{"atom":38,"positive":false}},{"Entity":{"atom":2}},{"Entity":{"atom":28}},{"Repetition":{"atom":45,"min":1,"max":null,"tag":"Repetition"}},{"Entity":{"atom":42}},{"Lookahead":{"atom":47,"positive":false}},{"Sequence":{"atoms":[44,46,48]}},{"Repetition":{"atom":49,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[37,43,50]}},{"Entity":{"atom":2}},{"Str":{"pattern":"Beta"}},{"Entity":{"atom":28}},{"Repetition":{"atom":54,"min":1,"max":null,"tag":"Repetition"}},{"Repetition":{"atom":55,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":42}},{"Lookahead":{"atom":57,"positive":false}},{"Sequence":{"atoms":[52,53,56,58]}},{"Alternative":{"atoms":[51,59]}},{"Repetition":{"atom":36,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[29,35,61]}},{"Named":{"name":"version","atom":62}},{"Entity":{"atom":68}},{"Entity":{"atom":2}},{"Entity":{"atom":67}},{"Str":{"pattern":"/"}},{"Alternative":{"atoms":[65,66]}},{"Entity":{"atom":72}},{"Entity":{"atom":42}},{"Repetition":{"atom":70,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"part","atom":71}},{"Sequence":{"atoms":[64,69]}},{"Repetition":{"atom":73,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[25,26,74]}},{"Entity":{"atom":2}},{"Entity":{"atom":72}},{"Sequence":{"atoms":[76,77]}},{"Alternative":{"atoms":[75,78]}},{"Repetition":{"atom":79,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[0,1,3,80]}}],"root":81},"bindings":[]}},"preprocess":{},"tables":{},"lint":{"order_warnings":["rule beta: branches 1 and 2 are order-dependent (shared first bytes; ordered choice is decisive)"]},"default_entry":"identifier","render":{},"derive":{},"tests":[{"entry":"identifier","kind":"accept","input":"OMG IDL 4.2","expect":{}},{"entry":"identifier","kind":"accept","input":"OMG UML 2.5.1","expect":{}},{"entry":"identifier","kind":"reject","input":"nonsense","expect":{}}],"docs":{},"source":"# Port of lib/pubid/omg/parser.rb: OMG <acronym>[ <version>[<sep><part>]]\n# with the beta-label word-boundary guards (a bare \"beta\" must not be\n# swallowed by the part rule). The GLUED CATALOGUE label (\"Beta1\" --\n# capitalized, the /spec/ALMAS/1.5/Beta1 URL segment) classifies into\n# the version (the 2026-10-19 pubid#548 ruling); the LOWERCASE glued\n# form (\"beta2\") stays a document part (the DDS ruling, spec-pinned). A\n# /spec/ALMAS/1.5/Beta1 URL segment) classifies into the version (the\n# 2026-10-19 pubid#548 ruling); a Beta-prefixed part without digits\n# (\"BetaWave\") still lexes as the part — the boundary guard keeps it.\n grammar PubidOmg version \"0.1.0\" mode \"v1\" {\n digit = %x30-39\n acronym_char = %x41-5A / %x61-7A / %x30-39 / %x2B\n acronym_join = %x2D / %x2F\n acronym = (letter 1*acronym_char *(acronym_join 1*acronym_char)) as acronym\n word_boundary = !alnum_char\n beta = (\" beta\" !alnum_char ([space 1*digit !alnum_char]) / (space \"Beta\" [1*digit] !alnum_char))\n version = (1*digit *(dot 1*digit) [beta]) as version\n part_separator = space / slash\n part = (1*alnum_char) as part\n identifier = \"OMG\" space acronym [((space version [part_separator part]) / (space part))]\n alnum_char = %x41-5A / %x61-7A / %x30-39\n letter = %x41-5A / %x61-7A\n dot = \".\"\n slash = \"/\"\n space = \" \"\n entry identifier: identifier\n\n test {\n accept \"OMG IDL 4.2\"\n accept \"OMG UML 2.5.1\"\n reject \"nonsense\"\n }\n}\n","source_hash":"5cc23a519874dd5f9ab101d3c988b25f575dc4830ff39a79a3bafe30eeeaa312","unicode_tables":"onigmo (Ruby 3.4.8)","compiler_version":"1.3.114","edition":1,"checksum":"sha256:f69346aeef1b332570a772748586b840b7be51ae7fedfaec0e523ddbec7ba0bb"}
1
+ {"bindings":null,"version":"0.1.0","grammar":"PubidOmg","shape":"parsanol-tree/v2","binding_version":1,"entries":{"identifier":{"root":"identifier","grammar":{"atoms":[{"Str":{"pattern":"OMG"}},{"Entity":{"atom":2}},{"Str":{"pattern":" "}},{"Entity":{"atom":24}},{"Entity":{"atom":7}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Re":{"pattern":"[\\x61-\\x7a]"}},{"Alternative":{"atoms":[5,6]}},{"Entity":{"atom":13}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Re":{"pattern":"[\\x61-\\x7a]"}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Re":{"pattern":"[+]"}},{"Alternative":{"atoms":[9,10,11,12]}},{"Repetition":{"atom":8,"min":1,"max":null,"tag":"Repetition"}},{"Entity":{"atom":18}},{"Re":{"pattern":"[\\-]"}},{"Re":{"pattern":"[/]"}},{"Alternative":{"atoms":[16,17]}},{"Entity":{"atom":13}},{"Repetition":{"atom":19,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[15,20]}},{"Repetition":{"atom":21,"min":0,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[4,14,22]}},{"Named":{"name":"acronym","atom":23}},{"Entity":{"atom":2}},{"Entity":{"atom":62}},{"Entity":{"atom":28}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":27,"min":1,"max":null,"tag":"Repetition"}},{"Entity":{"atom":31}},{"Str":{"pattern":"."}},{"Entity":{"atom":28}},{"Repetition":{"atom":32,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[30,33]}},{"Repetition":{"atom":34,"min":0,"max":null,"tag":"Repetition"}},{"Str":{"pattern":" beta"}},{"Entity":{"atom":41}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Re":{"pattern":"[\\x61-\\x7a]"}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Alternative":{"atoms":[38,39,40]}},{"Lookahead":{"atom":37,"positive":false}},{"Entity":{"atom":2}},{"Entity":{"atom":28}},{"Repetition":{"atom":44,"min":1,"max":null,"tag":"Repetition"}},{"Entity":{"atom":41}},{"Lookahead":{"atom":46,"positive":false}},{"Sequence":{"atoms":[43,45,47]}},{"Repetition":{"atom":48,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[36,42,49]}},{"Entity":{"atom":2}},{"Str":{"pattern":"Beta"}},{"Entity":{"atom":28}},{"Repetition":{"atom":53,"min":1,"max":null,"tag":"Repetition"}},{"Repetition":{"atom":54,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":41}},{"Lookahead":{"atom":56,"positive":false}},{"Sequence":{"atoms":[51,52,55,57]}},{"Alternative":{"atoms":[50,58]}},{"Repetition":{"atom":59,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[29,35,60]}},{"Named":{"name":"version","atom":61}},{"Entity":{"atom":68}},{"Entity":{"atom":2}},{"Entity":{"atom":66}},{"Str":{"pattern":"/"}},{"Named":{"name":"slash","atom":65}},{"Alternative":{"atoms":[64,67]}},{"Entity":{"atom":72}},{"Entity":{"atom":41}},{"Repetition":{"atom":70,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"part","atom":71}},{"Sequence":{"atoms":[63,69]}},{"Repetition":{"atom":73,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[25,26,74]}},{"Entity":{"atom":2}},{"Entity":{"atom":72}},{"Sequence":{"atoms":[76,77]}},{"Alternative":{"atoms":[75,78]}},{"Repetition":{"atom":79,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[0,1,3,80]}}],"root":81},"bindings":[{"capture":"acronym","path":"acronym","type":"string","card":null,"preprocess":null},{"capture":"version","path":"version","type":"string","card":null,"preprocess":null},{"capture":"part","path":"part","type":"string","card":null,"preprocess":null}]}},"preprocess":{},"tables":{},"lint":{"order_warnings":["rule beta: branches 1 and 2 are order-dependent (shared first bytes; ordered choice is decisive)"]},"default_entry":"identifier","render":{},"derive":{},"tests":[{"entry":"identifier","kind":"accept","input":"OMG IDL 4.2","expect":{}},{"entry":"identifier","kind":"accept","input":"OMG UML 2.5.1","expect":{}},{"entry":"identifier","kind":"reject","input":"nonsense","expect":{}}],"docs":{},"source":"# Port of lib/pubid/omg/parser.rb: OMG <acronym>[ <version>[<sep><part>]]\n# with the beta-label word-boundary guards (a bare \"beta\" must not be\n# swallowed by the part rule). The GLUED CATALOGUE label (\"Beta1\" --\n# capitalized, the /spec/ALMAS/1.5/Beta1 URL segment) classifies into\n# the version (the 2026-10-19 pubid#548 ruling); the LOWERCASE glued\n# form (\"beta2\") stays a document part (the DDS ruling, spec-pinned). A\n# /spec/ALMAS/1.5/Beta1 URL segment) classifies into the version (the\n# 2026-10-19 pubid#548 ruling); a Beta-prefixed part without digits\n# (\"BetaWave\") still lexes as the part — the boundary guard keeps it.\n grammar PubidOmg version \"0.1.0\" edition 2 {\n digit = %x30-39\n acronym_char = %x41-5A / %x61-7A / %x30-39 / %x2B\n acronym_join = %x2D / %x2F\n acronym = (letter 1*acronym_char *(acronym_join 1*acronym_char)) as acronym\n word_boundary = !alnum_char\n beta = (\" beta\" !alnum_char ([space 1*digit !alnum_char]) / (space \"Beta\" [1*digit] !alnum_char))\n version = (1*digit *(dot 1*digit) [(\" beta\" !alnum_char ([space 1*digit !alnum_char]) / (space \"Beta\" [1*digit] !alnum_char))]) as version\n part_separator = space / slash\n part = (1*alnum_char) as part\n identifier = \"OMG\" space acronym [((space version [part_separator part]) / (space part))]\n alnum_char = %x41-5A / %x61-7A / %x30-39\n letter = %x41-5A / %x61-7A\n dot = \".\"\n slash = \"/\"\n space = \" \"\n entry identifier: identifier\n\n bindings identifier {\n acronym -> acronym (string)\n version -> version (string)\n part -> part (string)\n }\n\n\n test {\n accept \"OMG IDL 4.2\"\n accept \"OMG UML 2.5.1\"\n reject \"nonsense\"\n }\n}\n","source_hash":"52d7a874221297d0f1ad18a19ef557046f62d2bed13cc27884080dbf5fb7fa97","unicode_tables":"onigmo (Ruby 3.4.8)","compiler_version":"1.3.114","edition":2,"checksum":"sha256:673170151ef924747d4c80514001b885ceaa6fa6c0e9476774326b54f329da9f"}
@@ -1 +1 @@
1
- {"bindings":null,"version":"0.1.0","grammar":"PubidPlateau","shape":"parsanol-tree/v2","binding_version":1,"entries":{"identifier":{"root":"identifier","grammar":{"atoms":[{"Entity":{"atom":73}},{"Entity":{"atom":52}},{"Str":{"pattern":"PLATEAU"}},{"Entity":{"atom":4}},{"Str":{"pattern":" "}},{"Entity":{"atom":9}},{"Str":{"pattern":"Handbook"}},{"Str":{"pattern":"Technical Report"}},{"Alternative":{"atoms":[6,7]}},{"Named":{"name":"type","atom":8}},{"Entity":{"atom":4}},{"Entity":{"atom":17}},{"Str":{"pattern":"#"}},{"Entity":{"atom":14}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":13,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"number","atom":15}},{"Sequence":{"atoms":[12,16]}},{"Entity":{"atom":26}},{"Entity":{"atom":20}},{"Str":{"pattern":"-"}},{"Str":{"pattern":"_"}},{"Alternative":{"atoms":[19,21]}},{"Entity":{"atom":14}},{"Repetition":{"atom":23,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"annex","atom":24}},{"Sequence":{"atoms":[22,25]}},{"Repetition":{"atom":18,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":50}},{"Entity":{"atom":4}},{"Entity":{"atom":40}},{"Str":{"pattern":"第"}},{"Entity":{"atom":14}},{"Repetition":{"atom":32,"min":1,"max":null,"tag":"Repetition"}},{"Str":{"pattern":"."}},{"Entity":{"atom":14}},{"Repetition":{"atom":35,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[33,34,36]}},{"Named":{"name":"edition","atom":37}},{"Str":{"pattern":"版"}},{"Sequence":{"atoms":[31,38,39]}},{"Entity":{"atom":48}},{"Entity":{"atom":14}},{"Repetition":{"atom":42,"min":1,"max":null,"tag":"Repetition"}},{"Str":{"pattern":"."}},{"Entity":{"atom":14}},{"Repetition":{"atom":45,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[43,44,46]}},{"Named":{"name":"edition","atom":47}},{"Alternative":{"atoms":[30,41]}},{"Sequence":{"atoms":[29,49]}},{"Repetition":{"atom":28,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[2,3,5,10,11,27,51]}},{"Entity":{"atom":61}},{"Str":{"pattern":"PLATEAU"}},{"Entity":{"atom":4}},{"Entity":{"atom":9}},{"Entity":{"atom":4}},{"Entity":{"atom":17}},{"Entity":{"atom":26}},{"Repetition":{"atom":59,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[54,55,56,57,58,60]}},{"Alternative":{"atoms":[1,53]}},{"Named":{"name":"base","atom":62}},{"Entity":{"atom":72}},{"Entity":{"atom":4}},{"Str":{"pattern":"Annex"}},{"Entity":{"atom":4}},{"Entity":{"atom":71}},{"Entity":{"atom":70}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Named":{"name":"annex_letter","atom":69}},{"Sequence":{"atoms":[65,66,67,68]}},{"Sequence":{"atoms":[63,64]}},{"Entity":{"atom":52}},{"Entity":{"atom":61}},{"Alternative":{"atoms":[0,74,75]}}],"root":76},"bindings":[]}},"preprocess":{},"tables":{},"lint":{"order_warnings":["rule identifier: branches 1 and 2 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 1 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 2 and 3 are order-dependent (shared first bytes; ordered choice is decisive)"]},"default_entry":"identifier","render":{},"derive":{},"tests":[{"entry":"identifier","kind":"accept","input":"PLATEAU Handbook #3","expect":{}},{"entry":"identifier","kind":"accept","input":"PLATEAU Technical Report #1","expect":{}},{"entry":"identifier","kind":"reject","input":"nonsense","expect":{}}],"docs":{},"source":"# Port of lib/pubid/plateau/parser.rb: PLATEAU Handbook/Technical Report\n# #NN[-annex][ edition], plus Annex supplements. Japanese canonical\n# edition (第X.Y版) and legacy Latin X.Y both capture the same atom.\n\ngrammar PubidPlateau version \"0.1.0\" mode \"v1\" {\n doc_type = (\"Handbook\" / \"Technical Report\") as type\n number = \"#\" (1*digit) as number\n annex = (dash / \"_\") (1*digit) as annex\n edition_part = \"第\" (1*digit \".\" 1*digit) as edition \"版\"\n edition_latin = (1*digit \".\" 1*digit) as edition\n edition = space (edition_part / edition_latin)\n annex_letter = upper as annex_letter\n annex_supplement = space \"Annex\" space annex_letter\n handbook = \"PLATEAU\" space doc_type space number [annex] [edition]\n technical_report = \"PLATEAU\" space doc_type space number [annex]\n annex_identifier = (handbook / technical_report) as base annex_supplement\n identifier = annex_identifier / handbook / technical_report\n upper = %x41-5A\n digit = %x30-39\n space = \" \"\n dash = \"-\"\n entry identifier: identifier\n\n test {\n accept \"PLATEAU Handbook #3\"\n accept \"PLATEAU Technical Report #1\"\n reject \"nonsense\"\n }\n}\n","source_hash":"16e6dfc402aba6758f93c5c036a6fe4d3ecb2f7998661b0a18b7220498a59c5e","unicode_tables":"onigmo (Ruby 3.4.8)","compiler_version":"1.3.112","edition":"v1","checksum":"sha256:7bda239e31966f33db427918677c49f3e15aa34598731259e83fd67894626133"}
1
+ {"bindings":null,"version":"0.1.0","grammar":"PubidPlateau","shape":"parsanol-tree/v2","binding_version":1,"entries":{"identifier":{"root":"identifier","grammar":{"atoms":[{"Entity":{"atom":69}},{"Entity":{"atom":49}},{"Str":{"pattern":"PLATEAU"}},{"Str":{"pattern":" "}},{"Entity":{"atom":8}},{"Str":{"pattern":"Handbook"}},{"Str":{"pattern":"Technical Report"}},{"Alternative":{"atoms":[5,6]}},{"Named":{"name":"type","atom":7}},{"Str":{"pattern":" "}},{"Entity":{"atom":15}},{"Str":{"pattern":"#"}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":12,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"number","atom":13}},{"Sequence":{"atoms":[11,14]}},{"Entity":{"atom":23}},{"Str":{"pattern":"-"}},{"Str":{"pattern":"_"}},{"Alternative":{"atoms":[17,18]}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":20,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"annex","atom":21}},{"Sequence":{"atoms":[19,22]}},{"Repetition":{"atom":16,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":47}},{"Str":{"pattern":" "}},{"Entity":{"atom":37}},{"Str":{"pattern":"第"}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":29,"min":1,"max":null,"tag":"Repetition"}},{"Str":{"pattern":"."}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":32,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[30,31,33]}},{"Named":{"name":"edition","atom":34}},{"Str":{"pattern":"版"}},{"Sequence":{"atoms":[28,35,36]}},{"Entity":{"atom":45}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":39,"min":1,"max":null,"tag":"Repetition"}},{"Str":{"pattern":"."}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":42,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[40,41,43]}},{"Named":{"name":"edition","atom":44}},{"Alternative":{"atoms":[27,38]}},{"Sequence":{"atoms":[26,46]}},{"Repetition":{"atom":25,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[2,3,4,9,10,24,48]}},{"Entity":{"atom":58}},{"Str":{"pattern":"PLATEAU"}},{"Str":{"pattern":" "}},{"Entity":{"atom":8}},{"Str":{"pattern":" "}},{"Entity":{"atom":15}},{"Entity":{"atom":23}},{"Repetition":{"atom":56,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[51,52,53,54,55,57]}},{"Alternative":{"atoms":[1,50]}},{"Named":{"name":"base","atom":59}},{"Entity":{"atom":68}},{"Str":{"pattern":" "}},{"Str":{"pattern":"Annex"}},{"Str":{"pattern":" "}},{"Entity":{"atom":67}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Named":{"name":"annex_letter","atom":66}},{"Sequence":{"atoms":[62,63,64,65]}},{"Sequence":{"atoms":[60,61]}},{"Entity":{"atom":49}},{"Entity":{"atom":58}},{"Alternative":{"atoms":[0,70,71]}}],"root":72},"bindings":[{"capture":"base","path":"base","type":"raw","card":null,"preprocess":null},{"capture":"type","path":"type","type":"string","card":null,"preprocess":null},{"capture":"number","path":"number","type":"string","card":null,"preprocess":null},{"capture":"annex","path":"annex","type":"string","card":null,"preprocess":null},{"capture":"edition","path":"edition","type":"string","card":null,"preprocess":null},{"capture":"annex_letter","path":"annex_letter","type":"string","card":null,"preprocess":null}]}},"preprocess":{},"tables":{},"lint":{"order_warnings":["rule identifier: branches 1 and 2 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 1 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule identifier: branches 2 and 3 are order-dependent (shared first bytes; ordered choice is decisive)"]},"default_entry":"identifier","render":{},"derive":{},"tests":[{"entry":"identifier","kind":"accept","input":"PLATEAU Handbook #3","expect":{}},{"entry":"identifier","kind":"accept","input":"PLATEAU Technical Report #1","expect":{}},{"entry":"identifier","kind":"reject","input":"nonsense","expect":{}}],"docs":{},"source":"# Port of lib/pubid/plateau/parser.rb: PLATEAU Handbook/Technical Report\n# #NN[-annex][ edition], plus Annex supplements. Japanese canonical\n# edition (第X.Y版) and legacy Latin X.Y both capture the same atom.\n#\n# Edition 2: every reference inside a captured body is inlined to raw\n# terms (a rule reference materializes as a named node in the edition-2\n# tree, so only a raw capture binds a scalar span). The base wrapper\n# keeps the v1 tree shape and the bindings name the scalar leaves.\n\ngrammar PubidPlateau version \"0.1.0\" edition 2 {\n doc_type = (\"Handbook\" / \"Technical Report\") as type\n number = \"#\" (1*%x30-39) as number\n annex = (\"-\" / \"_\") (1*%x30-39) as annex\n edition_part = \"第\" (1*%x30-39 \".\" 1*%x30-39) as edition \"版\"\n edition_latin = (1*%x30-39 \".\" 1*%x30-39) as edition\n edition = \" \" (edition_part / edition_latin)\n annex_letter = (%x41-5A) as annex_letter\n annex_supplement = \" \" \"Annex\" \" \" annex_letter\n handbook = \"PLATEAU\" \" \" doc_type \" \" number [annex] [edition]\n technical_report = \"PLATEAU\" \" \" doc_type \" \" number [annex]\n annex_identifier = (handbook / technical_report) as base annex_supplement\n identifier = annex_identifier / handbook / technical_report\n\n entry identifier: identifier\n\n test {\n accept \"PLATEAU Handbook #3\"\n accept \"PLATEAU Technical Report #1\"\n reject \"nonsense\"\n }\n\n bindings identifier {\n # The builder dispatches on base && annex_letter and RE-parses the base\n # subtree recursively (build_annex calls build(parsed[:base])), so base\n # binds uncast — the nested {type, number, annex, edition} hash.\n base -> base (raw)\n type -> type (string)\n number -> number (string)\n annex -> annex (string)\n edition -> edition (string)\n annex_letter -> annex_letter (string)\n }\n}\n","source_hash":"c794ad3672c17b5cacdfa398ef912bc11fa61559a5dec42e38e83f85ea5a03ae","unicode_tables":"onigmo (Ruby 3.4.8)","compiler_version":"1.3.114","edition":2,"checksum":"sha256:18c528e9b4808183ec56567581aedff00d4e275644fe861b9db4a2dd2dbac3e8"}
data/data/parg/tgpp.json CHANGED
@@ -1 +1 @@
1
- {"bindings":null,"version":"0.1.0","grammar":"PubidTgpp","shape":"parsanol-tree/v2","binding_version":1,"entries":{"identifier":{"root":"identifier","grammar":{"atoms":[{"Str":{"pattern":"3GPP "}},{"Repetition":{"atom":0,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":6}},{"Str":{"pattern":"TR"}},{"Str":{"pattern":"TS"}},{"Alternative":{"atoms":[3,4]}},{"Named":{"name":"type","atom":5}},{"Entity":{"atom":8}},{"Str":{"pattern":" "}},{"Entity":{"atom":17}},{"Entity":{"atom":11}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":10,"min":1,"max":null,"tag":"Repetition"}},{"Str":{"pattern":"."}},{"Entity":{"atom":11}},{"Repetition":{"atom":14,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[12,13,15]}},{"Named":{"name":"number","atom":16}},{"Entity":{"atom":24}},{"Entity":{"atom":22}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Re":{"pattern":"[\\x61-\\x7a]"}},{"Alternative":{"atoms":[20,21]}},{"Repetition":{"atom":19,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"suffix","atom":23}},{"Repetition":{"atom":18,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":34}},{"Entity":{"atom":32}},{"Str":{"pattern":"-"}},{"Entity":{"atom":11}},{"Repetition":{"atom":29,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"part","atom":30}},{"Sequence":{"atoms":[28,31]}},{"Repetition":{"atom":27,"min":0,"max":null,"tag":"Repetition"}},{"Named":{"name":"parts","atom":33}},{"Entity":{"atom":36}},{"Str":{"pattern":":"}},{"Entity":{"atom":60}},{"Entity":{"atom":47}},{"Entity":{"atom":11}},{"Repetition":{"atom":39,"min":1,"max":null,"tag":"Repetition"}},{"Str":{"pattern":"."}},{"Entity":{"atom":11}},{"Repetition":{"atom":42,"min":1,"max":null,"tag":"Repetition"}},{"Str":{"pattern":"."}},{"Entity":{"atom":11}},{"Repetition":{"atom":45,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[40,41,43,44,46]}},{"Entity":{"atom":49}},{"Re":{"pattern":"[\\x01-\\u{10ffff}]"}},{"Lookahead":{"atom":48,"positive":false}},{"Sequence":{"atoms":[38,50]}},{"Lookahead":{"atom":51,"positive":false}},{"Entity":{"atom":57}},{"Re":{"pattern":"[\\x01-\\x2e]"}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Re":{"pattern":"[\\x3b-\\u{10ffff}]"}},{"Alternative":{"atoms":[54,55,56]}},{"Repetition":{"atom":53,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"release","atom":58}},{"Sequence":{"atoms":[52,59]}},{"Sequence":{"atoms":[35,37]}},{"Repetition":{"atom":61,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":64}},{"Str":{"pattern":"/"}},{"Entity":{"atom":67}},{"Entity":{"atom":47}},{"Named":{"name":"version","atom":66}},{"Sequence":{"atoms":[63,65]}},{"Repetition":{"atom":68,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[1,2,7,9,25,26,62,69]}}],"root":70},"bindings":[]}},"preprocess":{},"tables":{},"lint":{"order_warnings":["rule release_char: branches 1 and 3 are order-dependent (first set not statically known)","rule release_char: branches 2 and 3 are order-dependent (first set not statically known)"]},"default_entry":"identifier","render":{},"derive":{},"tests":[{"entry":"identifier","kind":"accept","input":"3GPP TS 21.101","expect":{}},{"entry":"identifier","kind":"accept","input":"TS 25.999","expect":{}},{"entry":"identifier","kind":"reject","input":"nonsense","expect":{}}],"docs":{},"source":"# Port of lib/pubid/tgpp/parser.rb:\n# [3GPP ]<TR|TS> <NN.NNN>[suffix][-part…][:<release>][/<version>]\n# The release excludes \"/\" and \":\" (match[\"^/:\"]), byte-wise here; the\n# mistyped-version guard (!version…!any) is ported literally.\n\ngrammar PubidTgpp version \"0.1.0\" mode \"v1\" {\n release_char = %x01-2E / %x30-39 / %x3B-10FFFF\n any_char = %x01-10FFFF\n type = (\"TR\" / \"TS\") as type\n number = (1*digit \".\" 1*digit) as number\n suffix = (1*letter) as suffix\n part = \"-\" (1*digit) as part\n parts = (*part) as parts\n version_core = 1*digit \".\" 1*digit \".\" 1*digit\n release = !(version_core !any_char) (1*release_char) as release\n version = version_core as version\n identifier = [\"3GPP \"] type space number [suffix] parts [(colon release)] [(slash version)]\n letter = %x41-5A / %x61-7A\n digit = %x30-39\n space = \" \"\n colon = \":\"\n slash = \"/\"\n entry identifier: identifier\n\n test {\n accept \"3GPP TS 21.101\"\n accept \"TS 25.999\"\n reject \"nonsense\"\n }\n}\n","source_hash":"3f3bba714488dcad3057d1a3d86f1d02b854ff34d8e2173bd0ce5b92238d034c","unicode_tables":"onigmo (Ruby 3.4.8)","compiler_version":"1.3.114","edition":1,"checksum":"sha256:b60ab478f1cb8cb5e5bb1d5a72f709d2de8d6bbb21d24c6cc1bc609dc45dc2e0"}
1
+ {"bindings":null,"version":"0.1.0","grammar":"PubidTgpp","shape":"parsanol-tree/v2","binding_version":1,"entries":{"identifier":{"root":"identifier","grammar":{"atoms":[{"Str":{"pattern":"3GPP "}},{"Repetition":{"atom":0,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":6}},{"Str":{"pattern":"TR"}},{"Str":{"pattern":"TS"}},{"Alternative":{"atoms":[3,4]}},{"Named":{"name":"type","atom":5}},{"Entity":{"atom":8}},{"Str":{"pattern":" "}},{"Entity":{"atom":17}},{"Entity":{"atom":11}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":10,"min":1,"max":null,"tag":"Repetition"}},{"Str":{"pattern":"."}},{"Entity":{"atom":11}},{"Repetition":{"atom":14,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[12,13,15]}},{"Named":{"name":"number","atom":16}},{"Entity":{"atom":24}},{"Entity":{"atom":22}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Re":{"pattern":"[\\x61-\\x7a]"}},{"Alternative":{"atoms":[20,21]}},{"Repetition":{"atom":19,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"suffix","atom":23}},{"Repetition":{"atom":18,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":34}},{"Entity":{"atom":32}},{"Str":{"pattern":"-"}},{"Entity":{"atom":11}},{"Repetition":{"atom":29,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"part","atom":30}},{"Sequence":{"atoms":[28,31]}},{"Repetition":{"atom":27,"min":0,"max":null,"tag":"Repetition"}},{"Named":{"name":"parts","atom":33}},{"Entity":{"atom":36}},{"Str":{"pattern":":"}},{"Named":{"name":"colon","atom":35}},{"Entity":{"atom":64}},{"Entity":{"atom":51}},{"Entity":{"atom":11}},{"Named":{"name":"digit","atom":40}},{"Repetition":{"atom":41,"min":1,"max":null,"tag":"Repetition"}},{"Str":{"pattern":"."}},{"Entity":{"atom":11}},{"Named":{"name":"digit","atom":44}},{"Repetition":{"atom":45,"min":1,"max":null,"tag":"Repetition"}},{"Str":{"pattern":"."}},{"Entity":{"atom":11}},{"Named":{"name":"digit","atom":48}},{"Repetition":{"atom":49,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[42,43,46,47,50]}},{"Entity":{"atom":53}},{"Re":{"pattern":"[\\x01-\\u{10ffff}]"}},{"Lookahead":{"atom":52,"positive":false}},{"Sequence":{"atoms":[39,54]}},{"Lookahead":{"atom":55,"positive":false}},{"Entity":{"atom":61}},{"Re":{"pattern":"[\\x01-\\x2e]"}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Re":{"pattern":"[\\x3b-\\u{10ffff}]"}},{"Alternative":{"atoms":[58,59,60]}},{"Repetition":{"atom":57,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"release","atom":62}},{"Sequence":{"atoms":[56,63]}},{"Sequence":{"atoms":[37,38]}},{"Repetition":{"atom":65,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":68}},{"Str":{"pattern":"/"}},{"Named":{"name":"slash","atom":67}},{"Entity":{"atom":80}},{"Entity":{"atom":11}},{"Repetition":{"atom":71,"min":1,"max":null,"tag":"Repetition"}},{"Str":{"pattern":"."}},{"Entity":{"atom":11}},{"Repetition":{"atom":74,"min":1,"max":null,"tag":"Repetition"}},{"Str":{"pattern":"."}},{"Entity":{"atom":11}},{"Repetition":{"atom":77,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[72,73,75,76,78]}},{"Named":{"name":"version","atom":79}},{"Sequence":{"atoms":[69,70]}},{"Repetition":{"atom":81,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[1,2,7,9,25,26,66,82]}}],"root":83},"bindings":[{"capture":"type","path":"type","type":"string","card":null,"preprocess":null},{"capture":"number","path":"number","type":"string","card":null,"preprocess":null},{"capture":"suffix","path":"suffix","type":"string","card":null,"preprocess":null},{"capture":"part","path":"parts[].part","type":"string","card":null,"preprocess":null},{"capture":"release","path":"release","type":"string","card":null,"preprocess":null},{"capture":"version","path":"version","type":"string","card":null,"preprocess":null}]}},"preprocess":{},"tables":{},"lint":{"order_warnings":["rule release_char: branches 1 and 3 are order-dependent (first set not statically known)","rule release_char: branches 2 and 3 are order-dependent (first set not statically known)"]},"default_entry":"identifier","render":{},"derive":{},"tests":[{"entry":"identifier","kind":"accept","input":"3GPP TS 21.101","expect":{}},{"entry":"identifier","kind":"accept","input":"TS 25.999","expect":{}},{"entry":"identifier","kind":"reject","input":"nonsense","expect":{}}],"docs":{},"source":"# Port of lib/pubid/tgpp/parser.rb:\n# [3GPP ]<TR|TS> <NN.NNN>[suffix][-part…][:<release>][/<version>]\n# The release excludes \"/\" and \":\" (match[\"^/:\"]), byte-wise here; the\n# mistyped-version guard (!version…!any) is ported literally.\n\ngrammar PubidTgpp version \"0.1.0\" edition 2 {\n release_char = %x01-2E / %x30-39 / %x3B-10FFFF\n any_char = %x01-10FFFF\n type = (\"TR\" / \"TS\") as type\n number = (1*digit \".\" 1*digit) as number\n suffix = (1*letter) as suffix\n part = \"-\" (1*digit) as part\n parts = (*part) as parts\n version_core = 1*digit \".\" 1*digit \".\" 1*digit\n release = !(version_core !any_char) (1*release_char) as release\n version = (1*digit \".\" 1*digit \".\" 1*digit) as version\n identifier = [\"3GPP \"] type space number [suffix] parts [(colon release)] [(slash version)]\n letter = %x41-5A / %x61-7A\n digit = %x30-39\n space = \" \"\n colon = \":\"\n slash = \"/\"\n entry identifier: identifier\n\n bindings identifier {\n type -> type (string)\n number -> number (string)\n suffix -> suffix (string)\n part -> parts[].part (string)\n release -> release (string)\n version -> version (string)\n }\n\n\n test {\n accept \"3GPP TS 21.101\"\n accept \"TS 25.999\"\n reject \"nonsense\"\n }\n}\n","source_hash":"8208f08be56685a980b7c3adeb2a58d64b962c148028fe676b3e00eede72f13a","unicode_tables":"onigmo (Ruby 3.4.8)","compiler_version":"1.3.114","edition":2,"checksum":"sha256:9bdb1d70089ba09ad10fcf091475fb938c7570282c26a20652df304e7f9693af"}
data/data/parg/un.json CHANGED
@@ -1 +1 @@
1
- {"bindings":null,"version":"0.1.0","grammar":"PubidUn","shape":"parsanol-tree/v2","binding_version":1,"entries":{"identifier":{"root":"identifier","grammar":{"atoms":[{"Str":{"pattern":"UN "}},{"Repetition":{"atom":0,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":9}},{"Entity":{"atom":7}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Re":{"pattern":"[.]"}},{"Alternative":{"atoms":[4,5,6]}},{"Repetition":{"atom":3,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"token","atom":8}},{"Entity":{"atom":11}},{"Str":{"pattern":"/"}},{"Entity":{"atom":9}},{"Sequence":{"atoms":[10,12]}},{"Repetition":{"atom":13,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[1,2,14]}}],"root":15},"bindings":[]}},"preprocess":{},"tables":{},"lint":{"order_warnings":[]},"default_entry":"identifier","render":{},"derive":{},"tests":[{"entry":"identifier","kind":"accept","input":"UN/CEFACT/TBG14","expect":{}},{"entry":"identifier","kind":"accept","input":"CEFACT/TBG14","expect":{}},{"entry":"identifier","kind":"reject","input":"nonsense","expect":{}}],"docs":{},"source":"# Port of lib/pubid/un/parser.rb. `token` matches [A-Z0-9.] runs.\n\ngrammar PubidUn version \"0.1.0\" mode \"v1\" {\n token_char = %x41-5A / %x30-39 / %x2E\n token = (1*token_char) as token\n identifier = [\"UN \"] token 1*(slash token)\n slash = \"/\"\n entry identifier: identifier\n\n test {\n accept \"UN/CEFACT/TBG14\"\n accept \"CEFACT/TBG14\"\n reject \"nonsense\"\n }\n}\n","source_hash":"8af25923f5616b2ebe0443dc994d305d8f4390efe46bb685d8aebf89c68c66e2","unicode_tables":"onigmo (Ruby 3.4.8)","compiler_version":"1.3.114","edition":1,"checksum":"sha256:634305272bf558b8cb9193a1af8e75b9cc799d75386dd4d4a53e42d4d66cce1b"}
1
+ {"bindings":null,"version":"0.1.0","grammar":"PubidUn","shape":"parsanol-tree/v2","binding_version":1,"entries":{"identifier":{"root":"identifier","grammar":{"atoms":[{"Str":{"pattern":"UN "}},{"Repetition":{"atom":0,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":8}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Re":{"pattern":"[.]"}},{"Alternative":{"atoms":[3,4,5]}},{"Repetition":{"atom":6,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"token","atom":7}},{"Str":{"pattern":"/"}},{"Entity":{"atom":8}},{"Sequence":{"atoms":[9,10]}},{"Repetition":{"atom":11,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[1,2,12]}}],"root":13},"bindings":[{"capture":"token","path":"token[].token","type":"string","card":null,"preprocess":null}]}},"preprocess":{},"tables":{},"lint":{"order_warnings":[]},"default_entry":"identifier","render":{},"derive":{},"tests":[{"entry":"identifier","kind":"accept","input":"UN/CEFACT/TBG14","expect":{}},{"entry":"identifier","kind":"accept","input":"CEFACT/TBG14","expect":{}},{"entry":"identifier","kind":"reject","input":"nonsense","expect":{}}],"docs":{},"source":"# Port of lib/pubid/un/parser.rb. `token` matches [A-Z0-9.] runs.\n#\n# Edition-2 typed bindings: `token` repeats (one per slash-separated\n# segment) and the builder walks every occurrence as a path element, so\n# the repeats collect under token[].token — a scalar binding would keep\n# only the first segment. The separator stays a raw \"/\" literal: a\n# parenthesized slash ref materializes a {slash:} node whose presence\n# the token-walking builder would read as an empty token.\n\ngrammar PubidUn version \"0.1.0\" edition 2 {\n token_char = %x41-5A / %x30-39 / %x2E\n token = ( 1*(%x41-5A / %x30-39 / %x2E) ) as token\n identifier = [\"UN \"] token 1*( \"/\" token )\n slash = \"/\"\n\n entry identifier: identifier\n\n bindings identifier {\n token -> token[].token (string)\n }\n\n test {\n accept \"UN/CEFACT/TBG14\"\n accept \"CEFACT/TBG14\"\n reject \"nonsense\"\n }\n}\n","source_hash":"ba53a065d999fb151e5b557dafbf245bcb4d8a6948017b198444242eee47fcfb","unicode_tables":"onigmo (Ruby 3.4.8)","compiler_version":"1.3.114","edition":2,"checksum":"sha256:a71b6cfba806bd0802198e7cacb532cbb06136a375bf937f37823f7531f0e327"}
@@ -28,7 +28,7 @@ module Pubid
28
28
  end
29
29
 
30
30
  # R1 parser swap: the baked PG artifact is the parser of record.
31
- parsed = Pubid::Parg::Backend.parse(:adobe, identifier.strip)
31
+ parsed = Pubid::Parg::Model.bound(:adobe, identifier.strip)
32
32
  Builder.build(parsed)
33
33
  end
34
34
 
@@ -1,10 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "parslet"
4
-
5
3
  module Pubid
6
4
  module Adobe
7
- # Parslet grammar for Adobe identifiers.
5
+ # Grammar for Adobe identifiers.
8
6
  #
9
7
  # Canonical citation forms (what the renderer produces):
10
8
  #
@@ -21,116 +19,7 @@ module Pubid
21
19
  # ATN5014 (short alias)
22
20
  # 5014 (bare number; data-repo context)
23
21
  # adobe-glyph-list (bare slug)
24
- class Parser < ::Pubid::Parser::Grammar
25
- include ::Pubid::Parser::CommonParseRules
26
-
27
- root :identifier
28
-
29
- rule(:space) { str(" ") }
30
- rule(:space?) { space.maybe }
31
- rule(:hash) { str("#") }
32
- rule(:dot) { str(".") }
33
- rule(:dash) { str("-") }
34
-
35
- # Canonical short prefix: "Adobe TN" with optional trailing space.
36
- # Matches both "Adobe TN 5014" and "Adobe TN5014".
37
- rule(:tech_note_tn_prefix) do
38
- str("Adobe") >> space >> str("TN") >> space?.maybe
39
- end
40
-
41
- # Legacy long prefix: "Adobe Technical Note" with optional "#".
42
- rule(:tech_note_long_prefix) do
43
- str("Adobe") >> space >> str("Technical") >> space >> str("Note") >>
44
- (space? >> hash.maybe >> space?).maybe
45
- end
46
-
47
- # Legacy short alias: "ATN" with optional trailing space.
48
- rule(:tech_note_atn_prefix) do
49
- str("ATN") >> space?.maybe
50
- end
51
-
52
- rule(:tech_note_prefix) do
53
- tech_note_tn_prefix | tech_note_long_prefix | tech_note_atn_prefix
54
- end
55
-
56
- rule(:digits) do
57
- match("[0-9]").repeat(1)
58
- end
59
-
60
- # 4-digit tech note number, optionally followed by ".<Slug>" from
61
- # the filename form. The slug is captured but not required.
62
- rule(:slug_chars) do
63
- match("[A-Za-z0-9_]").repeat(1)
64
- end
65
-
66
- rule(:tech_note) do
67
- (tech_note_prefix >>
68
- digits.as(:number) >>
69
- (dot >> slug_chars.as(:slug)).maybe).as(:tech_note)
70
- end
71
-
72
- # Bare number form (e.g. when the data repo passes just "5014"
73
- # extracted from a filename). Not advertised in user docs; used
74
- # internally by AdobeFetcher::Docid.
75
- rule(:bare_number) do
76
- digits.as(:number).as(:tech_note_bare)
77
- end
78
-
79
- # "Adobe Publication " prefix. Matched literally then discarded —
80
- # the publication slug/version is parsed by the inner rule.
81
- rule(:publication_prefix) do
82
- str("Adobe") >> space >> str("Publication") >> space
83
- end
84
-
85
- # Publication slug. Lowercase ASCII letters and digits joined by `-`.
86
- # Each segment starts with a letter (so a trailing `-<digits>` is
87
- # unambiguously a version suffix, not part of the slug).
88
- rule(:slug_segment) do
89
- match("[a-z]") >> match("[a-z0-9]").repeat
90
- end
91
-
92
- rule(:slug_inner) do
93
- slug_segment >> (dash >> slug_segment).repeat
94
- end
95
-
96
- rule(:publication_with_version) do
97
- (slug_inner.as(:slug) >> dash >> digits.as(:version)).as(:publication_version)
98
- end
99
-
100
- rule(:publication_slug_or_version) do
101
- # Try with-version first so `adobe-japan1-7` doesn't get captured
102
- # as slug `adobe-japan1-7` with no version. The flat `:slug` form
103
- # is the fallback for unversioned slugs.
104
- publication_with_version | slug_inner.as(:slug)
105
- end
106
-
107
- rule(:publication) do
108
- # Optional "Adobe Publication " prefix. The prefix is consumed
109
- # but not captured — the inner rule produces :slug or
110
- # :publication_version as before.
111
- publication_prefix.maybe >> publication_slug_or_version
112
- end
113
-
114
- rule(:identifier) do
115
- tech_note | bare_number | publication
116
- end
117
-
118
- # Parse a string and return the raw parslet tree.
119
- # @param string [String]
120
- # @return [Hash]
121
- def self.parse(string)
122
- unless string.is_a?(String)
123
- raise ::Pubid::Errors::InvalidInputError,
124
- ::Pubid::INPUT_NOT_A_STRING_MESSAGE
125
- end
126
-
127
- if string.length > ::Pubid::MAX_INPUT_LENGTH
128
- raise ::Pubid::Errors::InvalidInputError,
129
- ::Pubid::INPUT_TOO_LONG_MESSAGE
130
- end
131
-
132
- new.parse(string.strip)
133
- end
22
+ class Parser
134
23
  end
135
24
  end
136
25
  end
@@ -17,7 +17,7 @@ module Pubid
17
17
  raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
18
18
  end
19
19
 
20
- parsed = Pubid::Parg::Backend.parse(:amca, identifier)
20
+ parsed = Pubid::Parg::Model.bound(:amca, identifier)
21
21
  Builder.build(parsed)
22
22
  end
23
23