expressir 1.2.11-aarch64-linux → 2.4.29-aarch64-linux

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 (467) hide show
  1. checksums.yaml +4 -4
  2. data/.cargo/config.toml +3 -0
  3. data/.github/scripts/test_installed_gem.rb +34 -0
  4. data/.github/workflows/codeql.yml +35 -0
  5. data/.github/workflows/docs.yml +99 -0
  6. data/.github/workflows/links.yml +100 -0
  7. data/.github/workflows/native-gems.yml +201 -0
  8. data/.github/workflows/rake.yml +10 -296
  9. data/.github/workflows/release.yml +26 -114
  10. data/.github/workflows/rust-ext.yml +41 -0
  11. data/.github/workflows/stress.yml +36 -0
  12. data/.github/workflows/validate_schemas.yml +48 -0
  13. data/.github/workflows/verify_remarks.yml +33 -0
  14. data/.gitignore +33 -1
  15. data/.rubocop.yml +11 -11
  16. data/.rubocop_todo.yml +297 -0
  17. data/CHANGELOG.md +159 -0
  18. data/Gemfile +15 -1
  19. data/README.adoc +2675 -47
  20. data/Rakefile +34 -10
  21. data/TODO.bugs/01-stale-transformer-autoload.md +39 -0
  22. data/TODO.bugs/02-parser-class-instance-vars.md +36 -0
  23. data/TODO.bugs/03-builder-mutable-state.md +43 -0
  24. data/TODO.bugs/04-formatter-public-send-dispatch.md +53 -0
  25. data/TODO.bugs/05-anonymous-formatter-subclass.md +45 -0
  26. data/TODO.bugs/06-collection-registry-single-source.md +53 -0
  27. data/TODO.bugs/07-require-relative-cleanup.md +42 -0
  28. data/TODO.bugs/08-require-expressir-in-commands.md +34 -0
  29. data/TODO.bugs/09-parser-split.md +53 -0
  30. data/TODO.bugs/10-to-s-override.md +42 -0
  31. data/TODO.bugs/11-parser-class-variables.md +39 -0
  32. data/TODO.bugs/12-marker-modules-vs-registry.md +64 -0
  33. data/TODO.bugs/13-string-literal-scanner-limitation.md +52 -0
  34. data/TODO.bugs/14-model-formatting-leak.md +30 -0
  35. data/TODO.bugs/15-expression-children-macro.md +27 -0
  36. data/TODO.bugs/16-pretty-formatter-duplication.md +28 -0
  37. data/TODO.bugs/17-snake-case-cache-mutable-constant.md +28 -0
  38. data/TODO.bugs/18-const-get-private-constants.md +30 -0
  39. data/TODO.bugs/19-format-methods-public.md +22 -0
  40. data/TODO.bugs/20-coverage-nested-entities-dedup.md +20 -0
  41. data/TODO.bugs/21-operator-tokens-secondary-dispatch.md +21 -0
  42. data/TODO.bugs/22-builder-fast-path-wrappers.md +32 -0
  43. data/TODO.bugs/23-coverage-inverse-maps.md +21 -0
  44. data/TODO.bugs/24-streaming-builder-complexity.md +19 -0
  45. data/TODO.bugs/25-debug-puts-in-production.md +21 -0
  46. data/TODO.bugs/26-generic-entity-children-misplaced.md +21 -0
  47. data/TODO.bugs/27-package-build-god-method.md +19 -0
  48. data/TODO.bugs/28-package-god-class.md +30 -0
  49. data/TODO.bugs/29-validate-ascii-god-class.md +24 -0
  50. data/TODO.bugs/30-unicode-map-extraction.md +19 -0
  51. data/TODO.bugs/README.md +43 -0
  52. data/TODO.max-perf/01-restore-ci-green.md +36 -0
  53. data/TODO.max-perf/02-streaming-parse-path.md +31 -0
  54. data/TODO.max-perf/03-cli-parallel-opt-in.md +27 -0
  55. data/TODO.max-perf/04-benchmark-harness.md +28 -0
  56. data/TODO.max-perf/05-parallel-fidelity-specs.md +22 -0
  57. data/TODO.max-perf/06-builder-cpu-audit.md +41 -0
  58. data/TODO.max-perf/07-upstream-parsanol-roadmap.md +27 -0
  59. data/TODO.max-perf/08-builder-build-perf.md +45 -0
  60. data/TODO.max-perf/09-grammar-cold-start.md +25 -0
  61. data/TODO.max-perf/10-parser-facade-hygiene.md +23 -0
  62. data/TODO.max-perf/11-ci-green-closeout.md +25 -0
  63. data/TODO.max-perf/12-require-boot-profile.md +25 -0
  64. data/TODO.max-perf/13-key-conversion-specs.md +26 -0
  65. data/TODO.max-perf/14-builder-call-handler-audit.md +28 -0
  66. data/TODO.parity-ee/00-overview.md +76 -0
  67. data/TODO.parity-ee/01-annex-g-rule-extraction.md +41 -0
  68. data/TODO.parity-ee/02-eeng-algorithm-inventory.md +8 -0
  69. data/TODO.parity-ee/03-eeng-oracle-harness.md +33 -0
  70. data/TODO.parity-ee/04-shtolo-concatenate.md +44 -0
  71. data/TODO.parity-ee/05-shtolo-longform-flatten.md +53 -0
  72. data/TODO.parity-ee/06-interface-scheduling-parity.md +47 -0
  73. data/TODO.parity-ee/07-semantic-checks-port.md +35 -0
  74. data/TODO.parity-ee/08-pretty-roundtrip-gate.md +27 -0
  75. data/TODO.parity-ee/09-smrl-index-and-listing.md +22 -0
  76. data/TODO.parity-ee/10-interface-dot-graph.md +21 -0
  77. data/TODO.parity-ee/11-import-eeng-tests.md +79 -0
  78. data/TODO.parity-ee/12-full-check-catalog.md +67 -0
  79. data/TODO.parity-ee/13-population-p21.md +54 -0
  80. data/TODO.parity-ee/14-shtolo-completion.md +44 -0
  81. data/TODO.parity-ee/15-part28-xml.md +51 -0
  82. data/TODO.parity-ee/16-compare-patch.md +48 -0
  83. data/TODO.parity-ee/17-official-tests.md +42 -0
  84. data/TODO.parity-ee/18-mim-mapping.md +47 -0
  85. data/TODO.parity-ee/19-architecture.md +97 -0
  86. data/TODO.parity-ee/parity-matrix.md +108 -0
  87. data/TODO.refpath-v2/00-overview.md +64 -0
  88. data/TODO.suma-improvements/00-overview.md +23 -0
  89. data/TODO.suma-improvements/01-prebuilt-platform-gems.md +33 -0
  90. data/TODO.suma-improvements/02-suma-e2e.md +39 -0
  91. data/TODO.suma-improvements/03-item-graph.md +22 -0
  92. data/TODO.suma-improvements/04-compiled-set-default.md +16 -0
  93. data/TODO.suma-improvements/05-validation-in-docs.md +17 -0
  94. data/TODO.suma-improvements/06-memory-remeasure.md +36 -0
  95. data/TODO.suma-improvements/07-part28-xml.md +15 -0
  96. data/TODO.suma-improvements/08-windows-gnu-toolchain.md +15 -0
  97. data/TODO.suma-improvements/09-checker-tranche3.md +13 -0
  98. data/TODO.suma-improvements/10-expressdoc.md +8 -0
  99. data/benchmark/srl_benchmark.rb +458 -0
  100. data/benchmark/srl_native_benchmark.rb +146 -0
  101. data/benchmark/srl_ruby_benchmark.rb +132 -0
  102. data/bin/rspec +2 -1
  103. data/docs/Gemfile +12 -0
  104. data/docs/_config.yml +141 -0
  105. data/docs/_guides/changes/changes-format.adoc +778 -0
  106. data/docs/_guides/changes/importing-eengine.adoc +898 -0
  107. data/docs/_guides/changes/index.adoc +396 -0
  108. data/docs/_guides/changes/programmatic-usage.adoc +1038 -0
  109. data/docs/_guides/changes/validating-changes.adoc +681 -0
  110. data/docs/_guides/cli/benchmark-performance.adoc +834 -0
  111. data/docs/_guides/cli/coverage-analysis.adoc +921 -0
  112. data/docs/_guides/cli/format-schemas.adoc +547 -0
  113. data/docs/_guides/cli/index.adoc +8 -0
  114. data/docs/_guides/cli/managing-changes.adoc +927 -0
  115. data/docs/_guides/cli/validate-ascii.adoc +645 -0
  116. data/docs/_guides/cli/validate-schemas.adoc +534 -0
  117. data/docs/_guides/formatter/formatter-architecture.adoc +401 -0
  118. data/docs/_guides/index.adoc +165 -0
  119. data/docs/_guides/ler/creating-packages.adoc +664 -0
  120. data/docs/_guides/ler/index.adoc +305 -0
  121. data/docs/_guides/ler/loading-packages.adoc +707 -0
  122. data/docs/_guides/ler/package-formats.adoc +748 -0
  123. data/docs/_guides/ler/querying-packages.adoc +826 -0
  124. data/docs/_guides/ler/step-packages.adoc +385 -0
  125. data/docs/_guides/ler/validating-packages.adoc +750 -0
  126. data/docs/_guides/liquid/basic-templates.adoc +813 -0
  127. data/docs/_guides/liquid/documentation-generation.adoc +1042 -0
  128. data/docs/_guides/liquid/drops-reference.adoc +829 -0
  129. data/docs/_guides/liquid/filters-and-tags.adoc +912 -0
  130. data/docs/_guides/liquid/index.adoc +468 -0
  131. data/docs/_guides/manifests/creating-manifests.adoc +483 -0
  132. data/docs/_guides/manifests/index.adoc +307 -0
  133. data/docs/_guides/manifests/resolving-manifests.adoc +557 -0
  134. data/docs/_guides/manifests/validating-manifests.adoc +713 -0
  135. data/docs/_guides/ruby-api/formatting-schemas.adoc +605 -0
  136. data/docs/_guides/ruby-api/index.adoc +257 -0
  137. data/docs/_guides/ruby-api/parsing-files.adoc +421 -0
  138. data/docs/_guides/ruby-api/search-engine.adoc +609 -0
  139. data/docs/_guides/ruby-api/working-with-repository.adoc +577 -0
  140. data/docs/_pages/data-model.adoc +665 -0
  141. data/docs/_pages/express-language.adoc +506 -0
  142. data/docs/_pages/getting-started.adoc +414 -0
  143. data/docs/_pages/index.adoc +116 -0
  144. data/docs/_pages/introduction.adoc +256 -0
  145. data/docs/_pages/ler-packages.adoc +837 -0
  146. data/docs/_pages/parsers.adoc +709 -0
  147. data/docs/_pages/schema-manifests.adoc +431 -0
  148. data/docs/_references/index.adoc +228 -0
  149. data/docs/_tutorials/creating-ler-package.adoc +735 -0
  150. data/docs/_tutorials/documentation-coverage.adoc +795 -0
  151. data/docs/_tutorials/formatting-schemas.adoc +89 -0
  152. data/docs/_tutorials/index.adoc +231 -0
  153. data/docs/_tutorials/liquid-templates.adoc +806 -0
  154. data/docs/_tutorials/parsing-your-first-schema.adoc +522 -0
  155. data/docs/_tutorials/querying-schemas.adoc +751 -0
  156. data/docs/_tutorials/working-with-multiple-schemas.adoc +676 -0
  157. data/docs/index.adoc +242 -0
  158. data/docs/lychee.toml +90 -0
  159. data/examples/demo_ler_usage.sh +86 -0
  160. data/examples/ler/README.md +111 -0
  161. data/examples/ler/simple_example.ler +0 -0
  162. data/examples/ler/simple_schema.exp +33 -0
  163. data/examples/ler_build.rb +75 -0
  164. data/examples/ler_cli.rb +79 -0
  165. data/examples/ler_demo_complete.rb +276 -0
  166. data/examples/ler_query.rb +91 -0
  167. data/examples/ler_query_examples.rb +305 -0
  168. data/examples/ler_stats.rb +81 -0
  169. data/examples/phase3_demo.rb +159 -0
  170. data/examples/query_demo_simple.rb +131 -0
  171. data/exe/expressir +6 -17
  172. data/exe/expressir-format +14 -0
  173. data/exe/{format-test → expressir-format-test} +8 -7
  174. data/expressir.gemspec +50 -37
  175. data/lib/expressir/3.2/expressir_core.so +0 -0
  176. data/lib/expressir/3.3/expressir_core.so +0 -0
  177. data/lib/expressir/3.4/expressir_core.so +0 -0
  178. data/lib/expressir/4.0/expressir_core.so +0 -0
  179. data/lib/expressir/benchmark.rb +310 -0
  180. data/lib/expressir/changes/item_change.rb +20 -0
  181. data/lib/expressir/changes/mapping_change.rb +16 -0
  182. data/lib/expressir/changes/schema_change.rb +85 -0
  183. data/lib/expressir/changes/version_change.rb +26 -0
  184. data/lib/expressir/changes.rb +9 -0
  185. data/lib/expressir/cli.rb +138 -11
  186. data/lib/expressir/commands/base.rb +25 -0
  187. data/lib/expressir/commands/benchmark.rb +59 -0
  188. data/lib/expressir/commands/benchmark_cache.rb +80 -0
  189. data/lib/expressir/commands/changes.rb +34 -0
  190. data/lib/expressir/commands/changes_import_eengine.rb +146 -0
  191. data/lib/expressir/commands/changes_validate.rb +63 -0
  192. data/lib/expressir/commands/check.rb +56 -0
  193. data/lib/expressir/commands/clean.rb +20 -0
  194. data/lib/expressir/commands/coverage.rb +458 -0
  195. data/lib/expressir/commands/expand.rb +26 -0
  196. data/lib/expressir/commands/file_violations.rb +70 -0
  197. data/lib/expressir/commands/fix.rb +33 -0
  198. data/lib/expressir/commands/flatten.rb +29 -0
  199. data/lib/expressir/commands/format.rb +43 -0
  200. data/lib/expressir/commands/manifest.rb +420 -0
  201. data/lib/expressir/commands/mapping_validate.rb +68 -0
  202. data/lib/expressir/commands/non_ascii_character.rb +49 -0
  203. data/lib/expressir/commands/non_ascii_violation_collection.rb +301 -0
  204. data/lib/expressir/commands/package.rb +1222 -0
  205. data/lib/expressir/commands/parity_inputs.rb +160 -0
  206. data/lib/expressir/commands/validate.rb +106 -0
  207. data/lib/expressir/commands/validate_ascii.rb +94 -0
  208. data/lib/expressir/commands/validate_load.rb +91 -0
  209. data/lib/expressir/commands/version.rb +9 -0
  210. data/lib/expressir/commands/xsd.rb +23 -0
  211. data/lib/expressir/commands.rb +30 -0
  212. data/lib/expressir/config.rb +40 -3
  213. data/lib/expressir/coverage.rb +510 -0
  214. data/lib/expressir/eengine/arm_compare_report.rb +23 -0
  215. data/lib/expressir/eengine/changes_section.rb +16 -0
  216. data/lib/expressir/eengine/compare_report.rb +69 -0
  217. data/lib/expressir/eengine/mim_compare_report.rb +23 -0
  218. data/lib/expressir/eengine/modified_object.rb +21 -0
  219. data/lib/expressir/eengine.rb +9 -0
  220. data/lib/expressir/errors.rb +113 -0
  221. data/lib/expressir/express/adoc_hyperlink_formatter.rb +30 -0
  222. data/lib/expressir/express/adoc_source_formatter.rb +12 -0
  223. data/lib/expressir/express/ast_key_converter.rb +114 -0
  224. data/lib/expressir/express/builder.rb +277 -0
  225. data/lib/expressir/express/builder_context.rb +22 -0
  226. data/lib/expressir/express/builder_registry.rb +397 -0
  227. data/lib/expressir/express/builders/attribute_decl_builder.rb +32 -0
  228. data/lib/expressir/express/builders/built_in_builder.rb +75 -0
  229. data/lib/expressir/express/builders/constant_builder.rb +108 -0
  230. data/lib/expressir/express/builders/declaration_builder.rb +20 -0
  231. data/lib/expressir/express/builders/derive_clause_builder.rb +14 -0
  232. data/lib/expressir/express/builders/derived_attr_builder.rb +28 -0
  233. data/lib/expressir/express/builders/domain_rule_builder.rb +21 -0
  234. data/lib/expressir/express/builders/entity_decl_builder.rb +116 -0
  235. data/lib/expressir/express/builders/explicit_attr_builder.rb +49 -0
  236. data/lib/expressir/express/builders/expression_builder.rb +416 -0
  237. data/lib/expressir/express/builders/function_decl_builder.rb +86 -0
  238. data/lib/expressir/express/builders/helpers.rb +148 -0
  239. data/lib/expressir/express/builders/interface_builder.rb +151 -0
  240. data/lib/expressir/express/builders/inverse_attr_builder.rb +43 -0
  241. data/lib/expressir/express/builders/inverse_attr_type_builder.rb +30 -0
  242. data/lib/expressir/express/builders/inverse_clause_builder.rb +14 -0
  243. data/lib/expressir/express/builders/literal_builder.rb +93 -0
  244. data/lib/expressir/express/builders/procedure_decl_builder.rb +82 -0
  245. data/lib/expressir/express/builders/qualifier_builder.rb +102 -0
  246. data/lib/expressir/express/builders/reference_builder.rb +18 -0
  247. data/lib/expressir/express/builders/rule_decl_builder.rb +97 -0
  248. data/lib/expressir/express/builders/schema_body_decl_builder.rb +18 -0
  249. data/lib/expressir/express/builders/schema_decl_builder.rb +56 -0
  250. data/lib/expressir/express/builders/schema_version_builder.rb +34 -0
  251. data/lib/expressir/express/builders/simple_id_builder.rb +17 -0
  252. data/lib/expressir/express/builders/statement_builder.rb +243 -0
  253. data/lib/expressir/express/builders/subtype_constraint_builder.rb +166 -0
  254. data/lib/expressir/express/builders/syntax_builder.rb +30 -0
  255. data/lib/expressir/express/builders/type_builder.rb +238 -0
  256. data/lib/expressir/express/builders/type_decl_builder.rb +26 -0
  257. data/lib/expressir/express/builders/unique_clause_builder.rb +20 -0
  258. data/lib/expressir/express/builders/unique_rule_builder.rb +41 -0
  259. data/lib/expressir/express/builders/where_clause_builder.rb +20 -0
  260. data/lib/expressir/express/builders.rb +55 -0
  261. data/lib/expressir/express/cache.rb +43 -18
  262. data/lib/expressir/express/checker.rb +812 -0
  263. data/lib/expressir/express/concatenator.rb +79 -0
  264. data/lib/expressir/express/core.rb +95 -0
  265. data/lib/expressir/express/error.rb +124 -0
  266. data/lib/expressir/express/formatter.rb +89 -1548
  267. data/lib/expressir/express/formatters/data_types_formatter.rb +362 -0
  268. data/lib/expressir/express/formatters/declarations_formatter.rb +753 -0
  269. data/lib/expressir/express/formatters/expressions_formatter.rb +180 -0
  270. data/lib/expressir/express/formatters/literals_formatter.rb +55 -0
  271. data/lib/expressir/express/formatters/references_formatter.rb +53 -0
  272. data/lib/expressir/express/formatters/remark_formatter.rb +270 -0
  273. data/lib/expressir/express/formatters/remark_item_formatter.rb +28 -0
  274. data/lib/expressir/express/formatters/statements_formatter.rb +272 -0
  275. data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +54 -0
  276. data/lib/expressir/express/formatters.rb +22 -0
  277. data/lib/expressir/express/grammar/parser.rb +712 -0
  278. data/lib/expressir/express/grammar.rb +11 -0
  279. data/lib/expressir/express/hyperlink_formatter.rb +4 -5
  280. data/lib/expressir/express/interface_dot.rb +105 -0
  281. data/lib/expressir/express/lazy_repository.rb +211 -0
  282. data/lib/expressir/express/line_map.rb +48 -0
  283. data/lib/expressir/express/listing.rb +174 -0
  284. data/lib/expressir/express/model_traversal.rb +42 -0
  285. data/lib/expressir/express/model_visitor.rb +11 -10
  286. data/lib/expressir/express/node_position_index.rb +342 -0
  287. data/lib/expressir/express/parallel_files.rb +229 -0
  288. data/lib/expressir/express/parser.rb +501 -62
  289. data/lib/expressir/express/pretty_formatter.rb +586 -0
  290. data/lib/expressir/express/pretty_gate.rb +61 -0
  291. data/lib/expressir/express/refs_overlay.rb +47 -0
  292. data/lib/expressir/express/remark_attacher.rb +1098 -0
  293. data/lib/expressir/express/remark_overlay.rb +86 -0
  294. data/lib/expressir/express/remark_scanner.rb +245 -0
  295. data/lib/expressir/express/resolve_references_model_visitor.rb +7 -9
  296. data/lib/expressir/express/schema_block_scanner.rb +137 -0
  297. data/lib/expressir/express/schema_head_formatter.rb +4 -5
  298. data/lib/expressir/express/schema_plain_source_formatter.rb +11 -0
  299. data/lib/expressir/express/schema_source_formatter.rb +15 -0
  300. data/lib/expressir/express/scope_resolver.rb +223 -0
  301. data/lib/expressir/express/self_schema_reference.rb +126 -0
  302. data/lib/expressir/express/shtolo.rb +679 -0
  303. data/lib/expressir/express/smrl_xml.rb +125 -0
  304. data/lib/expressir/express/source_formatter.rb +15 -0
  305. data/lib/expressir/express/streaming_builder.rb +435 -0
  306. data/lib/expressir/express/xsd.rb +259 -0
  307. data/lib/expressir/express.rb +53 -0
  308. data/lib/expressir/liquid.rb +1 -0
  309. data/lib/expressir/manifest/resolver.rb +210 -0
  310. data/lib/expressir/manifest/validator.rb +192 -0
  311. data/lib/expressir/manifest.rb +6 -0
  312. data/lib/expressir/mapping/refpath.rb +857 -0
  313. data/lib/expressir/mapping.rb +253 -0
  314. data/lib/expressir/model/cache.rb +10 -9
  315. data/lib/expressir/model/concerns.rb +42 -0
  316. data/lib/expressir/model/data_types/aggregate.rb +8 -13
  317. data/lib/expressir/model/data_types/array.rb +15 -21
  318. data/lib/expressir/model/data_types/bag.rb +11 -15
  319. data/lib/expressir/model/data_types/binary.rb +9 -12
  320. data/lib/expressir/model/data_types/boolean.rb +7 -2
  321. data/lib/expressir/model/data_types/enumeration.rb +11 -15
  322. data/lib/expressir/model/data_types/enumeration_item.rb +5 -7
  323. data/lib/expressir/model/data_types/generic.rb +6 -8
  324. data/lib/expressir/model/data_types/generic_entity.rb +11 -13
  325. data/lib/expressir/model/data_types/integer.rb +7 -2
  326. data/lib/expressir/model/data_types/list.rb +13 -18
  327. data/lib/expressir/model/data_types/logical.rb +7 -2
  328. data/lib/expressir/model/data_types/number.rb +7 -2
  329. data/lib/expressir/model/data_types/real.rb +7 -9
  330. data/lib/expressir/model/data_types/select.rb +13 -18
  331. data/lib/expressir/model/data_types/set.rb +11 -15
  332. data/lib/expressir/model/data_types/string.rb +9 -12
  333. data/lib/expressir/model/data_types.rb +25 -0
  334. data/lib/expressir/model/declarations/attribute.rb +19 -28
  335. data/lib/expressir/model/declarations/constant.rb +10 -16
  336. data/lib/expressir/model/declarations/derived_attribute.rb +25 -0
  337. data/lib/expressir/model/declarations/entity.rb +39 -30
  338. data/lib/expressir/model/declarations/function.rb +32 -40
  339. data/lib/expressir/model/declarations/informal_proposition_rule.rb +25 -0
  340. data/lib/expressir/model/declarations/interface.rb +25 -16
  341. data/lib/expressir/model/declarations/interface_item.rb +9 -11
  342. data/lib/expressir/model/declarations/interfaced_item.rb +15 -19
  343. data/lib/expressir/model/declarations/inverse_attribute.rb +25 -0
  344. data/lib/expressir/model/declarations/parameter.rb +10 -16
  345. data/lib/expressir/model/declarations/procedure.rb +30 -37
  346. data/lib/expressir/model/declarations/remark_item.rb +11 -11
  347. data/lib/expressir/model/declarations/rule.rb +38 -43
  348. data/lib/expressir/model/declarations/schema.rb +162 -64
  349. data/lib/expressir/model/declarations/schema_version.rb +8 -11
  350. data/lib/expressir/model/declarations/schema_version_item.rb +8 -11
  351. data/lib/expressir/model/declarations/subtype_constraint.rb +14 -22
  352. data/lib/expressir/model/declarations/type.rb +18 -18
  353. data/lib/expressir/model/declarations/unique_rule.rb +8 -13
  354. data/lib/expressir/model/declarations/variable.rb +10 -16
  355. data/lib/expressir/model/declarations/where_rule.rb +8 -13
  356. data/lib/expressir/model/declarations.rb +31 -0
  357. data/lib/expressir/model/dependency_resolver.rb +268 -0
  358. data/lib/expressir/model/exp_file.rb +42 -0
  359. data/lib/expressir/model/expressions/aggregate_initializer.rb +8 -9
  360. data/lib/expressir/model/expressions/aggregate_initializer_item.rb +10 -12
  361. data/lib/expressir/model/expressions/binary_expression.rb +42 -36
  362. data/lib/expressir/model/expressions/entity_constructor.rb +10 -12
  363. data/lib/expressir/model/expressions/function_call.rb +10 -12
  364. data/lib/expressir/model/expressions/interval.rb +18 -23
  365. data/lib/expressir/model/expressions/query_expression.rb +11 -15
  366. data/lib/expressir/model/expressions/unary_expression.rb +13 -15
  367. data/lib/expressir/model/expressions.rb +18 -0
  368. data/lib/expressir/model/identifier.rb +18 -26
  369. data/lib/expressir/model/indexes/entity_index.rb +103 -0
  370. data/lib/expressir/model/indexes/item_graph.rb +185 -0
  371. data/lib/expressir/model/indexes/reference_index.rb +148 -0
  372. data/lib/expressir/model/indexes/type_index.rb +149 -0
  373. data/lib/expressir/model/indexes.rb +12 -0
  374. data/lib/expressir/model/interface_validator.rb +384 -0
  375. data/lib/expressir/model/literals/binary.rb +7 -9
  376. data/lib/expressir/model/literals/integer.rb +7 -9
  377. data/lib/expressir/model/literals/logical.rb +10 -12
  378. data/lib/expressir/model/literals/real.rb +7 -9
  379. data/lib/expressir/model/literals/string.rb +10 -12
  380. data/lib/expressir/model/literals.rb +13 -0
  381. data/lib/expressir/model/model_element.rb +286 -117
  382. data/lib/expressir/model/references/attribute_reference.rb +9 -12
  383. data/lib/expressir/model/references/group_reference.rb +9 -12
  384. data/lib/expressir/model/references/index_reference.rb +11 -15
  385. data/lib/expressir/model/references/simple_reference.rb +11 -14
  386. data/lib/expressir/model/references.rb +12 -0
  387. data/lib/expressir/model/remark_format.rb +17 -0
  388. data/lib/expressir/model/remark_info.rb +92 -0
  389. data/lib/expressir/model/remark_placement.rb +42 -0
  390. data/lib/expressir/model/repository.rb +472 -12
  391. data/lib/expressir/model/repository_validator.rb +293 -0
  392. data/lib/expressir/model/search_engine.rb +551 -0
  393. data/lib/expressir/model/statements/alias.rb +12 -16
  394. data/lib/expressir/model/statements/assignment.rb +12 -11
  395. data/lib/expressir/model/statements/case.rb +31 -14
  396. data/lib/expressir/model/statements/case_action.rb +9 -11
  397. data/lib/expressir/model/statements/compound.rb +10 -8
  398. data/lib/expressir/model/statements/escape.rb +10 -2
  399. data/lib/expressir/model/statements/if.rb +15 -14
  400. data/lib/expressir/model/statements/null.rb +10 -2
  401. data/lib/expressir/model/statements/procedure_call.rb +11 -11
  402. data/lib/expressir/model/statements/repeat.rb +21 -28
  403. data/lib/expressir/model/statements/return.rb +9 -8
  404. data/lib/expressir/model/statements/skip.rb +10 -2
  405. data/lib/expressir/model/statements.rb +20 -0
  406. data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +13 -17
  407. data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +7 -9
  408. data/lib/expressir/model/supertype_expressions.rb +12 -0
  409. data/lib/expressir/model.rb +38 -78
  410. data/lib/expressir/package/builder.rb +231 -0
  411. data/lib/expressir/package/metadata.rb +79 -0
  412. data/lib/expressir/package/reader.rb +149 -0
  413. data/lib/expressir/package.rb +8 -0
  414. data/lib/expressir/schema_manifest.rb +159 -0
  415. data/lib/expressir/schema_manifest_entry.rb +15 -0
  416. data/lib/expressir/version.rb +6 -1
  417. data/lib/expressir.rb +79 -9
  418. data/lib/tasks/verify_remarks.rake +16 -0
  419. data/rakelib/native.rake +24 -0
  420. data/rakelib/oracle.rake +52 -0
  421. data/rakelib/verify_remarks.rake +16 -0
  422. metadata +431 -129
  423. data/.cross_rubies +0 -20
  424. data/.gitmodules +0 -6
  425. data/.yardopts +0 -11
  426. data/docs/development.md +0 -90
  427. data/exe/format +0 -18
  428. data/exe/generate-parser +0 -51
  429. data/lib/expressir/cli/ui.rb +0 -36
  430. data/lib/expressir/express/2.7/express_parser.so +0 -0
  431. data/lib/expressir/express/3.0/express_parser.so +0 -0
  432. data/lib/expressir/express/3.1/express_parser.so +0 -0
  433. data/lib/expressir/express/3.2/express_parser.so +0 -0
  434. data/lib/expressir/express/visitor.rb +0 -2588
  435. data/lib/expressir/model/data_type.rb +0 -9
  436. data/lib/expressir/model/declaration.rb +0 -9
  437. data/lib/expressir/model/expression.rb +0 -9
  438. data/lib/expressir/model/literal.rb +0 -9
  439. data/lib/expressir/model/reference.rb +0 -9
  440. data/lib/expressir/model/statement.rb +0 -9
  441. data/lib/expressir/model/supertype_expression.rb +0 -9
  442. data/rakelib/antlr4-native.rake +0 -161
  443. data/rakelib/cross-ruby.rake +0 -368
  444. data/spec/acceptance/version_spec.rb +0 -27
  445. data/spec/expressir/express/cache_spec.rb +0 -89
  446. data/spec/expressir/express/formatter_spec.rb +0 -173
  447. data/spec/expressir/express/parser_spec.rb +0 -141
  448. data/spec/expressir/model/model_element_spec.rb +0 -318
  449. data/spec/spec_helper.rb +0 -24
  450. data/spec/support/console_helper.rb +0 -29
  451. data/spec/syntax/multiple.exp +0 -23
  452. data/spec/syntax/multiple.yaml +0 -198
  453. data/spec/syntax/multiple_formatted.exp +0 -71
  454. data/spec/syntax/multiple_hyperlink_formatted.exp +0 -71
  455. data/spec/syntax/multiple_schema_head_hyperlink_formatted.exp +0 -13
  456. data/spec/syntax/remark.exp +0 -193
  457. data/spec/syntax/remark.yaml +0 -471
  458. data/spec/syntax/remark_formatted.exp +0 -228
  459. data/spec/syntax/single.exp +0 -4
  460. data/spec/syntax/single.yaml +0 -18
  461. data/spec/syntax/single_formatted.exp +0 -10
  462. data/spec/syntax/single_formatted.yaml +0 -36
  463. data/spec/syntax/syntax.exp +0 -333
  464. data/spec/syntax/syntax.yaml +0 -3509
  465. data/spec/syntax/syntax_formatted.exp +0 -902
  466. data/spec/syntax/syntax_hyperlink_formatted.exp +0 -902
  467. data/spec/syntax/syntax_schema_head_formatted.exp +0 -18
@@ -0,0 +1,712 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "parsanol"
4
+
5
+ module Expressir
6
+ module Express
7
+ module Grammar
8
+ # EXPRESS grammar definition: ~250 Parsanol rules implementing
9
+ # ISO 10303-11 concrete syntax.
10
+ #
11
+ # Extracted from the outer Parser class so grammar changes land in
12
+ # one focused file, separate from the I/O orchestration on the
13
+ # Parser facade (lib/expressir/express/parser.rb).
14
+ class Parser < Parsanol::Parser
15
+ root(:syntax)
16
+
17
+ # Class instance variables for caching (not @@ class variables,
18
+ # which are shared across the entire hierarchy). These are scoped
19
+ # to this class only. Accessed via @var within class methods.
20
+ @cached_grammar_json = nil
21
+ @cached_grammar_atom_id = nil
22
+ @cached_parser = nil
23
+ @parser_mutex = Mutex.new
24
+ @cached_schema_grammar_json = nil
25
+
26
+ # Threshold for using memory-bounded fresh parse (bytes)
27
+ # Files above this use parse_fresh which has no packrat cache
28
+ LARGE_FILE_THRESHOLD = 1024 * 1024 # 1 MB
29
+
30
+ # Get cached parser instance (thread-safe)
31
+ # Reusing the parser avoids the overhead of reinitializing all rule definitions
32
+ def self.cached_parser
33
+ return @cached_parser if @cached_parser
34
+
35
+ @parser_mutex.synchronize do
36
+ @cached_parser ||= new
37
+ end
38
+ end
39
+
40
+ # Clear the cached parser (useful for testing or after grammar changes)
41
+ def self.clear_parser_cache
42
+ @parser_mutex.synchronize do
43
+ @cached_parser = nil
44
+ end
45
+ end
46
+
47
+ # Check if native parsing is available
48
+ def self.native_available?
49
+ return @native_available unless @native_available.nil?
50
+
51
+ @native_available = begin
52
+ require "parsanol/native"
53
+ Parsanol::Native.available?
54
+ rescue LoadError
55
+ false
56
+ end
57
+ end
58
+
59
+ # Get cached grammar JSON for native parsing
60
+ def self.cached_grammar_json
61
+ return @cached_grammar_json if @cached_grammar_json
62
+
63
+ parser = new
64
+ atom = parser.syntax
65
+
66
+ # Cache by atom object_id
67
+ if atom.object_id != @cached_grammar_atom_id
68
+ @cached_grammar_atom_id = atom.object_id
69
+ @cached_grammar_json = Parsanol::Native.serialize_grammar(atom)
70
+ end
71
+
72
+ @cached_grammar_json
73
+ end
74
+
75
+ # Get cached grammar JSON for schemaDecl (used for streaming parse)
76
+ def self.cached_schema_grammar_json
77
+ return @cached_schema_grammar_json if @cached_schema_grammar_json
78
+
79
+ schema_atom = cached_parser.schemaDecl
80
+ @cached_schema_grammar_json = Parsanol::Native.serialize_grammar(schema_atom)
81
+ @cached_schema_grammar_json
82
+ end
83
+
84
+ # Parse using native engine with Rust-side transformation (fastest)
85
+ #
86
+ # This method provides ~17x speedup over pure Ruby parsing.
87
+ # The transformation happens in Rust using to_parslet_compatible,
88
+ # producing Parslet-compatible output that Builder.build can consume directly.
89
+ #
90
+ # @param source [String] EXPRESS source code to parse
91
+ # @return [Hash, Array] Transformed AST in Parslet-compatible format
92
+ # @raise [LoadError] If native parser is not available
93
+ def self.parse_native(source)
94
+ unless native_available?
95
+ raise LoadError, "Native parser not available"
96
+ end
97
+
98
+ grammar_atom = cached_parser.syntax
99
+ # Use fresh-parse (no cache) for large files to bound memory
100
+ if source.bytesize > LARGE_FILE_THRESHOLD
101
+ Parsanol::Native.parse_fresh(grammar_atom, source)
102
+ else
103
+ Parsanol::Native.parse(grammar_atom, source)
104
+ end
105
+ end
106
+
107
+ def cts(atom)
108
+ spaces >> atom
109
+ end
110
+
111
+ def cstr(atom)
112
+ cts(str(atom).as(:str))
113
+ end
114
+
115
+ KEYWORDS = %i[
116
+ ABS ABSTRACT ACOS AGGREGATE ALIAS AND ANDOR ARRAY AS ASIN ATAN BAG BASED_ON
117
+ BEGIN BINARY BLENGTH BOOLEAN BY CASE CONSTANT CONST_E COS DERIVE DIV ELSE
118
+ END END_ALIAS END_CASE END_CONSTANT END_ENTITY END_FUNCTION END_IF
119
+ END_LOCAL END_PROCEDURE END_REPEAT END_RULE END_SCHEMA
120
+ END_SUBTYPE_CONSTRAINT END_TYPE ENTITY ENUMERATION ESCAPE EXISTS EXP
121
+ EXTENSIBLE FALSE FIXED FOR FORMAT FROM FUNCTION GENERIC GENERIC_ENTITY
122
+ HIBOUND HIINDEX IF IN INSERT INTEGER INVERSE LENGTH LIKE LIST LOBOUND LOCAL
123
+ LOG LOG10 LOG2 LOGICAL LOINDEX MOD NOT NUMBER NVL ODD OF ONEOF OPTIONAL OR
124
+ OTHERWISE PI PROCEDURE QUERY REAL REFERENCE REMOVE RENAMED REPEAT RETURN
125
+ ROLESOF RULE SCHEMA SELECT SELF SET SIN SIZEOF SKIP SQRT STRING SUBTYPE
126
+ SUBTYPE_CONSTRAINT SUPERTYPE TAN THEN TO TRUE TYPE TYPEOF TOTAL_OVER UNIQUE
127
+ UNKNOWN UNTIL USE USEDIN VALUE VALUE_IN VALUE_UNIQUE VAR WITH WHERE WHILE
128
+ XOR
129
+ ].freeze
130
+
131
+ def keyword_rule(str)
132
+ key_chars = str.to_s.chars
133
+ key_chars
134
+ .collect! { |char| match("[#{char}#{char.downcase}]") }
135
+ .reduce(:>>) >> match["a-zA-Z0-9_"].absent?
136
+ end
137
+
138
+ KEYWORDS.each do |keyword|
139
+ sym = :"t#{keyword}"
140
+ rule(sym) { cts(keyword_rule(keyword).as(:str)).as(sym) }
141
+ end
142
+
143
+ rule(:abstractEntityDeclaration) do
144
+ tABSTRACT.as(:abstractEntityDeclaration)
145
+ end
146
+ rule(:abstractSupertypeDeclaration) do
147
+ (tABSTRACT >> tSUPERTYPE >> subtypeConstraint.maybe).as(:abstractSupertypeDeclaration)
148
+ end
149
+ # ISO 10303-11 abstract_supertype_constraint = ABSTRACT ';' —
150
+ # tolerated nonstandard variant: ABSTRACT SUPERTYPE ';' (real
151
+ # corpora ship it; longest-first so PEG stays deterministic).
152
+ # The entity-header forms live in abstractSupertypeDeclaration.
153
+ rule(:abstractSupertype) do
154
+ (
155
+ (tABSTRACT >> tSUPERTYPE >> op_delim) |
156
+ (tABSTRACT >> op_delim)
157
+ ).as(:abstractSupertype)
158
+ end
159
+ rule(:actualParameterList) do
160
+ (op_leftparen >> (parameter >> (op_comma >> parameter).repeat).as(:listOf_parameter).maybe >> op_rightparen)
161
+ .as(:actualParameterList)
162
+ end
163
+ rule(:addLikeOp) { (op_plus | op_minus | tOR | tXOR).as(:addLikeOp) }
164
+ rule(:aggregateInitializer) do
165
+ (op_leftbracket >> (element >> (op_comma >> element).repeat).as(:listOf_element).maybe >> op_rightbracket)
166
+ .as(:aggregateInitializer)
167
+ end
168
+ rule(:aggregateSource) { simpleExpression.as(:aggregateSource) }
169
+ rule(:aggregateType) do
170
+ (tAGGREGATE >> (op_colon >> typeLabel).maybe >> tOF >> parameterType).as(:aggregateType)
171
+ end
172
+ rule(:aggregationTypes) do
173
+ (arrayType | bagType | listType | setType).as(:aggregationTypes)
174
+ end
175
+ rule(:algorithmHead) do
176
+ (declaration.repeat.as(:declaration) >> constantDecl.maybe >> localDecl.maybe).as(:algorithmHead)
177
+ end
178
+ rule(:aliasStmt) do
179
+ (tALIAS >> variableId >> tFOR >> generalRef >> qualifier.repeat.as(:qualifier) >>
180
+ op_delim >> stmt.repeat(1).as(:stmt) >> tEND_ALIAS >> op_delim.as(:op_delim2)).as(:aliasStmt)
181
+ end
182
+ rule(:anyKeyword) { KEYWORDS.map { |kw| send("t#{kw}") }.inject(:|) }
183
+ rule(:arrayType) do
184
+ (tARRAY >> boundSpec >> tOF >> tOPTIONAL.maybe >> tUNIQUE.maybe >> instantiableType).as(:arrayType)
185
+ end
186
+ rule(:assignmentStmt) do
187
+ (generalRef >> qualifier.repeat.as(:qualifier) >> op_decl >> expression >> op_delim).as(:assignmentStmt)
188
+ end
189
+ rule(:attributeDecl) do
190
+ (attributeId | redeclaredAttribute).as(:attributeDecl)
191
+ end
192
+ rule(:attributeId) { simpleId.as(:attributeId) }
193
+ rule(:attributeQualifier) do
194
+ (op_period >> attributeRef).as(:attributeQualifier)
195
+ end
196
+ rule(:attributeRef) { attributeId.as(:attributeRef) }
197
+ rule(:bagType) do
198
+ (tBAG >> boundSpec.maybe >> tOF >> instantiableType).as(:bagType)
199
+ end
200
+ rule(:binaryLiteral) do
201
+ cts((str("%") >> bit.repeat(1)).as(:str)).as(:binaryLiteral)
202
+ end
203
+ rule(:binaryType) { (tBINARY >> widthSpec.maybe).as(:binaryType) }
204
+ rule(:bit) { match["0-1"] }
205
+ rule(:booleanType) { tBOOLEAN.as(:booleanType) }
206
+ rule(:bound1) { numericExpression.as(:bound1) }
207
+ rule(:bound2) { numericExpression.as(:bound2) }
208
+ rule(:boundSpec) do
209
+ (op_leftbracket >> bound1 >> op_colon >> bound2 >> op_rightbracket).as(:boundSpec)
210
+ end
211
+ rule(:builtInConstant) do
212
+ (tCONST_E | tPI | tSELF | op_question_mark).as(:builtInConstant)
213
+ end
214
+ rule(:builtInFunction) do
215
+ (tABS | tACOS | tASIN | tATAN | tBLENGTH | tCOS | tEXISTS | tEXP | tFORMAT | tHIBOUND | tHIINDEX | tLENGTH |
216
+ tLOBOUND | tLOINDEX | tLOG2 | tLOG10 | tLOG | tNVL | tODD | tROLESOF | tSIN | tSIZEOF | tSQRT | tTAN |
217
+ tTYPEOF | tUSEDIN | tVALUE_IN | tVALUE_UNIQUE | tVALUE).as(:builtInFunction)
218
+ end
219
+ rule(:builtInProcedure) { (tINSERT | tREMOVE).as(:builtInProcedure) }
220
+ rule(:caseAction) do
221
+ ((caseLabel >> (op_comma >> caseLabel).repeat).as(:listOf_caseLabel) >> op_colon >> stmt).as(:caseAction)
222
+ end
223
+ rule(:caseLabel) { expression.as(:caseLabel) }
224
+ rule(:caseStmt) do
225
+ (tCASE >> selector >> tOF >> caseAction.repeat.as(:caseAction) >> (tOTHERWISE >> op_colon >> stmt).maybe >> tEND_CASE >> op_delim).as(:caseStmt)
226
+ end
227
+ rule(:compoundStmt) do
228
+ (tBEGIN >> stmt.repeat(1).as(:stmt) >> tEND >> op_delim).as(:compoundStmt)
229
+ end
230
+ rule(:concreteTypes) do
231
+ (aggregationTypes | simpleTypes | typeRef).as(:concreteTypes)
232
+ end
233
+ rule(:constantBody) do
234
+ (constantId >> op_colon >> instantiableType >> op_decl >> expression >> op_delim).as(:constantBody)
235
+ end
236
+ rule(:constantDecl) do
237
+ (tCONSTANT >> constantBody.repeat(1).as(:constantBody) >> tEND_CONSTANT >> op_delim).as(:constantDecl)
238
+ end
239
+ rule(:constantFactor) do
240
+ (builtInConstant | constantRef).as(:constantFactor)
241
+ end
242
+ rule(:constantId) { simpleId.as(:constantId) }
243
+ rule(:constantRef) { constantId.as(:constantRef) }
244
+ rule(:constructedTypes) do
245
+ (enumerationType | selectType).as(:constructedTypes)
246
+ end
247
+ rule(:declaration) do
248
+ (entityDecl | functionDecl | procedureDecl | subtypeConstraintDecl | typeDecl).as(:declaration)
249
+ end
250
+ rule(:delim) { cts(str(";").as(:delim)) }
251
+ rule(:deriveClause) do
252
+ (tDERIVE >> derivedAttr.repeat(1).as(:derivedAttr)).as(:deriveClause)
253
+ end
254
+ rule(:derivedAttr) do
255
+ (attributeDecl >> op_colon >> parameterType >> op_decl >> expression >> op_delim).as(:derivedAttr)
256
+ end
257
+ rule(:digit) { match["0-9"] }
258
+ rule(:digits) { digit >> digit.repeat }
259
+ rule(:domainRule) do
260
+ ((ruleLabelId >> op_colon).maybe >> expression).as(:domainRule)
261
+ end
262
+ rule(:element) do
263
+ (expression >> (op_colon >> repetition).maybe).as(:element)
264
+ end
265
+ rule(:embeddedRemark) do
266
+ (
267
+ # `(*)` is a 3-character empty embedded remark: the opener `(*`
268
+ # and closer `*)` share the `*`. Per strict ISO 10303-11 §7.1.6
269
+ # grammar the opener and closer are distinct tokens and cannot
270
+ # share characters, so `(*)` is technically invalid. We accept
271
+ # it for robustness (issue #126).
272
+ str("(*)") |
273
+ (str("(*") >> (str("*)").absent? >> (embeddedRemark | any)).repeat >> str("*)"))
274
+ ).as(:embeddedRemark)
275
+ end
276
+ rule(:encodedCharacter) { octet >> octet >> octet >> octet }
277
+ rule(:encodedStringLiteral) do
278
+ cts((str('"') >> encodedCharacter.repeat(1) >> str('"')).as(:str)).as(:encodedStringLiteral)
279
+ end
280
+ rule(:entityBody) do
281
+ (explicitAttr.repeat.as(:explicitAttr) >> deriveClause.maybe >> inverseClause.maybe >> uniqueClause.maybe >> whereClause.maybe).as(:entityBody)
282
+ end
283
+ rule(:entityConstructor) do
284
+ (entityRef >> op_leftparen >> (expression >> (op_comma >> expression).repeat).as(:listOf_expression).maybe >> op_rightparen).as(:entityConstructor)
285
+ end
286
+ rule(:entityDecl) do
287
+ (entityHead >> entityBody >> tEND_ENTITY >> op_delim).as(:entityDecl)
288
+ end
289
+ rule(:entityHead) do
290
+ (tENTITY >> entityId >> subsuper >> op_delim).as(:entityHead)
291
+ end
292
+ rule(:entityId) { simpleId.as(:entityId) }
293
+ rule(:entityRef) { entityId.as(:entityRef) }
294
+ rule(:enumerationExtension) do
295
+ (tBASED_ON >> typeRef >> (tWITH >> enumerationItems).maybe).as(:enumerationExtension)
296
+ end
297
+ rule(:enumerationId) { simpleId.as(:enumerationId) }
298
+ rule(:enumerationItem) { enumerationId.as(:enumerationItem) }
299
+ rule(:enumerationItems) do
300
+ (op_leftparen >> (enumerationItem >> (op_comma >> enumerationItem).repeat).as(:listOf_enumerationItem) >> op_rightparen).as(:enumerationItems)
301
+ end
302
+ rule(:enumerationRef) { enumerationId.as(:enumerationRef) }
303
+ rule(:enumerationReference) do
304
+ ((typeRef >> op_period).maybe >> enumerationRef).as(:enumerationReference)
305
+ end
306
+ rule(:enumerationType) do
307
+ (tEXTENSIBLE.maybe >> tENUMERATION >> ((tOF >> enumerationItems) | enumerationExtension).maybe).as(:enumerationType)
308
+ end
309
+ rule(:escapeStmt) { (tESCAPE >> op_delim).as(:escapeStmt) }
310
+ rule(:explicitAttr) do
311
+ ((attributeDecl >> (op_comma >> attributeDecl).repeat).as(:listOf_attributeDecl) >> op_colon >>
312
+ tOPTIONAL.maybe >> parameterType >> op_delim).as(:explicitAttr)
313
+ end
314
+ rule(:expression) do
315
+ (simpleExpression >> (relOpExtended >> simpleExpression.as(:rhs)).maybe).as(:expression)
316
+ end
317
+ rule(:factor) do
318
+ (simpleFactor >> (op_double_asterisk >> simpleFactor.as(:rhs)).maybe).as(:factor)
319
+ end
320
+ rule(:formalParameter) do
321
+ ((parameterId >> (op_comma >> parameterId).repeat).as(:listOf_parameterId) >> op_colon >> parameterType).as(:formalParameter)
322
+ end
323
+ rule(:functionCall) do
324
+ ((builtInFunction | functionRef) >> actualParameterList.maybe).as(:functionCall)
325
+ end
326
+ rule(:functionDecl) do
327
+ (functionHead >> algorithmHead >> stmt.repeat(1).as(:stmt) >> tEND_FUNCTION >> op_delim).as(:functionDecl)
328
+ end
329
+ rule(:functionHead) do
330
+ (tFUNCTION >> functionId >>
331
+ (op_leftparen >> (formalParameter >> (op_delim >> formalParameter).repeat).as(:listOf_formalParameter) >> op_rightparen).maybe >>
332
+ op_colon >> parameterType >> op_delim.as(:op_delim2)).as(:functionHead)
333
+ end
334
+ rule(:functionId) { simpleId.as(:functionId) }
335
+ rule(:functionRef) { functionId.as(:functionRef) }
336
+ rule(:generalAggregationTypes) do
337
+ (generalArrayType | generalBagType | generalListType | generalSetType).as(:generalAggregationTypes)
338
+ end
339
+ rule(:generalArrayType) do
340
+ (tARRAY >> boundSpec.maybe >> tOF >> tOPTIONAL.maybe >> tUNIQUE.maybe >> parameterType).as(:generalArrayType)
341
+ end
342
+ rule(:generalBagType) do
343
+ (tBAG >> boundSpec.maybe >> tOF >> parameterType).as(:generalBagType)
344
+ end
345
+ rule(:generalizedTypes) do
346
+ (aggregateType | generalAggregationTypes | genericEntityType | genericType).as(:generalizedTypes)
347
+ end
348
+ rule(:generalListType) do
349
+ (tLIST >> boundSpec.maybe >> tOF >> tUNIQUE.maybe >> parameterType).as(:generalListType)
350
+ end
351
+ rule(:generalRef) { (parameterRef | variableId).as(:generalRef) }
352
+ rule(:generalSetType) do
353
+ (tSET >> boundSpec.maybe >> tOF >> parameterType).as(:generalSetType)
354
+ end
355
+ rule(:genericEntityType) do
356
+ (tGENERIC_ENTITY >> (op_colon >> typeLabel).maybe).as(:genericEntityType)
357
+ end
358
+ rule(:genericType) do
359
+ (tGENERIC >> (op_colon >> typeLabel).maybe).as(:genericType)
360
+ end
361
+ rule(:groupQualifier) do
362
+ (op_double_backslash >> entityRef).as(:groupQualifier)
363
+ end
364
+ rule(:hexDigit) { match["0-9a-fA-F"] }
365
+ rule(:ifStmtElseStatements) do
366
+ stmt.repeat(1).as(:stmt).as(:ifStmtElseStatements)
367
+ end
368
+ rule(:ifStmtStatements) do
369
+ stmt.repeat(1).as(:stmt).as(:ifStmtStatements)
370
+ end
371
+ rule(:ifStmt) do
372
+ (tIF >> logicalExpression >> tTHEN >> ifStmtStatements >> (tELSE >> ifStmtElseStatements).maybe >> tEND_IF >> op_delim).as(:ifStmt)
373
+ end
374
+ rule(:incrementControl) do
375
+ (variableId >> op_decl >> bound1 >> tTO >> bound2 >> (tBY >> increment).maybe).as(:incrementControl)
376
+ end
377
+ rule(:increment) { numericExpression.as(:increment) }
378
+ rule(:index1) { index.as(:index1) }
379
+ rule(:index2) { index.as(:index2) }
380
+ rule(:index) { numericExpression.as(:index) }
381
+ rule(:indexQualifier) do
382
+ (op_leftbracket >> index1 >> (op_colon >> index2).maybe >> op_rightbracket).as(:indexQualifier)
383
+ end
384
+ rule(:instantiableType) do
385
+ (concreteTypes | entityRef).as(:instantiableType)
386
+ end
387
+ rule(:integerLiteral) { cts(digits.as(:str)).as(:integerLiteral) }
388
+ rule(:integerType) { tINTEGER.as(:integerType) }
389
+ rule(:interfaceSpecification) do
390
+ (referenceClause | useClause).as(:interfaceSpecification)
391
+ end
392
+ rule(:intervalHigh) { simpleExpression.as(:intervalHigh) }
393
+ rule(:intervalItem) { simpleExpression.as(:intervalItem) }
394
+ rule(:intervalLow) { simpleExpression.as(:intervalLow) }
395
+ rule(:interval) do
396
+ (op_left_curly_brace >> intervalLow >> intervalOp >> intervalItem >> intervalOp.as(:intervalOp2) >>
397
+ intervalHigh >> op_right_curly_brace).as(:interval)
398
+ end
399
+ rule(:intervalOp) { (op_less_equal | op_less_than).as(:intervalOp) }
400
+ rule(:inverseAttr) do
401
+ (attributeDecl >> op_colon >> inverseAttrType >> tFOR >> (entityRef >> op_period).maybe >> attributeRef >> op_delim).as(:inverseAttr)
402
+ end
403
+ rule(:inverseAttrType) do
404
+ (((tSET | tBAG) >> boundSpec.maybe >> tOF).maybe >> entityRef).as(:inverseAttrType)
405
+ end
406
+ rule(:inverseClause) do
407
+ (tINVERSE >> inverseAttr.repeat(1).as(:inverseAttr)).as(:inverseClause)
408
+ end
409
+ rule(:letter) { match["a-zA-Z"] }
410
+ rule(:listType) do
411
+ (tLIST >> boundSpec.maybe >> tOF >> tUNIQUE.maybe >> instantiableType).as(:listType)
412
+ end
413
+ rule(:literal) do
414
+ (binaryLiteral | logicalLiteral | realLiteral | integerLiteral | stringLiteral).as(:literal)
415
+ end
416
+ rule(:localDecl) do
417
+ (tLOCAL >> localVariable.repeat(1).as(:localVariable) >> tEND_LOCAL >> op_delim).as(:localDecl)
418
+ end
419
+ rule(:localVariable) do
420
+ ((variableId >> (op_comma >> variableId).repeat).as(:listOf_variableId) >>
421
+ op_colon >> parameterType >>
422
+ (op_decl >> expression).maybe >> op_delim).as(:localVariable)
423
+ end
424
+ rule(:logicalExpression) { expression.as(:logicalExpression) }
425
+ rule(:logicalLiteral) do
426
+ (tFALSE | tTRUE | tUNKNOWN).as(:logicalLiteral)
427
+ end
428
+ rule(:logicalType) { tLOGICAL.as(:logicalType) }
429
+ rule(:multiplicationLikeOp) do
430
+ (op_asterisk | op_slash | tDIV | tMOD | tAND | op_double_pipe).as(:multiplicationLikeOp)
431
+ end
432
+ rule(:namedTypeOrRename) do
433
+ (namedTypes >> (tAS >> (entityId | typeId)).maybe).as(:namedTypeOrRename)
434
+ end
435
+ rule(:namedTypes) { (entityRef | typeRef).as(:namedTypes) }
436
+ rule(:nullStmt) { op_delim.as(:nullStmt) }
437
+ rule(:numberType) { tNUMBER.as(:numberType) }
438
+ rule(:numericExpression) { simpleExpression.as(:numericExpression) }
439
+ rule(:octet) { hexDigit >> hexDigit }
440
+ rule(:oneOf) do
441
+ (tONEOF >> op_leftparen >> (supertypeExpression >>
442
+ (op_comma >> supertypeExpression).repeat).as(:listOf_supertypeExpression) >> op_rightparen).as(:oneOf)
443
+ end
444
+ rule(:op_asterisk) { cstr("*").as(:op_asterisk) }
445
+ rule(:op_colon) { cstr(":").as(:op_colon) }
446
+ rule(:op_colon_equals_colon) { cstr(":=:").as(:op_colon_equals_colon) }
447
+ rule(:op_colon_less_greater_colon) do
448
+ cstr(":<>:").as(:op_colon_less_greater_colon)
449
+ end
450
+ rule(:op_comma) { cstr(",").as(:op_comma) }
451
+ rule(:op_decl) { cstr(":=").as(:op_decl) }
452
+ rule(:op_delim) { cstr(";").as(:op_delim) }
453
+ rule(:op_double_asterisk) { cstr("**").as(:op_double_asterisk) }
454
+ rule(:op_double_backslash) { cstr("\\").as(:op_double_backslash) }
455
+ rule(:op_double_pipe) { cstr("||").as(:op_double_pipe) }
456
+ rule(:op_equals) { cstr("=").as(:op_equals) }
457
+ rule(:op_greater_equal) { cstr(">=").as(:op_greater_equal) }
458
+ rule(:op_greater_than) { cstr(">").as(:op_greater_than) }
459
+ rule(:op_leftbracket) { cstr("[").as(:op_leftbracket) }
460
+ rule(:op_left_curly_brace) { cstr("{").as(:op_left_curly_brace) }
461
+ rule(:op_leftparen) { cstr("(").as(:op_leftparen) }
462
+ rule(:op_less_equal) { cstr("<=").as(:op_less_equal) }
463
+ rule(:op_less_greater) { cstr("<>").as(:op_less_greater) }
464
+ rule(:op_less_than) { cstr("<").as(:op_less_than) }
465
+ rule(:op_minus) { cstr("-").as(:op_minus) }
466
+ rule(:op_period) { cstr(".").as(:op_period) }
467
+ rule(:op_pipe) { cstr("|").as(:op_pipe) }
468
+ rule(:op_plus) { cstr("+").as(:op_plus) }
469
+ rule(:op_query_begin) { cstr("<*").as(:op_query_begin) }
470
+ rule(:op_query_end) { cstr("*>").as(:op_query_end) }
471
+ rule(:op_question_mark) { cstr("?").as(:op_question_mark) }
472
+ rule(:op_rightbracket) { cstr("]").as(:op_rightbracket) }
473
+ rule(:op_right_curly_brace) { cstr("}").as(:op_right_curly_brace) }
474
+ rule(:op_rightparen) { cstr(")").as(:op_rightparen) }
475
+ rule(:op_slash) { cstr("/").as(:op_slash) }
476
+ rule(:parameter) { expression.as(:parameter) }
477
+ rule(:parameterId) { simpleId.as(:parameterId) }
478
+ rule(:parameterRef) { parameterId.as(:parameterRef) }
479
+ rule(:parameterType) do
480
+ (generalizedTypes | namedTypes | simpleTypes).as(:parameterType)
481
+ end
482
+ rule(:population) { entityRef.as(:population) }
483
+ rule(:precisionSpec) { numericExpression.as(:precisionSpec) }
484
+ rule(:primary) do
485
+ (literal | (qualifiableFactor >> qualifier.repeat.as(:qualifier))).as(:primary)
486
+ end
487
+ rule(:procedureCallStmt) do
488
+ ((builtInProcedure | procedureRef) >> actualParameterList.maybe >> op_delim).as(:procedureCallStmt)
489
+ end
490
+ rule(:procedureDecl) do
491
+ (procedureHead >> algorithmHead >> stmt.repeat.as(:stmt) >> tEND_PROCEDURE >> op_delim).as(:procedureDecl)
492
+ end
493
+ rule(:procedureHeadParameter) do
494
+ (tVAR.maybe >> formalParameter).as(:procedureHeadParameter)
495
+ end
496
+ rule(:procedureHead) do
497
+ (tPROCEDURE >> procedureId >>
498
+ (op_leftparen >> (procedureHeadParameter >>
499
+ (op_delim >> procedureHeadParameter).repeat).as(:listOf_procedureHeadParameter) >> op_rightparen).maybe >> op_delim.as(:op_delim2)).as(:procedureHead)
500
+ end
501
+ rule(:procedureId) { simpleId.as(:procedureId) }
502
+ rule(:procedureRef) { procedureId.as(:procedureRef) }
503
+ rule(:qualifiableFactor) do
504
+ (functionCall | attributeRef | constantFactor | generalRef | population).as(:qualifiableFactor)
505
+ end
506
+ rule(:qualifiedAttribute) do
507
+ (tSELF >> groupQualifier >> attributeQualifier).as(:qualifiedAttribute)
508
+ end
509
+ rule(:qualifier) do
510
+ (attributeQualifier | groupQualifier | indexQualifier).as(:qualifier)
511
+ end
512
+ rule(:queryExpression) do
513
+ (tQUERY >> op_leftparen >> variableId >> op_query_begin >> aggregateSource >> op_pipe >> logicalExpression >> op_rightparen).as(:queryExpression)
514
+ end
515
+ rule(:realLiteral) do
516
+ cts((digits >> str(".") >> digits.maybe >> (match["eE"] >> sign.maybe >> digits).maybe).as(:str)).as(:realLiteral)
517
+ end
518
+ rule(:realType) do
519
+ (tREAL >> (op_leftparen >> precisionSpec >> op_rightparen).maybe).as(:realType)
520
+ end
521
+ rule(:redeclaredAttribute) do
522
+ (qualifiedAttribute >> (tRENAMED >> attributeId).maybe).as(:redeclaredAttribute)
523
+ end
524
+ rule(:referenceClause) do
525
+ (tREFERENCE >> tFROM >> schemaRef >>
526
+ (op_leftparen >> (resourceOrRename >> (op_comma >> resourceOrRename).repeat).as(:listOf_resourceOrRename) >> op_rightparen).maybe >> op_delim).as(:referenceClause)
527
+ end
528
+ rule(:referencedAttribute) do
529
+ (attributeRef | qualifiedAttribute).as(:referencedAttribute)
530
+ end
531
+ rule(:relOpExtended) { (relOp | tIN | tLIKE).as(:relOpExtended) }
532
+ rule(:relOp) do
533
+ (op_less_equal | op_greater_equal | op_less_greater | op_less_than | op_greater_than | op_equals |
534
+ op_colon_less_greater_colon | op_colon_equals_colon).as(:relOp)
535
+ end
536
+ rule(:renameId) do
537
+ (constantId | entityId | functionId | procedureId | typeId).as(:renameId)
538
+ end
539
+ rule(:repeatControl) do
540
+ (incrementControl.maybe >> whileControl.maybe >> untilControl.maybe).as(:repeatControl)
541
+ end
542
+ rule(:repeatStmt) do
543
+ (tREPEAT >> repeatControl >> op_delim >> stmt.repeat(1).as(:stmt) >> tEND_REPEAT >> op_delim.as(:op_delim2)).as(:repeatStmt)
544
+ end
545
+ rule(:repetition) { numericExpression.as(:repetition) }
546
+ rule(:resourceOrRename) do
547
+ (resourceRef >> (tAS >> renameId).maybe).as(:resourceOrRename)
548
+ end
549
+ rule(:resourceRef) do
550
+ (constantRef | entityRef | functionRef | procedureRef | typeRef).as(:resourceRef)
551
+ end
552
+ rule(:returnStmt) do
553
+ (tRETURN >> (op_leftparen >> expression >> op_rightparen).maybe >> op_delim).as(:returnStmt)
554
+ end
555
+ rule(:ruleDecl) do
556
+ (ruleHead >> algorithmHead >> stmt.repeat.as(:stmt) >> whereClause >> tEND_RULE >> op_delim).as(:ruleDecl)
557
+ end
558
+ rule(:ruleHead) do
559
+ (tRULE >> ruleId >> tFOR >> op_leftparen >>
560
+ (entityRef >> (op_comma >> entityRef).repeat).as(:listOf_entityRef) >> op_rightparen >> op_delim).as(:ruleHead)
561
+ end
562
+ rule(:ruleId) { simpleId.as(:ruleId) }
563
+ rule(:ruleLabelId) { simpleId.as(:ruleLabelId) }
564
+ rule(:ruleLabelRef) { ruleLabelId.as(:ruleLabelRef) }
565
+ rule(:ruleRef) { ruleId.as(:ruleRef) }
566
+ rule(:schemaBodyDeclaration) do
567
+ (declaration | ruleDecl).as(:schemaBodyDeclaration)
568
+ end
569
+ rule(:schemaBody) do
570
+ (interfaceSpecification.repeat.as(:interfaceSpecification) >> constantDecl.maybe >>
571
+ schemaBodyDeclaration.repeat.as(:schemaBodyDeclaration)).as(:schemaBody)
572
+ end
573
+ rule(:schemaDecl) do
574
+ (tSCHEMA >> schemaId >> schemaVersionId.maybe >> op_delim >> schemaBody >> tEND_SCHEMA >> op_delim.as(:op_delim2)).as(:schemaDecl)
575
+ end
576
+ rule(:schemaId) { simpleId.as(:schemaId) }
577
+ rule(:schemaRef) { schemaId.as(:schemaRef) }
578
+ rule(:schemaVersionId) { stringLiteral.as(:schemaVersionId) }
579
+ rule(:selectExtension) do
580
+ (tBASED_ON >> typeRef >> (tWITH >> selectList).maybe).as(:selectExtension)
581
+ end
582
+ rule(:selectList) do
583
+ (op_leftparen >> (namedTypes >> (op_comma >> namedTypes).repeat).as(:listOf_namedTypes) >> op_rightparen).as(:selectList)
584
+ end
585
+ rule(:selector) { expression.as(:selector) }
586
+ rule(:selectType) do
587
+ ((tEXTENSIBLE >> tGENERIC_ENTITY.maybe).maybe >> tSELECT >> (selectList | selectExtension).maybe).as(:selectType)
588
+ end
589
+ rule(:setType) do
590
+ (tSET >> boundSpec.maybe >> tOF >> instantiableType).as(:setType)
591
+ end
592
+ rule(:sign) { match["+-"] }
593
+ rule(:simpleExpression) do
594
+ (term >> (addLikeOp.as(:operator) >> term).as(:item).repeat.as(:rhs)).as(:simpleExpression)
595
+ end
596
+ rule(:simpleFactor) do
597
+ (simpleFactorExpression | aggregateInitializer | entityConstructor | interval | queryExpression | stringLiteral |
598
+ simpleFactorUnaryExpression | enumerationReference).as(:simpleFactor)
599
+ end
600
+ rule(:simpleFactorExpression) do
601
+ ((op_leftparen >> expression >> op_rightparen) | primary).as(:simpleFactorExpression)
602
+ end
603
+ rule(:simpleFactorUnaryExpression) do
604
+ (unaryOp >> simpleFactorExpression).as(:simpleFactorUnaryExpression)
605
+ end
606
+ rule(:simpleId) do
607
+ anyKeyword.absent? >> cts((match["a-zA-Z_"] >> match["a-zA-Z0-9_"].repeat).as(:str)).as(:simpleId)
608
+ end
609
+ rule(:simpleStringLiteral) do
610
+ cts((str("'") >> (str("'").absent? >> any).repeat >> str("'")).as(:str)).as(:simpleStringLiteral)
611
+ end
612
+ rule(:simpleTypes) do
613
+ (binaryType | booleanType | integerType | logicalType | numberType | realType | stringType).as(:simpleTypes)
614
+ end
615
+ rule(:skipStmt) { (tSKIP >> op_delim).as(:skipStmt) }
616
+ rule(:space) { match[" \r\n\t\f"] | embeddedRemark | tailRemark }
617
+ rule(:spaces) { space.repeat.as(:spaces) }
618
+ rule(:stmt) do
619
+ (aliasStmt | assignmentStmt | caseStmt | compoundStmt | escapeStmt | ifStmt |
620
+ nullStmt | procedureCallStmt | repeatStmt | returnStmt | skipStmt).as(:stmt)
621
+ end
622
+ rule(:stringLiteral) do
623
+ (simpleStringLiteral | encodedStringLiteral).as(:stringLiteral)
624
+ end
625
+ rule(:stringType) { (tSTRING >> widthSpec.maybe).as(:stringType) }
626
+ rule(:subsuper) do
627
+ (supertypeConstraint.maybe >> subtypeDeclaration.maybe).as(:subsuper)
628
+ end
629
+ rule(:subtypeConstraintBody) do
630
+ (abstractSupertype.maybe >> totalOver.maybe >> (supertypeExpression >> op_delim).maybe).as(:subtypeConstraintBody)
631
+ end
632
+ rule(:subtypeConstraintDecl) do
633
+ (subtypeConstraintHead >> subtypeConstraintBody >> tEND_SUBTYPE_CONSTRAINT >> op_delim).as(:subtypeConstraintDecl)
634
+ end
635
+ rule(:subtypeConstraintHead) do
636
+ (tSUBTYPE_CONSTRAINT >> subtypeConstraintId >> tFOR >> entityRef >> op_delim).as(:subtypeConstraintHead)
637
+ end
638
+ rule(:subtypeConstraintId) { simpleId.as(:subtypeConstraintId) }
639
+ rule(:subtypeConstraintRef) do
640
+ subtypeConstraintId.as(:subtypeConstraintRef)
641
+ end
642
+ rule(:subtypeConstraint) do
643
+ (tOF >> op_leftparen >> supertypeExpression >> op_rightparen).as(:subtypeConstraint)
644
+ end
645
+ rule(:subtypeDeclaration) do
646
+ (tSUBTYPE >> tOF >> op_leftparen >> entityRef >> (op_comma >> entityRef).repeat >> op_rightparen).as(:listOf_entityRef).as(:subtypeDeclaration)
647
+ end
648
+ rule(:supertypeConstraint) do
649
+ (abstractSupertypeDeclaration | abstractEntityDeclaration | supertypeRule).as(:supertypeConstraint)
650
+ end
651
+ rule(:supertypeExpression) do
652
+ (supertypeFactor >> (tANDOR.as(:operator) >> supertypeFactor).as(:item).repeat.as(:rhs)).as(:supertypeExpression)
653
+ end
654
+ rule(:supertypeFactor) do
655
+ (supertypeTerm >> (tAND.as(:operator) >> supertypeTerm).as(:item).repeat.as(:rhs)).as(:supertypeFactor)
656
+ end
657
+ rule(:supertypeRule) do
658
+ (tSUPERTYPE >> subtypeConstraint).as(:supertypeRule)
659
+ end
660
+ rule(:supertypeTerm) do
661
+ (entityRef | oneOf | (op_leftparen >> supertypeExpression >> op_rightparen)).as(:supertypeTerm)
662
+ end
663
+ rule(:syntax) do
664
+ (spaces.as(:spaces) >> schemaDecl.repeat(1).as(:schemaDecl) >> spaces.as(:trailer)).as(:syntax)
665
+ end
666
+ rule(:tailRemark) do
667
+ (str("--") >> (str("\n").absent? >> any).repeat >> str("\n").maybe).as(:tailRemark)
668
+ end
669
+ rule(:term) do
670
+ (factor >> (multiplicationLikeOp >> factor).as(:item).repeat.as(:rhs)).as(:term)
671
+ end
672
+ rule(:totalOver) do
673
+ (tTOTAL_OVER >> op_leftparen >> (entityRef >> (op_comma >> entityRef).repeat).as(:listOf_entityRef) >> op_rightparen >> op_delim).as(:totalOver)
674
+ end
675
+ rule(:typeDecl) do
676
+ (tTYPE >> typeId >> op_equals >> underlyingType >> op_delim >> whereClause.maybe >> tEND_TYPE >> op_delim.as(:op_delim2)).as(:typeDecl)
677
+ end
678
+ rule(:typeId) { simpleId.as(:typeId) }
679
+ rule(:typeLabelId) { simpleId.as(:typeLabelId) }
680
+ rule(:typeLabelRef) { typeLabelId.as(:typeLabelRef) }
681
+ rule(:typeLabel) { (typeLabelId | typeLabelRef).as(:typeLabel) }
682
+ rule(:typeRef) { typeId.as(:typeRef) }
683
+ rule(:unaryOp) { (op_plus | op_minus | tNOT).as(:unaryOp) }
684
+ rule(:underlyingType) do
685
+ (concreteTypes | constructedTypes).as(:underlyingType)
686
+ end
687
+ rule(:uniqueClause) do
688
+ (tUNIQUE >> (uniqueRule >> op_delim >> (uniqueRule >> op_delim.as(:op_delim2)).repeat).as(:listOf_uniqueRule)).as(:uniqueClause)
689
+ end
690
+ rule(:uniqueRule) do
691
+ ((ruleLabelId >> op_colon).maybe >> (referencedAttribute >> (op_comma >> referencedAttribute).repeat).as(:listOf_referencedAttribute)).as(:uniqueRule)
692
+ end
693
+ rule(:untilControl) { (tUNTIL >> logicalExpression).as(:untilControl) }
694
+ rule(:useClause) do
695
+ (tUSE >> tFROM >> schemaRef >>
696
+ (op_leftparen >> (namedTypeOrRename >> (op_comma >>
697
+ namedTypeOrRename).repeat).as(:listOf_namedTypeOrRename) >> op_rightparen).maybe >> op_delim).as(:useClause)
698
+ end
699
+ rule(:variableId) { simpleId.as(:variableId) }
700
+ rule(:variableRef) { variableId.as(:variableRef) }
701
+ rule(:whereClause) do
702
+ (tWHERE >> (domainRule >> op_delim).repeat.as(:listOf_domainRule)).as(:whereClause)
703
+ end
704
+ rule(:whileControl) { (tWHILE >> logicalExpression).as(:whileControl) }
705
+ rule(:width) { numericExpression.as(:width) }
706
+ rule(:widthSpec) do
707
+ (op_leftparen >> width >> op_rightparen >> tFIXED.maybe).as(:widthSpec)
708
+ end
709
+ end
710
+ end
711
+ end
712
+ end