pubid 2.0.1 → 2.0.3

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 (216) hide show
  1. checksums.yaml +4 -4
  2. data/data/ieee/update_codes.yaml +2 -2
  3. data/data/parg/adobe.json +1 -1
  4. data/data/parg/aiee.json +1 -1
  5. data/data/parg/aiee.parg +99 -9
  6. data/data/parg/amca.json +1 -1
  7. data/data/parg/ansi.json +1 -1
  8. data/data/parg/api.json +1 -1
  9. data/data/parg/ashrae.json +1 -1
  10. data/data/parg/asme.json +1 -1
  11. data/data/parg/astm.json +1 -1
  12. data/data/parg/bipm.json +1 -1
  13. data/data/parg/bsi.json +1 -1
  14. data/data/parg/ccsds.json +1 -1
  15. data/data/parg/cen_cenelec.json +1 -1
  16. data/data/parg/cie.json +1 -1
  17. data/data/parg/csa.json +1 -1
  18. data/data/parg/ecma.json +1 -1
  19. data/data/parg/etsi.json +1 -1
  20. data/data/parg/evs.json +1 -1
  21. data/data/parg/gost.json +1 -1
  22. data/data/parg/iala.json +1 -1
  23. data/data/parg/iana.json +1 -1
  24. data/data/parg/idf.json +1 -1
  25. data/data/parg/iec.json +1 -1
  26. data/data/parg/ieee.json +1 -1
  27. data/data/parg/iho.json +1 -0
  28. data/data/parg/ire.json +1 -1
  29. data/data/parg/ire.parg +51 -12
  30. data/data/parg/isbn.json +1 -1
  31. data/data/parg/iso.json +1 -1
  32. data/data/parg/iso.parg +751 -0
  33. data/data/parg/itu.json +1 -1
  34. data/data/parg/jcgm.json +1 -1
  35. data/data/parg/jis.json +1 -1
  36. data/data/parg/nesc.json +1 -1
  37. data/data/parg/nesc.parg +97 -12
  38. data/data/parg/nist.json +1 -1
  39. data/data/parg/oiml.json +1 -1
  40. data/data/parg/omg.json +1 -1
  41. data/data/parg/parg.json +1 -1
  42. data/data/parg/plateau.json +1 -1
  43. data/data/parg/tgpp.json +1 -1
  44. data/data/parg/un.json +1 -1
  45. data/lib/pubid/adobe/identifier.rb +1 -1
  46. data/lib/pubid/adobe/parser.rb +2 -113
  47. data/lib/pubid/amca/identifiers/base.rb +1 -1
  48. data/lib/pubid/amca/parser.rb +1 -145
  49. data/lib/pubid/ansi/identifier.rb +1 -1
  50. data/lib/pubid/ansi/parser.rb +1 -82
  51. data/lib/pubid/api/builder.rb +32 -1
  52. data/lib/pubid/api/identifier.rb +1 -1
  53. data/lib/pubid/api/parser.rb +1 -131
  54. data/lib/pubid/ashrae/identifiers/base.rb +1 -1
  55. data/lib/pubid/ashrae/parser.rb +3 -710
  56. data/lib/pubid/asme/builder.rb +6 -4
  57. data/lib/pubid/asme/identifier.rb +1 -2
  58. data/lib/pubid/asme/parser.rb +1 -328
  59. data/lib/pubid/astm/builder.rb +12 -3
  60. data/lib/pubid/astm/identifier.rb +1 -2
  61. data/lib/pubid/astm/parser.rb +1 -227
  62. data/lib/pubid/bipm/identifier.rb +8 -1
  63. data/lib/pubid/bipm/parser.rb +2 -224
  64. data/lib/pubid/bsi/builder.rb +2 -4
  65. data/lib/pubid/bsi/parser.rb +1 -666
  66. data/lib/pubid/bsi/single_identifier.rb +38 -1
  67. data/lib/pubid/calconnect/parser.rb +2 -40
  68. data/lib/pubid/ccsds/identifier.rb +1 -1
  69. data/lib/pubid/ccsds/parser.rb +1 -66
  70. data/lib/pubid/cen_cenelec/identifier.rb +16 -1
  71. data/lib/pubid/cen_cenelec/parser.rb +3 -136
  72. data/lib/pubid/cie/identifier.rb +1 -1
  73. data/lib/pubid/cie/parser.rb +3 -378
  74. data/lib/pubid/conformance.rb +1 -1
  75. data/lib/pubid/csa/builder.rb +41 -18
  76. data/lib/pubid/csa/identifier.rb +12 -4
  77. data/lib/pubid/csa/identifiers/amendment.rb +28 -0
  78. data/lib/pubid/csa/identifiers.rb +1 -0
  79. data/lib/pubid/csa/parser.rb +16 -397
  80. data/lib/pubid/doi/parser.rb +2 -37
  81. data/lib/pubid/easc/builder.rb +1 -1
  82. data/lib/pubid/easc/parser.rb +2 -70
  83. data/lib/pubid/ecma/CLAUDE.md +8 -1
  84. data/lib/pubid/ecma/identifier.rb +13 -8
  85. data/lib/pubid/ecma/parser.rb +2 -54
  86. data/lib/pubid/ecma/renderer.rb +3 -7
  87. data/lib/pubid/errors.rb +18 -13
  88. data/lib/pubid/etsi/builder.rb +8 -5
  89. data/lib/pubid/etsi/identifiers/base.rb +1 -1
  90. data/lib/pubid/etsi/parser.rb +1 -132
  91. data/lib/pubid/evs/identifier.rb +7 -0
  92. data/lib/pubid/evs/parser.rb +1 -8
  93. data/lib/pubid/evs.rb +1 -1
  94. data/lib/pubid/gb/identifier.rb +6 -0
  95. data/lib/pubid/gb/parser.rb +2 -51
  96. data/lib/pubid/gost/identifier.rb +9 -1
  97. data/lib/pubid/gost/parser.rb +4 -81
  98. data/lib/pubid/iala/builder.rb +48 -39
  99. data/lib/pubid/iala/identifier.rb +1 -1
  100. data/lib/pubid/iala/parser.rb +2 -121
  101. data/lib/pubid/iana/identifier.rb +1 -1
  102. data/lib/pubid/iana/parser.rb +2 -24
  103. data/lib/pubid/identifier.rb +78 -1
  104. data/lib/pubid/idf/builder.rb +42 -0
  105. data/lib/pubid/idf/identifier.rb +1 -1
  106. data/lib/pubid/idf/parser.rb +1 -137
  107. data/lib/pubid/idf.rb +1 -2
  108. data/lib/pubid/iec/builder.rb +158 -50
  109. data/lib/pubid/iec/identifier.rb +1 -1
  110. data/lib/pubid/iec/parser.rb +3 -430
  111. data/lib/pubid/ieee/CLAUDE.md +2 -0
  112. data/lib/pubid/ieee/aiee/identifier.rb +2 -1
  113. data/lib/pubid/ieee/aiee.rb +0 -1
  114. data/lib/pubid/ieee/builder.rb +177 -30
  115. data/lib/pubid/ieee/components/code.rb +46 -7
  116. data/lib/pubid/ieee/identifiers/base.rb +5 -2
  117. data/lib/pubid/ieee/identifiers/joint_development.rb +7 -3
  118. data/lib/pubid/ieee/ire/identifier.rb +2 -1
  119. data/lib/pubid/ieee/ire.rb +0 -1
  120. data/lib/pubid/ieee/nesc/builder.rb +1 -1
  121. data/lib/pubid/ieee/nesc.rb +0 -1
  122. data/lib/pubid/ieee/parser.rb +1 -1257
  123. data/lib/pubid/ieee/project_renderer.rb +5 -1
  124. data/lib/pubid/ieee/renderer.rb +4 -2
  125. data/lib/pubid/ieee/urn_generator.rb +4 -1
  126. data/lib/pubid/ietf/identifiers/base.rb +17 -1
  127. data/lib/pubid/ietf/parser.rb +2 -47
  128. data/lib/pubid/ietf/renderer.rb +17 -2
  129. data/lib/pubid/iho/CLAUDE.md +98 -0
  130. data/lib/pubid/iho/builder.rb +4 -1
  131. data/lib/pubid/iho/identifiers/base.rb +28 -2
  132. data/lib/pubid/iho/renderer.rb +8 -0
  133. data/lib/pubid/iho/urn_generator.rb +14 -1
  134. data/lib/pubid/iho/urn_parser.rb +45 -32
  135. data/lib/pubid/iho.rb +0 -1
  136. data/lib/pubid/isbn/identifier.rb +1 -1
  137. data/lib/pubid/isbn/parser.rb +2 -31
  138. data/lib/pubid/iso/CLAUDE.md +66 -0
  139. data/lib/pubid/iso/builder.rb +229 -15
  140. data/lib/pubid/iso/identifier.rb +22 -12
  141. data/lib/pubid/iso/identifiers/directives.rb +6 -3
  142. data/lib/pubid/iso/identifiers/guide.rb +6 -3
  143. data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +6 -3
  144. data/lib/pubid/iso/normalizer.rb +5 -4
  145. data/lib/pubid/iso/parser.rb +1 -539
  146. data/lib/pubid/iso/supplement_identifier.rb +6 -3
  147. data/lib/pubid/iso/urn_parser.rb +13 -8
  148. data/lib/pubid/iso/utilities.rb +4 -5
  149. data/lib/pubid/iso.rb +1 -19
  150. data/lib/pubid/itu/builder.rb +36 -20
  151. data/lib/pubid/itu/identifiers/base.rb +15 -2
  152. data/lib/pubid/itu/parser.rb +1 -775
  153. data/lib/pubid/jcgm/builder.rb +35 -0
  154. data/lib/pubid/jcgm/parser.rb +1 -151
  155. data/lib/pubid/jcgm.rb +1 -2
  156. data/lib/pubid/jis/CLAUDE.md +36 -0
  157. data/lib/pubid/jis/builder.rb +30 -41
  158. data/lib/pubid/jis/identifier.rb +12 -2
  159. data/lib/pubid/jis/identifiers/welding_engineering_standard.rb +35 -0
  160. data/lib/pubid/jis/identifiers.rb +2 -0
  161. data/lib/pubid/jis/parser.rb +1 -128
  162. data/lib/pubid/jis/renderer.rb +1 -1
  163. data/lib/pubid/jis/supplement_identifier.rb +5 -5
  164. data/lib/pubid/jis/urn_parser.rb +2 -1
  165. data/lib/pubid/jis.rb +3 -2
  166. data/lib/pubid/nist/builder.rb +5 -1
  167. data/lib/pubid/nist/caster.rb +13 -3
  168. data/lib/pubid/nist/identifiers/base.rb +37 -2
  169. data/lib/pubid/nist/identifiers/circular.rb +2 -2
  170. data/lib/pubid/nist/identifiers/circular_supplement.rb +2 -2
  171. data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +2 -2
  172. data/lib/pubid/nist/identifiers/crpl_report.rb +2 -2
  173. data/lib/pubid/nist/identifiers/handbook.rb +2 -2
  174. data/lib/pubid/nist/identifiers/internal_report.rb +2 -2
  175. data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +2 -2
  176. data/lib/pubid/nist/identifiers/monograph.rb +2 -2
  177. data/lib/pubid/nist/identifiers/report.rb +2 -2
  178. data/lib/pubid/nist/parser.rb +19 -775
  179. data/lib/pubid/nist/router.rb +4 -1
  180. data/lib/pubid/nist/supplement_identifier.rb +2 -2
  181. data/lib/pubid/oasis/parser.rb +2 -16
  182. data/lib/pubid/ogc/parser.rb +2 -26
  183. data/lib/pubid/oiml/identifiers/certification_system.rb +7 -0
  184. data/lib/pubid/oiml/identifiers/dual_published.rb +2 -2
  185. data/lib/pubid/oiml/parser.rb +1 -303
  186. data/lib/pubid/oiml.rb +1 -2
  187. data/lib/pubid/omg/identifier.rb +6 -1
  188. data/lib/pubid/omg/parser.rb +2 -76
  189. data/lib/pubid/parser.rb +5 -4
  190. data/lib/pubid/parsers/mr_string.rb +1 -1
  191. data/lib/pubid/plateau/parser.rb +1 -66
  192. data/lib/pubid/plateau.rb +1 -2
  193. data/lib/pubid/renderers/directives_renderer.rb +1 -1
  194. data/lib/pubid/renderers/iwa_renderer.rb +1 -1
  195. data/lib/pubid/renderers/publisher_stripper.rb +82 -0
  196. data/lib/pubid/renderers/supplement_renderer.rb +1 -1
  197. data/lib/pubid/renderers.rb +1 -0
  198. data/lib/pubid/sae/parser.rb +1 -48
  199. data/lib/pubid/tgpp/identifier.rb +1 -1
  200. data/lib/pubid/tgpp/parser.rb +2 -59
  201. data/lib/pubid/un/identifier.rb +1 -1
  202. data/lib/pubid/un/parser.rb +1 -18
  203. data/lib/pubid/version.rb +1 -1
  204. data/lib/pubid/w3c/parser.rb +2 -27
  205. data/lib/pubid/xsf/identifier.rb +10 -6
  206. data/lib/pubid/xsf/parser.rb +3 -31
  207. data/lib/pubid/xsf/renderer.rb +2 -4
  208. data/lib/pubid.rb +8 -9
  209. metadata +9 -23
  210. data/lib/pubid/ieee/aiee/parser.rb +0 -130
  211. data/lib/pubid/ieee/ire/parser.rb +0 -109
  212. data/lib/pubid/ieee/nesc/parser.rb +0 -155
  213. data/lib/pubid/iho/parser.rb +0 -68
  214. data/lib/pubid/parser/common_parse_methods.rb +0 -13
  215. data/lib/pubid/parser/common_parse_rules.rb +0 -56
  216. data/lib/pubid/parser/grammar.rb +0 -96
@@ -0,0 +1 @@
1
+ {"bindings":null,"version":"0.1.0","grammar":"PubidIho","shape":"parsanol-tree/v2","binding_version":1,"entries":{"identifier":{"root":"identifier","grammar":{"atoms":[{"Str":{"pattern":"IHO"}},{"Entity":{"atom":2}},{"Str":{"pattern":" "}},{"Sequence":{"atoms":[0,1]}},{"Repetition":{"atom":3,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":12}},{"Str":{"pattern":"S"}},{"Str":{"pattern":"P"}},{"Str":{"pattern":"M"}},{"Str":{"pattern":"B"}},{"Str":{"pattern":"C"}},{"Alternative":{"atoms":[6,7,8,9,10]}},{"Named":{"name":"type","atom":11}},{"Entity":{"atom":14}},{"Str":{"pattern":"-"}},{"Entity":{"atom":37}},{"Entity":{"atom":17}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":16,"min":1,"max":null,"tag":"Repetition"}},{"Entity":{"atom":34}},{"Str":{"pattern":":"}},{"Entity":{"atom":17}},{"Repetition":{"atom":21,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[20,22]}},{"Str":{"pattern":"/"}},{"Entity":{"atom":17}},{"Repetition":{"atom":25,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[24,26]}},{"Entity":{"atom":14}},{"Entity":{"atom":17}},{"Repetition":{"atom":29,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[28,30]}},{"Entity":{"atom":33}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Alternative":{"atoms":[23,27,31,32]}},{"Repetition":{"atom":19,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[18,35]}},{"Named":{"name":"number","atom":36}},{"Entity":{"atom":54}},{"Entity":{"atom":2}},{"Str":{"pattern":"Appendix"}},{"Str":{"pattern":"Ap."}},{"Alternative":{"atoms":[40,41]}},{"Entity":{"atom":2}},{"Entity":{"atom":33}},{"Entity":{"atom":14}},{"Entity":{"atom":17}},{"Repetition":{"atom":46,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[44,45,47]}},{"Entity":{"atom":17}},{"Repetition":{"atom":49,"min":1,"max":null,"tag":"Repetition"}},{"Entity":{"atom":33}},{"Alternative":{"atoms":[48,50,51]}},{"Named":{"name":"appendix","atom":52}},{"Sequence":{"atoms":[39,42,43,53]}},{"Repetition":{"atom":38,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":72}},{"Entity":{"atom":2}},{"Str":{"pattern":"Part"}},{"Entity":{"atom":2}},{"Entity":{"atom":17}},{"Repetition":{"atom":60,"min":1,"max":null,"tag":"Repetition"}},{"Entity":{"atom":66}},{"Entity":{"atom":33}},{"Entity":{"atom":65}},{"Re":{"pattern":"[\\x61-\\x7a]"}},{"Alternative":{"atoms":[63,64]}},{"Repetition":{"atom":62,"min":0,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[61,67]}},{"Entity":{"atom":33}},{"Alternative":{"atoms":[68,69]}},{"Named":{"name":"part","atom":70}},{"Sequence":{"atoms":[57,58,59,71]}},{"Repetition":{"atom":56,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":80}},{"Entity":{"atom":2}},{"Str":{"pattern":"Annex"}},{"Entity":{"atom":2}},{"Entity":{"atom":33}},{"Named":{"name":"annex","atom":78}},{"Sequence":{"atoms":[75,76,77,79]}},{"Repetition":{"atom":74,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":89}},{"Entity":{"atom":2}},{"Str":{"pattern":"Suppl"}},{"Entity":{"atom":2}},{"Entity":{"atom":17}},{"Repetition":{"atom":86,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"supplement","atom":87}},{"Sequence":{"atoms":[83,84,85,88]}},{"Repetition":{"atom":82,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":135}},{"Entity":{"atom":2}},{"Entity":{"atom":17}},{"Repetition":{"atom":93,"min":1,"max":null,"tag":"Repetition"}},{"Entity":{"atom":96}},{"Str":{"pattern":"."}},{"Entity":{"atom":17}},{"Repetition":{"atom":97,"min":1,"max":null,"tag":"Repetition"}},{"Entity":{"atom":96}},{"Entity":{"atom":17}},{"Repetition":{"atom":100,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[94,95,98,99,101]}},{"Named":{"name":"version","atom":102}},{"Str":{"pattern":"19"}},{"Str":{"pattern":"20"}},{"Alternative":{"atoms":[104,105]}},{"Entity":{"atom":17}},{"Repetition":{"atom":107,"min":2,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[106,108]}},{"Named":{"name":"year","atom":109}},{"Str":{"pattern":"Vol."}},{"Entity":{"atom":2}},{"Entity":{"atom":17}},{"Repetition":{"atom":113,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"volume","atom":114}},{"Sequence":{"atoms":[111,112,115]}},{"Entity":{"atom":2}},{"Str":{"pattern":"Issue"}},{"Entity":{"atom":2}},{"Entity":{"atom":17}},{"Repetition":{"atom":120,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"issue","atom":121}},{"Sequence":{"atoms":[117,118,119,122]}},{"Entity":{"atom":2}},{"Str":{"pattern":"("}},{"Entity":{"atom":17}},{"Repetition":{"atom":126,"min":1,"max":null,"tag":"Repetition"}},{"Named":{"name":"issue","atom":127}},{"Str":{"pattern":")"}},{"Sequence":{"atoms":[124,125,128,129]}},{"Alternative":{"atoms":[123,130]}},{"Repetition":{"atom":131,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[116,132]}},{"Alternative":{"atoms":[103,110,133]}},{"Sequence":{"atoms":[92,134]}},{"Repetition":{"atom":91,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[4,5,13,15,55,73,81,90,136]}}],"root":137},"bindings":[{"capture":"year","path":"year","type":"string","card":null,"preprocess":null},{"capture":"volume","path":"volume","type":"string","card":null,"preprocess":null},{"capture":"issue","path":"issue","type":"string","card":null,"preprocess":null}]}},"preprocess":{},"tables":{},"lint":{"order_warnings":[]},"default_entry":"identifier","render":{},"derive":{},"tests":[{"entry":"identifier","kind":"accept","input":"S-5","expect":{}},{"entry":"identifier","kind":"accept","input":"IHO S-5 Appendix 2","expect":{}},{"entry":"identifier","kind":"accept","input":"IHO B-12 3.0.0","expect":{}},{"entry":"identifier","kind":"accept","input":"IHO P-5 2024","expect":{}},{"entry":"identifier","kind":"accept","input":"P-5 2024","expect":{}},{"entry":"identifier","kind":"accept","input":"IHO B-7 2023","expect":{}},{"entry":"identifier","kind":"accept","input":"IHO P-1 Vol. 30","expect":{}},{"entry":"identifier","kind":"accept","input":"IHO P-1 Vol. 30 (2)","expect":{}},{"entry":"identifier","kind":"accept","input":"IHO P-1 Vol. 30 Issue 2","expect":{}},{"entry":"identifier","kind":"reject","input":"nonsense","expect":{}},{"entry":"identifier","kind":"reject","input":"IHO B-12 3.0","expect":{}}],"docs":{},"source":"# Port of lib/pubid/iho/parser.rb — IHO identifiers: letter series\n# (S/P/M/B/C), a number with an optional suffix, and appendix, part,\n# annex, supplement and version tails.\n#\n# The trailing component of a series form is a discriminator chosen\n# from:\n# - the dotted version a.b.c (unchanged — the historical placeholder\n# and the real S/M/B/C editions, e.g. \"B-12 3.0.0\");\n# - a 4-digit year 19xx/20xx (\"P-5 2024\", \"B-7 2023\") — the identity\n# form for the year-identified series (relaton#407: B-7, P-5, P-6\n# are identified by year, not by a placeholder edition);\n# - a volume \"Vol. N\" with an optional issue (\"P-1 Vol. 30\",\n# \"P-1 Vol. 30 (2)\"). The issue is captured as the bare number and\n# prints in parentheses. The \"Issue N\" spelling is accepted as an\n# input alias; the parenthesized form is the canonical print.\n# DECISION FLAG for the IHO-agreement step: real IHR issue\n# spellings vary (\"No. N\" is also seen) — only \"(N)\" and\n# \"Issue N\" are accepted until the spelling is agreed.\n# A two-segment version (\"B-12 3.0\") is deliberately NOT supported:\n# no IHO series carries one in the corpus, and neither new rule\n# swallows it (a year needs all four digits of 19xx/20xx; a dotted\n# version needs all three segments).\n#\n# The grammar stays edition v1: the v1 tree inlines rule references\n# inside a captured body (the v2 tree materializes them as named\n# nodes), which the builder's string fold over :number/:type expects.\n# The tail rule uses only raw terms, so nothing in it needs v2.\n\ngrammar PubidIho version \"0.1.0\" edition 1 {\n digit = %x30-39\n upper = %x41-5A\n lower = %x61-7A\n letter = upper / lower\n space = \" \"\n dash = \"-\"\n dot = \".\"\n\n series = (\"S\" / \"P\" / \"M\" / \"B\" / \"C\") as type\n number_suffix = ((\":\" 1*digit) / (\"/\" 1*digit) / (dash 1*digit) / upper)\n number = (1*digit [number_suffix]) as number\n appendix = {\n space (\"Appendix\" / \"Ap.\") space\n ((upper dash 1*digit) / (1*digit) / upper) as appendix\n }\n part = {\n space \"Part\" space\n ((1*digit *letter) / upper) as part\n }\n annex = space \"Annex\" space upper as annex\n supplement = space \"Suppl\" space (1*digit) as supplement\n tail = {\n space\n (\n (1*digit dot 1*digit dot 1*digit) as version\n / ((\"19\" / \"20\") 2*digit) as year\n / (\n (\"Vol.\" space (1*digit) as volume)\n [\n (space \"Issue\" space (1*digit) as issue)\n / (space \"(\" (1*digit) as issue \")\")\n ]\n )\n )\n }\n\n identifier = {\n [(\"IHO\" space)]\n series\n dash\n number\n [appendix]\n [part]\n [annex]\n [supplement]\n [tail]\n }\n\n entry identifier: identifier\n\n test {\n accept \"S-5\"\n accept \"IHO S-5 Appendix 2\"\n accept \"IHO B-12 3.0.0\"\n accept \"IHO P-5 2024\"\n accept \"P-5 2024\"\n accept \"IHO B-7 2023\"\n accept \"IHO P-1 Vol. 30\"\n accept \"IHO P-1 Vol. 30 (2)\"\n accept \"IHO P-1 Vol. 30 Issue 2\"\n reject \"nonsense\"\n reject \"IHO B-12 3.0\"\n }\n\n bindings identifier {\n year -> year (string)\n volume -> volume (string)\n issue -> issue (string)\n }\n}\n","source_hash":"8d0d31907c36e5a398b7af8e11b434afb75588f6252e79cd975cb2c10a10ad8a","unicode_tables":"onigmo (Ruby 3.4.8)","compiler_version":"1.3.114","edition":1,"checksum":"sha256:52f91157a4d75ed1eef5cddd14789fcd907ec721384f88f5d3df77548dc307b9"}
data/data/parg/ire.json CHANGED
@@ -1 +1 @@
1
- {"bindings":null,"version":"0.1.0","grammar":"PubidIre","shape":"parsanol-tree/v2","binding_version":1,"entries":{"ire_identifier":{"root":"ire_identifier","grammar":{"atoms":[{"Entity":{"atom":90}},{"Entity":{"atom":23}},{"Entity":{"atom":18}},{"Str":{"pattern":"191"}},{"Entity":{"atom":5}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Sequence":{"atoms":[3,4]}},{"Str":{"pattern":"19"}},{"Str":{"pattern":"2"}},{"Str":{"pattern":"3"}},{"Str":{"pattern":"4"}},{"Str":{"pattern":"5"}},{"Alternative":{"atoms":[8,9,10,11]}},{"Entity":{"atom":5}},{"Sequence":{"atoms":[7,12,13]}},{"Str":{"pattern":"196"}},{"Re":{"pattern":"[\\x30-\\x33]"}},{"Sequence":{"atoms":[15,16]}},{"Alternative":{"atoms":[6,14,17]}},{"Entity":{"atom":22}},{"Re":{"pattern":"[\\x31-\\x36]"}},{"Entity":{"atom":5}},{"Sequence":{"atoms":[20,21]}},{"Alternative":{"atoms":[2,19]}},{"Named":{"name":"year","atom":1}},{"Entity":{"atom":26}},{"Str":{"pattern":" "}},{"Entity":{"atom":31}},{"Str":{"pattern":"IEEE-IRE"}},{"Str":{"pattern":"IRE"}},{"Alternative":{"atoms":[28,29]}},{"Named":{"name":"publisher","atom":30}},{"Entity":{"atom":26}},{"Entity":{"atom":38}},{"Str":{"pattern":"Trans."}},{"Str":{"pattern":"Standard"}},{"Str":{"pattern":"Std"}},{"Alternative":{"atoms":[34,35,36]}},{"Named":{"name":"type","atom":37}},{"Entity":{"atom":26}},{"Sequence":{"atoms":[33,39]}},{"Repetition":{"atom":40,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":71}},{"Entity":{"atom":45}},{"Entity":{"atom":5}},{"Repetition":{"atom":44,"min":1,"max":null,"tag":"Repetition"}},{"Entity":{"atom":26}},{"Entity":{"atom":48}},{"Str":{"pattern":"."}},{"Alternative":{"atoms":[46,47]}},{"Entity":{"atom":51}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Entity":{"atom":45}},{"Sequence":{"atoms":[43,49,50,52]}},{"Entity":{"atom":45}},{"Entity":{"atom":48}},{"Str":{"pattern":"IRE"}},{"Entity":{"atom":45}},{"Entity":{"atom":48}},{"Entity":{"atom":45}},{"Entity":{"atom":51}},{"Entity":{"atom":45}},{"Sequence":{"atoms":[54,55,56,57,58,59,60,61]}},{"Entity":{"atom":51}},{"Repetition":{"atom":63,"min":2,"max":4,"tag":"Repetition"}},{"Entity":{"atom":66}},{"Str":{"pattern":"-"}},{"Entity":{"atom":45}},{"Sequence":{"atoms":[64,65,67]}},{"Entity":{"atom":45}},{"Alternative":{"atoms":[53,62,68,69]}},{"Named":{"name":"number","atom":70}},{"Entity":{"atom":85}},{"Entity":{"atom":26}},{"Entity":{"atom":66}},{"Str":{"pattern":","}},{"Alternative":{"atoms":[74,75]}},{"Repetition":{"atom":76,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":26}},{"Repetition":{"atom":78,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[73,77,79]}},{"Entity":{"atom":66}},{"Str":{"pattern":","}},{"Alternative":{"atoms":[81,82]}},{"Entity":{"atom":26}},{"Alternative":{"atoms":[80,83,84]}},{"Entity":{"atom":18}},{"Named":{"name":"full_year","atom":86}},{"Sequence":{"atoms":[72,87]}},{"Repetition":{"atom":88,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[24,25,27,32,41,42,89]}},{"Entity":{"atom":105}},{"Entity":{"atom":31}},{"Entity":{"atom":26}},{"Entity":{"atom":38}},{"Entity":{"atom":26}},{"Sequence":{"atoms":[94,95]}},{"Repetition":{"atom":96,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":71}},{"Entity":{"atom":104}},{"Entity":{"atom":85}},{"Entity":{"atom":23}},{"Named":{"name":"year","atom":101}},{"Sequence":{"atoms":[100,102]}},{"Repetition":{"atom":103,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[92,93,97,98,99]}},{"Alternative":{"atoms":[0,91]}}],"root":106},"bindings":[]}},"preprocess":{},"tables":{},"lint":{"order_warnings":["rule year_full: branches 1 and 2 are order-dependent (shared first bytes; ordered choice is decisive)","rule year_full: branches 1 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule year_full: branches 2 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule year: branches 1 and 2 are order-dependent (shared first bytes; ordered choice is decisive)","rule yr_sep: branches 1 and 3 are order-dependent (shared first bytes; ordered choice is decisive)"]},"default_entry":"ire_identifier","render":{},"derive":{},"tests":[{"entry":"ire_identifier","kind":"accept","input":"IRE Trans. PGI-7","expect":{}},{"entry":"ire_identifier","kind":"accept","input":"1930 IRE 20","expect":{}},{"entry":"ire_identifier","kind":"accept","input":"IRE Standard 15 S1","expect":{}},{"entry":"ire_identifier","kind":"accept","input":"IRE 28","expect":{}},{"entry":"ire_identifier","kind":"reject","input":"nonsense","expect":{}}],"docs":{},"source":"# Port of lib/pubid/ieee/ire/parser.rb — IRE (pre-IEEE) designations:\n# year-first and prefix-first forms, types (Trans./Standard/Std),\n# numbers (dotted letters, IRE-glued, letters-dash) and dates.\n# Consumed by the ieee grammar via `use ire`.\n\ngrammar PubidIre version \"0.1.0\" mode \"v1\" {\n digit = %x30-39\n upper = %x41-5A\n digits = 1*digit\n space = \" \"\n dash = \"-\"\n dot = \".\"\n\n year_short = (%x31-36 digit)\n year_full = ((\"191\" digit)) / ((\"19\" (\"2\" / \"3\" / \"4\" / \"5\") digit)) / ((\"196\" %x30-33))\n year = year_full / year_short\n ire_prefix = (\"IEEE-IRE\" / \"IRE\") as publisher\n ire_type = (\"Trans.\" / \"Standard\" / \"Std\") as type\n number = (((digits (space / dot) upper digits)) / ((digits dot \"IRE\" digits dot digits upper digits)) / ((2*4upper dash digits)) / (digits)) as number\n yr_sep = (space [(dash / \",\")] [space]) / (dash / \",\") / space\n date = [yr_sep (year) as year]\n\n # The trailing optional is flattened on purpose: a nested [([x] [y])]\n # compiles to branches that commit past the leading space in the\n # pure-Ruby VM, losing the backtrack the year-less forms need.\n ire_identifier_year_first = ((year) as year) space ire_prefix space [(ire_type space)] number [yr_sep (year_full) as full_year]\n ire_identifier_prefix_first = ire_prefix space [(ire_type space)] number date\n ire_identifier = ire_identifier_year_first / ire_identifier_prefix_first\n\n entry ire_identifier: ire_identifier\n\n test {\n accept \"IRE Trans. PGI-7\"\n accept \"1930 IRE 20\"\n accept \"IRE Standard 15 S1\"\n accept \"IRE 28\"\n reject \"nonsense\"\n }\n}\n","source_hash":"d03632e39bdb02326680d909c3634785c2c88da6ff7b761f2815a3b656328406","unicode_tables":"onigmo (Ruby 3.4.8)","compiler_version":"1.3.114","edition":1,"checksum":"sha256:85510f79e03cca412cf5854e82bdcec18ff143394a3c3cddf68aeba4e026bf68"}
1
+ {"bindings":null,"version":"0.1.0","grammar":"PubidIre","shape":"parsanol-tree/v2","binding_version":1,"entries":{"ire_identifier":{"root":"ire_identifier","grammar":{"atoms":[{"Entity":{"atom":105}},{"Str":{"pattern":"191"}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Sequence":{"atoms":[1,2]}},{"Str":{"pattern":"19"}},{"Str":{"pattern":"2"}},{"Str":{"pattern":"3"}},{"Str":{"pattern":"4"}},{"Str":{"pattern":"5"}},{"Alternative":{"atoms":[5,6,7,8]}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Sequence":{"atoms":[4,9,10]}},{"Str":{"pattern":"196"}},{"Re":{"pattern":"[\\x30-\\x33]"}},{"Sequence":{"atoms":[12,13]}},{"Re":{"pattern":"[\\x31-\\x36]"}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Sequence":{"atoms":[15,16]}},{"Alternative":{"atoms":[3,11,14,17]}},{"Named":{"name":"year","atom":18}},{"Str":{"pattern":" "}},{"Entity":{"atom":25}},{"Str":{"pattern":"IEEE-IRE"}},{"Str":{"pattern":"IRE"}},{"Alternative":{"atoms":[22,23]}},{"Named":{"name":"publisher","atom":24}},{"Str":{"pattern":" "}},{"Entity":{"atom":32}},{"Str":{"pattern":"Trans."}},{"Str":{"pattern":"Standard"}},{"Str":{"pattern":"Std"}},{"Alternative":{"atoms":[28,29,30]}},{"Named":{"name":"type","atom":31}},{"Str":{"pattern":" "}},{"Sequence":{"atoms":[27,33]}},{"Repetition":{"atom":34,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":68}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":37,"min":1,"max":null,"tag":"Repetition"}},{"Str":{"pattern":" "}},{"Str":{"pattern":"."}},{"Alternative":{"atoms":[39,40]}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":43,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[38,41,42,44]}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":46,"min":1,"max":null,"tag":"Repetition"}},{"Str":{"pattern":"."}},{"Str":{"pattern":"IRE"}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":50,"min":1,"max":null,"tag":"Repetition"}},{"Str":{"pattern":"."}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":53,"min":1,"max":null,"tag":"Repetition"}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":56,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[47,48,49,51,52,54,55,57]}},{"Re":{"pattern":"[\\x41-\\x5a]"}},{"Repetition":{"atom":59,"min":2,"max":4,"tag":"Repetition"}},{"Str":{"pattern":"-"}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":62,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[60,61,63]}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":65,"min":1,"max":null,"tag":"Repetition"}},{"Alternative":{"atoms":[45,58,64,66]}},{"Named":{"name":"number","atom":67}},{"Entity":{"atom":86}},{"Entity":{"atom":71}},{"Str":{"pattern":" "}},{"Entity":{"atom":73}},{"Str":{"pattern":"-"}},{"Named":{"name":"dash","atom":72}},{"Str":{"pattern":","}},{"Alternative":{"atoms":[74,75]}},{"Repetition":{"atom":76,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":71}},{"Repetition":{"atom":78,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[70,77,79]}},{"Entity":{"atom":73}},{"Named":{"name":"dash","atom":81}},{"Str":{"pattern":","}},{"Alternative":{"atoms":[82,83]}},{"Entity":{"atom":71}},{"Alternative":{"atoms":[80,84,85]}},{"Str":{"pattern":"191"}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Sequence":{"atoms":[87,88]}},{"Str":{"pattern":"19"}},{"Str":{"pattern":"2"}},{"Str":{"pattern":"3"}},{"Str":{"pattern":"4"}},{"Str":{"pattern":"5"}},{"Alternative":{"atoms":[91,92,93,94]}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Sequence":{"atoms":[90,95,96]}},{"Str":{"pattern":"196"}},{"Re":{"pattern":"[\\x30-\\x33]"}},{"Sequence":{"atoms":[98,99]}},{"Alternative":{"atoms":[89,97,100]}},{"Named":{"name":"full_year","atom":101}},{"Sequence":{"atoms":[69,102]}},{"Repetition":{"atom":103,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[19,20,21,26,35,36,104]}},{"Entity":{"atom":136}},{"Entity":{"atom":25}},{"Str":{"pattern":" "}},{"Entity":{"atom":32}},{"Str":{"pattern":" "}},{"Sequence":{"atoms":[109,110]}},{"Repetition":{"atom":111,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":68}},{"Entity":{"atom":86}},{"Str":{"pattern":"191"}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Sequence":{"atoms":[115,116]}},{"Str":{"pattern":"19"}},{"Str":{"pattern":"2"}},{"Str":{"pattern":"3"}},{"Str":{"pattern":"4"}},{"Str":{"pattern":"5"}},{"Alternative":{"atoms":[119,120,121,122]}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Sequence":{"atoms":[118,123,124]}},{"Str":{"pattern":"196"}},{"Re":{"pattern":"[\\x30-\\x33]"}},{"Sequence":{"atoms":[126,127]}},{"Re":{"pattern":"[\\x31-\\x36]"}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Sequence":{"atoms":[129,130]}},{"Alternative":{"atoms":[117,125,128,131]}},{"Named":{"name":"year","atom":132}},{"Sequence":{"atoms":[114,133]}},{"Repetition":{"atom":134,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[107,108,112,113,135]}},{"Alternative":{"atoms":[0,106]}}],"root":137},"bindings":[{"capture":"publisher","path":"publisher","type":"string","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":"year","path":"year","type":"string","card":null,"preprocess":null},{"capture":"full_year","path":"full_year","type":"string","card":null,"preprocess":null}]}},"preprocess":{},"tables":{},"lint":{"order_warnings":["rule year_full: branches 1 and 2 are order-dependent (shared first bytes; ordered choice is decisive)","rule year_full: branches 1 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule year_full: branches 2 and 3 are order-dependent (shared first bytes; ordered choice is decisive)","rule yr_sep: branches 1 and 3 are order-dependent (shared first bytes; ordered choice is decisive)"]},"default_entry":"ire_identifier","render":{},"derive":{},"tests":[{"entry":"ire_identifier","kind":"accept","input":"IRE Trans. PGI-7","expect":{}},{"entry":"ire_identifier","kind":"accept","input":"1930 IRE 20","expect":{}},{"entry":"ire_identifier","kind":"accept","input":"IRE Standard 15 S1","expect":{}},{"entry":"ire_identifier","kind":"accept","input":"IRE 28","expect":{}},{"entry":"ire_identifier","kind":"reject","input":"nonsense","expect":{}}],"docs":{},"source":"# Port of lib/pubid/ieee/ire/parser.rb — IRE (pre-IEEE) designations:\n# year-first and prefix-first forms, types (Trans./Standard/Std),\n# numbers (dotted letters, IRE-glued, letters-dash) and dates.\n# Consumed by the ieee grammar via `use ire`.\n#\n# Edition-2 notes: the year / year_full bodies are inlined at every\n# capture site (a capture wrapping a rule ref expands to element hashes,\n# while the inlined body binds as one scalar string), and the helper\n# spaces around captures stay raw literals (a parenthesized ref\n# materializes a stray named node).\n\ngrammar PubidIre version \"0.1.0\" edition 2 {\n digit = %x30-39\n upper = %x41-5A\n space = \" \"\n dash = \"-\"\n dot = \".\"\n\n year_short = (%x31-36 %x30-39)\n year_full = ((\"191\" %x30-39)) / ((\"19\" (\"2\" / \"3\" / \"4\" / \"5\") %x30-39)) / ((\"196\" %x30-33))\n ire_prefix = (\"IEEE-IRE\" / \"IRE\") as publisher\n ire_type = (\"Trans.\" / \"Standard\" / \"Std\") as type\n number = {\n (\n ( 1*(%x30-39) (\" \" / \".\") %x41-5A 1*(%x30-39) )\n / ( 1*(%x30-39) \".\" \"IRE\" 1*(%x30-39) \".\" 1*(%x30-39) %x41-5A 1*(%x30-39) )\n / ( 2*4%x41-5A \"-\" 1*(%x30-39) )\n / ( 1*(%x30-39) )\n ) as number\n }\n yr_sep = (space [(dash / \",\")] [space]) / (dash / \",\") / space\n\n # The trailing optional stays flattened on purpose: a nested\n # [([x] [y])] compiles to branches that commit past the leading space\n # in the pure-Ruby VM, losing the backtrack the year-less forms need.\n ire_identifier_year_first = {\n (\n (\"191\" %x30-39)\n / (\"19\" (\"2\" / \"3\" / \"4\" / \"5\") %x30-39)\n / (\"196\" %x30-33)\n / (%x31-36 %x30-39)\n ) as year\n \" \" ire_prefix \" \" [ire_type \" \"] number\n [ yr_sep (\n (\"191\" %x30-39)\n / (\"19\" (\"2\" / \"3\" / \"4\" / \"5\") %x30-39)\n / (\"196\" %x30-33)\n ) as full_year ]\n }\n ire_identifier_prefix_first = {\n ire_prefix \" \" [ire_type \" \"] number\n [ yr_sep (\n (\"191\" %x30-39)\n / (\"19\" (\"2\" / \"3\" / \"4\" / \"5\") %x30-39)\n / (\"196\" %x30-33)\n / (%x31-36 %x30-39)\n ) as year ]\n }\n ire_identifier = ire_identifier_year_first / ire_identifier_prefix_first\n\n entry ire_identifier: ire_identifier\n\n bindings ire_identifier {\n publisher -> publisher (string)\n type -> type (string)\n number -> number (string)\n year -> year (string)\n full_year -> full_year (string)\n }\n\n test {\n accept \"IRE Trans. PGI-7\"\n accept \"1930 IRE 20\"\n accept \"IRE Standard 15 S1\"\n accept \"IRE 28\"\n reject \"nonsense\"\n }\n}\n","source_hash":"c4e0006d9f6995e5c75e03b2f277fc9a078ca5d49367bbc17a48ac994b53ba8e","unicode_tables":"onigmo (Ruby 3.4.8)","compiler_version":"1.3.114","edition":2,"checksum":"sha256:d381eee0583376c50b1e0c48b3cef50380a2368fedf6932e592fff4469845e84"}
data/data/parg/ire.parg CHANGED
@@ -2,33 +2,72 @@
2
2
  # year-first and prefix-first forms, types (Trans./Standard/Std),
3
3
  # numbers (dotted letters, IRE-glued, letters-dash) and dates.
4
4
  # Consumed by the ieee grammar via `use ire`.
5
+ #
6
+ # Edition-2 notes: the year / year_full bodies are inlined at every
7
+ # capture site (a capture wrapping a rule ref expands to element hashes,
8
+ # while the inlined body binds as one scalar string), and the helper
9
+ # spaces around captures stay raw literals (a parenthesized ref
10
+ # materializes a stray named node).
5
11
 
6
- grammar PubidIre version "0.1.0" {
12
+ grammar PubidIre version "0.1.0" edition 2 {
7
13
  digit = %x30-39
8
14
  upper = %x41-5A
9
- digits = 1*digit
10
15
  space = " "
11
16
  dash = "-"
12
17
  dot = "."
13
18
 
14
- year_short = (%x31-36 digit)
15
- year_full = (("191" digit)) / (("19" ("2" / "3" / "4" / "5") digit)) / (("196" %x30-33))
16
- year = year_full / year_short
19
+ year_short = (%x31-36 %x30-39)
20
+ year_full = (("191" %x30-39)) / (("19" ("2" / "3" / "4" / "5") %x30-39)) / (("196" %x30-33))
17
21
  ire_prefix = ("IEEE-IRE" / "IRE") as publisher
18
22
  ire_type = ("Trans." / "Standard" / "Std") as type
19
- number = (((digits (space / dot) upper digits)) / ((digits dot "IRE" digits dot digits upper digits)) / ((2*4upper dash digits)) / (digits)) as number
23
+ number = {
24
+ (
25
+ ( 1*(%x30-39) (" " / ".") %x41-5A 1*(%x30-39) )
26
+ / ( 1*(%x30-39) "." "IRE" 1*(%x30-39) "." 1*(%x30-39) %x41-5A 1*(%x30-39) )
27
+ / ( 2*4%x41-5A "-" 1*(%x30-39) )
28
+ / ( 1*(%x30-39) )
29
+ ) as number
30
+ }
20
31
  yr_sep = (space [(dash / ",")] [space]) / (dash / ",") / space
21
- date = [yr_sep (year) as year]
22
32
 
23
- # The trailing optional is flattened on purpose: a nested [([x] [y])]
24
- # compiles to branches that commit past the leading space in the
25
- # pure-Ruby VM, losing the backtrack the year-less forms need.
26
- ire_identifier_year_first = ((year) as year) space ire_prefix space [(ire_type space)] number [yr_sep (year_full) as full_year]
27
- ire_identifier_prefix_first = ire_prefix space [(ire_type space)] number date
33
+ # The trailing optional stays flattened on purpose: a nested
34
+ # [([x] [y])] compiles to branches that commit past the leading space
35
+ # in the pure-Ruby VM, losing the backtrack the year-less forms need.
36
+ ire_identifier_year_first = {
37
+ (
38
+ ("191" %x30-39)
39
+ / ("19" ("2" / "3" / "4" / "5") %x30-39)
40
+ / ("196" %x30-33)
41
+ / (%x31-36 %x30-39)
42
+ ) as year
43
+ " " ire_prefix " " [ire_type " "] number
44
+ [ yr_sep (
45
+ ("191" %x30-39)
46
+ / ("19" ("2" / "3" / "4" / "5") %x30-39)
47
+ / ("196" %x30-33)
48
+ ) as full_year ]
49
+ }
50
+ ire_identifier_prefix_first = {
51
+ ire_prefix " " [ire_type " "] number
52
+ [ yr_sep (
53
+ ("191" %x30-39)
54
+ / ("19" ("2" / "3" / "4" / "5") %x30-39)
55
+ / ("196" %x30-33)
56
+ / (%x31-36 %x30-39)
57
+ ) as year ]
58
+ }
28
59
  ire_identifier = ire_identifier_year_first / ire_identifier_prefix_first
29
60
 
30
61
  entry ire_identifier: ire_identifier
31
62
 
63
+ bindings ire_identifier {
64
+ publisher -> publisher (string)
65
+ type -> type (string)
66
+ number -> number (string)
67
+ year -> year (string)
68
+ full_year -> full_year (string)
69
+ }
70
+
32
71
  test {
33
72
  accept "IRE Trans. PGI-7"
34
73
  accept "1930 IRE 20"
data/data/parg/isbn.json CHANGED
@@ -1 +1 @@
1
- {"bindings":null,"version":"0.1.0","grammar":"PubidIsbn","shape":"parsanol-tree/v2","binding_version":1,"entries":{"identifier":{"root":"identifier","grammar":{"atoms":[{"Entity":{"atom":13}},{"Str":{"pattern":"ISBN"}},{"Entity":{"atom":3}},{"Str":{"pattern":" "}},{"Entity":{"atom":3}},{"Repetition":{"atom":4,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":7}},{"Str":{"pattern":":"}},{"Entity":{"atom":3}},{"Repetition":{"atom":8,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[5,6,9]}},{"Alternative":{"atoms":[2,10]}},{"Sequence":{"atoms":[1,11]}},{"Repetition":{"atom":12,"min":0,"max":1,"tag":"Maybe"}},{"Repetition":{"atom":0,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":33}},{"Entity":{"atom":19}},{"Entity":{"atom":18}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":17,"min":1,"max":null,"tag":"Repetition"}},{"Entity":{"atom":21}},{"Str":{"pattern":"-"}},{"Entity":{"atom":19}},{"Sequence":{"atoms":[20,22]}},{"Repetition":{"atom":23,"min":0,"max":null,"tag":"Repetition"}},{"Entity":{"atom":21}},{"Entity":{"atom":29}},{"Entity":{"atom":18}},{"Str":{"pattern":"X"}},{"Alternative":{"atoms":[27,28]}},{"Sequence":{"atoms":[25,26]}},{"Repetition":{"atom":30,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[16,24,31]}},{"Named":{"name":"body","atom":32}},{"Entity":{"atom":40}},{"Entity":{"atom":18}},{"Repetition":{"atom":35,"min":9,"max":12,"tag":"Repetition"}},{"Entity":{"atom":29}},{"Repetition":{"atom":37,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[36,38]}},{"Named":{"name":"body","atom":39}},{"Alternative":{"atoms":[15,34]}},{"Sequence":{"atoms":[14,41]}}],"root":42},"bindings":[]}},"preprocess":{},"tables":{},"lint":{"order_warnings":[]},"default_entry":"identifier","render":{},"derive":{},"tests":[{"entry":"identifier","kind":"accept","input":"ISBN 978-0-306-40615-7","expect":{}},{"entry":"identifier","kind":"accept","input":"978-0-306-40615-7","expect":{}},{"entry":"identifier","kind":"accept","input":"0-306-40615-2","expect":{}},{"entry":"identifier","kind":"reject","input":"nonsense","expect":{}}],"docs":{},"source":"# Port of lib/pubid/isbn/parser.rb: [ISBN[ |:]] digits/hyphens with an\n# optional final X (ISBN-10 check digit), per ISO 2108.\n\ngrammar PubidIsbn version \"0.1.0\" mode \"v1\" {\n digit = %x30-39\n x_digit = digit / \"X\"\n isbn_prefix = [\"ISBN\" (space / ([space] colon [space]))]\n digit_group = 1*digit\n hyphen_body = (digit_group *(hyphen digit_group) [hyphen x_digit]) as body\n plain_body = (9*12digit [x_digit]) as body\n identifier = [isbn_prefix] (hyphen_body / plain_body)\n space = \" \"\n colon = \":\"\n hyphen = \"-\"\n entry identifier: identifier\n\n test {\n accept \"ISBN 978-0-306-40615-7\"\n accept \"978-0-306-40615-7\"\n accept \"0-306-40615-2\"\n reject \"nonsense\"\n }\n}\n","source_hash":"09858d16f79569e023bbec7907e8dcb2a3349e3111678543286807ca60bf4c06","unicode_tables":"onigmo (Ruby 3.4.8)","compiler_version":"1.3.114","edition":1,"checksum":"sha256:6d1c73655cbd69003e569f8732ff6a6fc41fd9b4f043626d0951ec75ad61bbe6"}
1
+ {"bindings":null,"version":"0.1.0","grammar":"PubidIsbn","shape":"parsanol-tree/v2","binding_version":1,"entries":{"identifier":{"root":"identifier","grammar":{"atoms":[{"Entity":{"atom":14}},{"Str":{"pattern":"ISBN"}},{"Entity":{"atom":3}},{"Str":{"pattern":" "}},{"Entity":{"atom":3}},{"Repetition":{"atom":4,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":7}},{"Str":{"pattern":":"}},{"Named":{"name":"colon","atom":6}},{"Entity":{"atom":3}},{"Repetition":{"atom":9,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[5,8,10]}},{"Alternative":{"atoms":[2,11]}},{"Sequence":{"atoms":[1,12]}},{"Repetition":{"atom":13,"min":0,"max":1,"tag":"Maybe"}},{"Repetition":{"atom":0,"min":0,"max":1,"tag":"Maybe"}},{"Entity":{"atom":32}},{"Entity":{"atom":18}},{"Re":{"pattern":"[\\x30-\\x39]"}},{"Repetition":{"atom":17,"min":1,"max":null,"tag":"Repetition"}},{"Str":{"pattern":"-"}},{"Entity":{"atom":18}},{"Repetition":{"atom":21,"min":1,"max":null,"tag":"Repetition"}},{"Sequence":{"atoms":[20,22]}},{"Repetition":{"atom":23,"min":0,"max":null,"tag":"Repetition"}},{"Str":{"pattern":"-"}},{"Entity":{"atom":18}},{"Str":{"pattern":"X"}},{"Alternative":{"atoms":[26,27]}},{"Sequence":{"atoms":[25,28]}},{"Repetition":{"atom":29,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[19,24,30]}},{"Named":{"name":"body","atom":31}},{"Entity":{"atom":41}},{"Entity":{"atom":18}},{"Repetition":{"atom":34,"min":9,"max":12,"tag":"Repetition"}},{"Entity":{"atom":18}},{"Str":{"pattern":"X"}},{"Alternative":{"atoms":[36,37]}},{"Repetition":{"atom":38,"min":0,"max":1,"tag":"Maybe"}},{"Sequence":{"atoms":[35,39]}},{"Named":{"name":"body","atom":40}},{"Alternative":{"atoms":[16,33]}},{"Sequence":{"atoms":[15,42]}}],"root":43},"bindings":[{"capture":"body","path":"body","type":"string","card":null,"preprocess":null}]}},"preprocess":{},"tables":{},"lint":{"order_warnings":[]},"default_entry":"identifier","render":{},"derive":{},"tests":[{"entry":"identifier","kind":"accept","input":"ISBN 978-0-306-40615-7","expect":{}},{"entry":"identifier","kind":"accept","input":"978-0-306-40615-7","expect":{}},{"entry":"identifier","kind":"accept","input":"0-306-40615-2","expect":{}},{"entry":"identifier","kind":"reject","input":"nonsense","expect":{}}],"docs":{},"source":"# Port of lib/pubid/isbn/parser.rb: [ISBN[ |:]] digits/hyphens with an\n# optional final X (ISBN-10 check digit), per ISO 2108.\n\ngrammar PubidIsbn version \"0.1.0\" edition 2 {\n digit = %x30-39\n x_digit = digit / \"X\"\n isbn_prefix = [\"ISBN\" (space / ([space] colon [space]))]\n digit_group = 1*digit\n hyphen_body = (1*digit *(\"-\" 1*digit) [\"-\" (digit / \"X\")]) as body\n plain_body = (9*12digit [(digit / \"X\")]) as body\n identifier = [isbn_prefix] (hyphen_body / plain_body)\n space = \" \"\n colon = \":\"\n hyphen = \"-\"\n entry identifier: identifier\n\n bindings identifier {\n body -> body (string)\n }\n\n\n test {\n accept \"ISBN 978-0-306-40615-7\"\n accept \"978-0-306-40615-7\"\n accept \"0-306-40615-2\"\n reject \"nonsense\"\n }\n}\n","source_hash":"f51cde7d61a7430a88c5fdf9e8e9ae21b8139cc2f4bb3d3e6412739c81336bde","unicode_tables":"onigmo (Ruby 3.4.8)","compiler_version":"1.3.114","edition":2,"checksum":"sha256:e42ff78bfd5bba2199f0748c4306dcb6f00cb7b2b6bff50e71e4a93b269e0e4f"}