expressir 1.2.11-aarch64-linux → 2.4.31-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 +48 -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 +204 -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 +165 -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_command.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 +96 -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 +740 -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 +427 -125
  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,740 @@
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
+ # Whitespace rides the engine's injected trivia (parsanol-ruby
31
+ # #180's source-preserving mode, 1.3.82+): each unit records
32
+ # verbatim under :space and attaches to the next Named capture.
33
+ # Remarks stay OUT of the skip rule — they are product data,
34
+ # captured by the tailRemark/embeddedRemark rules and attached
35
+ # by RemarkScanner; tail remarks attach backward, the engine's
36
+ # next-capture channel is the wrong direction for them.
37
+ rule(:trivia) { match[" \r\n\t\f"].repeat(1) }
38
+ # exempt (parsanol#195, shipped 1.3.89): token rules whose bodies
39
+ # manage their own internals — injection before a char-class tail
40
+ # repetition absorbs the following token across whitespace
41
+ # ("RULE r FOR" parsed as one simpleId). simpleId additionally
42
+ # matches as a single quantified Re, which needs no exemption;
43
+ # the two mechanisms agree and stay for defense in depth.
44
+ # The whitespace/remark rules manage their own trivia end to end
45
+ # (they ARE the trivia surface for remarks); injection around
46
+ # them breaks consecutive remark lines on the Ruby engine
47
+ # ("-- X\n--\nSCHEMA ..." failed - the #487 windows follow-up,
48
+ # parsanol-ruby#195 family).
49
+ skip(:trivia, whitespace: :space,
50
+ exempt: %i[simpleId digits spaces space embeddedRemark tailRemark])
51
+
52
+ # Get cached parser instance (thread-safe)
53
+ # Reusing the parser avoids the overhead of reinitializing all rule definitions
54
+ def self.cached_parser
55
+ return @cached_parser if @cached_parser
56
+
57
+ @parser_mutex.synchronize do
58
+ @cached_parser ||= new
59
+ end
60
+ end
61
+
62
+ # Clear the cached parser (useful for testing or after grammar changes)
63
+ def self.clear_parser_cache
64
+ @parser_mutex.synchronize do
65
+ @cached_parser = nil
66
+ end
67
+ end
68
+
69
+ # Check if native parsing is available
70
+ def self.native_available?
71
+ return @native_available unless @native_available.nil?
72
+
73
+ @native_available = begin
74
+ require "parsanol/native"
75
+ Parsanol::Native.available?
76
+ rescue LoadError
77
+ false
78
+ end
79
+ end
80
+
81
+ # Get cached grammar JSON for native parsing
82
+ def self.cached_grammar_json
83
+ return @cached_grammar_json if @cached_grammar_json
84
+
85
+ parser = new
86
+ atom = parser.syntax
87
+
88
+ # Cache by atom object_id
89
+ if atom.object_id != @cached_grammar_atom_id
90
+ @cached_grammar_atom_id = atom.object_id
91
+ @cached_grammar_json = Parsanol::Native.serialize_grammar(atom)
92
+ end
93
+
94
+ @cached_grammar_json
95
+ end
96
+
97
+ # Get cached grammar JSON for schemaDecl (used for streaming parse)
98
+ def self.cached_schema_grammar_json
99
+ return @cached_schema_grammar_json if @cached_schema_grammar_json
100
+
101
+ schema_atom = cached_parser.schemaDecl
102
+ @cached_schema_grammar_json = Parsanol::Native.serialize_grammar(schema_atom)
103
+ @cached_schema_grammar_json
104
+ end
105
+
106
+ # Parse using native engine with Rust-side transformation (fastest)
107
+ #
108
+ # This method provides ~17x speedup over pure Ruby parsing.
109
+ # The transformation happens in Rust using to_parslet_compatible,
110
+ # producing Parslet-compatible output that Builder.build can consume directly.
111
+ #
112
+ # @param source [String] EXPRESS source code to parse
113
+ # @return [Hash, Array] Transformed AST in Parslet-compatible format
114
+ # @raise [LoadError] If native parser is not available
115
+ def self.parse_native(source)
116
+ unless native_available?
117
+ raise LoadError, "Native parser not available"
118
+ end
119
+
120
+ grammar_atom = cached_parser.syntax
121
+ # Use fresh-parse (no cache) for large files to bound memory
122
+ if source.bytesize > LARGE_FILE_THRESHOLD
123
+ Parsanol::Native.parse_fresh(grammar_atom, source)
124
+ else
125
+ Parsanol::Native.parse(grammar_atom, source)
126
+ end
127
+ end
128
+
129
+ def cts(atom)
130
+ spaces >> atom
131
+ end
132
+
133
+ def cstr(atom)
134
+ cts(str(atom).as(:str))
135
+ end
136
+
137
+ KEYWORDS = %i[
138
+ ABS ABSTRACT ACOS AGGREGATE ALIAS AND ANDOR ARRAY AS ASIN ATAN BAG BASED_ON
139
+ BEGIN BINARY BLENGTH BOOLEAN BY CASE CONSTANT CONST_E COS DERIVE DIV ELSE
140
+ END END_ALIAS END_CASE END_CONSTANT END_ENTITY END_FUNCTION END_IF
141
+ END_LOCAL END_PROCEDURE END_REPEAT END_RULE END_SCHEMA
142
+ END_SUBTYPE_CONSTRAINT END_TYPE ENTITY ENUMERATION ESCAPE EXISTS EXP
143
+ EXTENSIBLE FALSE FIXED FOR FORMAT FROM FUNCTION GENERIC GENERIC_ENTITY
144
+ HIBOUND HIINDEX IF IN INSERT INTEGER INVERSE LENGTH LIKE LIST LOBOUND LOCAL
145
+ LOG LOG10 LOG2 LOGICAL LOINDEX MOD NOT NUMBER NVL ODD OF ONEOF OPTIONAL OR
146
+ OTHERWISE PI PROCEDURE QUERY REAL REFERENCE REMOVE RENAMED REPEAT RETURN
147
+ ROLESOF RULE SCHEMA SELECT SELF SET SIN SIZEOF SKIP SQRT STRING SUBTYPE
148
+ SUBTYPE_CONSTRAINT SUPERTYPE TAN THEN TO TRUE TYPE TYPEOF TOTAL_OVER UNIQUE
149
+ UNKNOWN UNTIL USE USEDIN VALUE VALUE_IN VALUE_UNIQUE VAR WITH WHERE WHILE
150
+ XOR
151
+ ].freeze
152
+
153
+ def keyword_rule(str)
154
+ key_chars = str.to_s.chars
155
+ key_chars
156
+ .collect! { |char| match("[#{char}#{char.downcase}]") }
157
+ .reduce(:>>) >> match["a-zA-Z0-9_"].absent?
158
+ end
159
+
160
+ KEYWORDS.each do |keyword|
161
+ sym = :"t#{keyword}"
162
+ rule(sym) { cts(keyword_rule(keyword).as(:str)).as(sym) }
163
+ end
164
+
165
+ rule(:abstractEntityDeclaration) do
166
+ tABSTRACT.as(:abstractEntityDeclaration)
167
+ end
168
+ rule(:abstractSupertypeDeclaration) do
169
+ (tABSTRACT >> tSUPERTYPE >> subtypeConstraint.maybe).as(:abstractSupertypeDeclaration)
170
+ end
171
+ # ISO 10303-11 abstract_supertype_constraint = ABSTRACT ';' —
172
+ # tolerated nonstandard variant: ABSTRACT SUPERTYPE ';' (real
173
+ # corpora ship it; longest-first so PEG stays deterministic).
174
+ # The entity-header forms live in abstractSupertypeDeclaration.
175
+ rule(:abstractSupertype) do
176
+ (
177
+ (tABSTRACT >> tSUPERTYPE >> op_delim) |
178
+ (tABSTRACT >> op_delim)
179
+ ).as(:abstractSupertype)
180
+ end
181
+ rule(:actualParameterList) do
182
+ (op_leftparen >> (parameter >> (op_comma >> parameter).repeat).as(:listOf_parameter).maybe >> op_rightparen)
183
+ .as(:actualParameterList)
184
+ end
185
+ rule(:addLikeOp) { (op_plus | op_minus | tOR | tXOR).as(:addLikeOp) }
186
+ rule(:aggregateInitializer) do
187
+ (op_leftbracket >> (element >> (op_comma >> element).repeat).as(:listOf_element).maybe >> op_rightbracket)
188
+ .as(:aggregateInitializer)
189
+ end
190
+ rule(:aggregateSource) { simpleExpression.as(:aggregateSource) }
191
+ rule(:aggregateType) do
192
+ (tAGGREGATE >> (op_colon >> typeLabel).maybe >> tOF >> parameterType).as(:aggregateType)
193
+ end
194
+ rule(:aggregationTypes) do
195
+ (arrayType | bagType | listType | setType).as(:aggregationTypes)
196
+ end
197
+ rule(:algorithmHead) do
198
+ (declaration.repeat.as(:declaration) >> constantDecl.maybe >> localDecl.maybe).as(:algorithmHead)
199
+ end
200
+ rule(:aliasStmt) do
201
+ (tALIAS >> variableId >> tFOR >> generalRef >> qualifier.repeat.as(:qualifier) >>
202
+ op_delim >> stmt.repeat(1).as(:stmt) >> tEND_ALIAS >> op_delim.as(:op_delim2)).as(:aliasStmt)
203
+ end
204
+ rule(:anyKeyword) { KEYWORDS.map { |kw| send("t#{kw}") }.inject(:|) }
205
+ rule(:arrayType) do
206
+ (tARRAY >> boundSpec >> tOF >> tOPTIONAL.maybe >> tUNIQUE.maybe >> instantiableType).as(:arrayType)
207
+ end
208
+ rule(:assignmentStmt) do
209
+ (generalRef >> qualifier.repeat.as(:qualifier) >> op_decl >> expression >> op_delim).as(:assignmentStmt)
210
+ end
211
+ rule(:attributeDecl) do
212
+ (attributeId | redeclaredAttribute).as(:attributeDecl)
213
+ end
214
+ rule(:attributeId) { simpleId.as(:attributeId) }
215
+ rule(:attributeQualifier) do
216
+ (op_period >> attributeRef).as(:attributeQualifier)
217
+ end
218
+ rule(:attributeRef) { attributeId.as(:attributeRef) }
219
+ rule(:bagType) do
220
+ (tBAG >> boundSpec.maybe >> tOF >> instantiableType).as(:bagType)
221
+ end
222
+ rule(:binaryLiteral) do
223
+ cts((str("%") >> bit.repeat(1)).as(:str)).as(:binaryLiteral)
224
+ end
225
+ rule(:binaryType) { (tBINARY >> widthSpec.maybe).as(:binaryType) }
226
+ rule(:bit) { match["0-1"] }
227
+ rule(:booleanType) { tBOOLEAN.as(:booleanType) }
228
+ rule(:bound1) { numericExpression.as(:bound1) }
229
+ rule(:bound2) { numericExpression.as(:bound2) }
230
+ rule(:boundSpec) do
231
+ (op_leftbracket >> bound1 >> op_colon >> bound2 >> op_rightbracket).as(:boundSpec)
232
+ end
233
+ rule(:builtInConstant) do
234
+ (tCONST_E | tPI | tSELF | op_question_mark).as(:builtInConstant)
235
+ end
236
+ rule(:builtInFunction) do
237
+ (tABS | tACOS | tASIN | tATAN | tBLENGTH | tCOS | tEXISTS | tEXP | tFORMAT | tHIBOUND | tHIINDEX | tLENGTH |
238
+ tLOBOUND | tLOINDEX | tLOG2 | tLOG10 | tLOG | tNVL | tODD | tROLESOF | tSIN | tSIZEOF | tSQRT | tTAN |
239
+ tTYPEOF | tUSEDIN | tVALUE_IN | tVALUE_UNIQUE | tVALUE).as(:builtInFunction)
240
+ end
241
+ rule(:builtInProcedure) { (tINSERT | tREMOVE).as(:builtInProcedure) }
242
+ rule(:caseAction) do
243
+ ((caseLabel >> (op_comma >> caseLabel).repeat).as(:listOf_caseLabel) >> op_colon >> stmt).as(:caseAction)
244
+ end
245
+ rule(:caseLabel) { expression.as(:caseLabel) }
246
+ rule(:caseStmt) do
247
+ (tCASE >> selector >> tOF >> caseAction.repeat.as(:caseAction) >> (tOTHERWISE >> op_colon >> stmt).maybe >> tEND_CASE >> op_delim).as(:caseStmt)
248
+ end
249
+ rule(:compoundStmt) do
250
+ (tBEGIN >> stmt.repeat(1).as(:stmt) >> tEND >> op_delim).as(:compoundStmt)
251
+ end
252
+ rule(:concreteTypes) do
253
+ (aggregationTypes | simpleTypes | typeRef).as(:concreteTypes)
254
+ end
255
+ rule(:constantBody) do
256
+ (constantId >> op_colon >> instantiableType >> op_decl >> expression >> op_delim).as(:constantBody)
257
+ end
258
+ rule(:constantDecl) do
259
+ (tCONSTANT >> constantBody.repeat(1).as(:constantBody) >> tEND_CONSTANT >> op_delim).as(:constantDecl)
260
+ end
261
+ rule(:constantFactor) do
262
+ (builtInConstant | constantRef).as(:constantFactor)
263
+ end
264
+ rule(:constantId) { simpleId.as(:constantId) }
265
+ rule(:constantRef) { constantId.as(:constantRef) }
266
+ rule(:constructedTypes) do
267
+ (enumerationType | selectType).as(:constructedTypes)
268
+ end
269
+ rule(:declaration) do
270
+ (entityDecl | functionDecl | procedureDecl | subtypeConstraintDecl | typeDecl).as(:declaration)
271
+ end
272
+ rule(:delim) { cts(str(";").as(:delim)) }
273
+ rule(:deriveClause) do
274
+ (tDERIVE >> derivedAttr.repeat(1).as(:derivedAttr)).as(:deriveClause)
275
+ end
276
+ rule(:derivedAttr) do
277
+ (attributeDecl >> op_colon >> parameterType >> op_decl >> expression >> op_delim).as(:derivedAttr)
278
+ end
279
+ rule(:digit) { match["0-9"] }
280
+ rule(:digits) { digit >> digit.repeat }
281
+ rule(:domainRule) do
282
+ ((ruleLabelId >> op_colon).maybe >> expression).as(:domainRule)
283
+ end
284
+ rule(:element) do
285
+ (expression >> (op_colon >> repetition).maybe).as(:element)
286
+ end
287
+ rule(:embeddedRemark) do
288
+ (
289
+ # `(*)` is a 3-character empty embedded remark: the opener `(*`
290
+ # and closer `*)` share the `*`. Per strict ISO 10303-11 §7.1.6
291
+ # grammar the opener and closer are distinct tokens and cannot
292
+ # share characters, so `(*)` is technically invalid. We accept
293
+ # it for robustness (issue #126).
294
+ str("(*)") |
295
+ (str("(*") >> (str("*)").absent? >> (embeddedRemark | any)).repeat >> str("*)"))
296
+ ).as(:embeddedRemark)
297
+ end
298
+ rule(:encodedCharacter) { octet >> octet >> octet >> octet }
299
+ rule(:encodedStringLiteral) do
300
+ cts((str('"') >> encodedCharacter.repeat(1) >> str('"')).as(:str)).as(:encodedStringLiteral)
301
+ end
302
+ rule(:entityBody) do
303
+ (explicitAttr.repeat.as(:explicitAttr) >> deriveClause.maybe >> inverseClause.maybe >> uniqueClause.maybe >> whereClause.maybe).as(:entityBody)
304
+ end
305
+ rule(:entityConstructor) do
306
+ (entityRef >> op_leftparen >> (expression >> (op_comma >> expression).repeat).as(:listOf_expression).maybe >> op_rightparen).as(:entityConstructor)
307
+ end
308
+ rule(:entityDecl) do
309
+ (entityHead >> entityBody >> tEND_ENTITY >> op_delim).as(:entityDecl)
310
+ end
311
+ rule(:entityHead) do
312
+ (tENTITY >> entityId >> subsuper >> op_delim).as(:entityHead)
313
+ end
314
+ rule(:entityId) { simpleId.as(:entityId) }
315
+ rule(:entityRef) { entityId.as(:entityRef) }
316
+ rule(:enumerationExtension) do
317
+ (tBASED_ON >> typeRef >> (tWITH >> enumerationItems).maybe).as(:enumerationExtension)
318
+ end
319
+ rule(:enumerationId) { simpleId.as(:enumerationId) }
320
+ rule(:enumerationItem) { enumerationId.as(:enumerationItem) }
321
+ rule(:enumerationItems) do
322
+ (op_leftparen >> (enumerationItem >> (op_comma >> enumerationItem).repeat).as(:listOf_enumerationItem) >> op_rightparen).as(:enumerationItems)
323
+ end
324
+ rule(:enumerationRef) { enumerationId.as(:enumerationRef) }
325
+ rule(:enumerationReference) do
326
+ ((typeRef >> op_period).maybe >> enumerationRef).as(:enumerationReference)
327
+ end
328
+ rule(:enumerationType) do
329
+ (tEXTENSIBLE.maybe >> tENUMERATION >> ((tOF >> enumerationItems) | enumerationExtension).maybe).as(:enumerationType)
330
+ end
331
+ rule(:escapeStmt) { (tESCAPE >> op_delim).as(:escapeStmt) }
332
+ rule(:explicitAttr) do
333
+ ((attributeDecl >> (op_comma >> attributeDecl).repeat).as(:listOf_attributeDecl) >> op_colon >>
334
+ tOPTIONAL.maybe >> parameterType >> op_delim).as(:explicitAttr)
335
+ end
336
+ rule(:expression) do
337
+ (simpleExpression >> (relOpExtended >> simpleExpression.as(:rhs)).maybe).as(:expression)
338
+ end
339
+ rule(:factor) do
340
+ (simpleFactor >> (op_double_asterisk >> simpleFactor.as(:rhs)).maybe).as(:factor)
341
+ end
342
+ rule(:formalParameter) do
343
+ ((parameterId >> (op_comma >> parameterId).repeat).as(:listOf_parameterId) >> op_colon >> parameterType).as(:formalParameter)
344
+ end
345
+ rule(:functionCall) do
346
+ ((builtInFunction | functionRef) >> actualParameterList.maybe).as(:functionCall)
347
+ end
348
+ rule(:functionDecl) do
349
+ (functionHead >> algorithmHead >> stmt.repeat(1).as(:stmt) >> tEND_FUNCTION >> op_delim).as(:functionDecl)
350
+ end
351
+ rule(:functionHead) do
352
+ (tFUNCTION >> functionId >>
353
+ (op_leftparen >> (formalParameter >> (op_delim >> formalParameter).repeat).as(:listOf_formalParameter) >> op_rightparen).maybe >>
354
+ op_colon >> parameterType >> op_delim.as(:op_delim2)).as(:functionHead)
355
+ end
356
+ rule(:functionId) { simpleId.as(:functionId) }
357
+ rule(:functionRef) { functionId.as(:functionRef) }
358
+ rule(:generalAggregationTypes) do
359
+ (generalArrayType | generalBagType | generalListType | generalSetType).as(:generalAggregationTypes)
360
+ end
361
+ rule(:generalArrayType) do
362
+ (tARRAY >> boundSpec.maybe >> tOF >> tOPTIONAL.maybe >> tUNIQUE.maybe >> parameterType).as(:generalArrayType)
363
+ end
364
+ rule(:generalBagType) do
365
+ (tBAG >> boundSpec.maybe >> tOF >> parameterType).as(:generalBagType)
366
+ end
367
+ rule(:generalizedTypes) do
368
+ (aggregateType | generalAggregationTypes | genericEntityType | genericType).as(:generalizedTypes)
369
+ end
370
+ rule(:generalListType) do
371
+ (tLIST >> boundSpec.maybe >> tOF >> tUNIQUE.maybe >> parameterType).as(:generalListType)
372
+ end
373
+ rule(:generalRef) { (parameterRef | variableId).as(:generalRef) }
374
+ rule(:generalSetType) do
375
+ (tSET >> boundSpec.maybe >> tOF >> parameterType).as(:generalSetType)
376
+ end
377
+ rule(:genericEntityType) do
378
+ (tGENERIC_ENTITY >> (op_colon >> typeLabel).maybe).as(:genericEntityType)
379
+ end
380
+ rule(:genericType) do
381
+ (tGENERIC >> (op_colon >> typeLabel).maybe).as(:genericType)
382
+ end
383
+ rule(:groupQualifier) do
384
+ (op_double_backslash >> entityRef).as(:groupQualifier)
385
+ end
386
+ rule(:hexDigit) { match["0-9a-fA-F"] }
387
+ rule(:ifStmtElseStatements) do
388
+ stmt.repeat(1).as(:stmt).as(:ifStmtElseStatements)
389
+ end
390
+ rule(:ifStmtStatements) do
391
+ stmt.repeat(1).as(:stmt).as(:ifStmtStatements)
392
+ end
393
+ rule(:ifStmt) do
394
+ (tIF >> logicalExpression >> tTHEN >> ifStmtStatements >> (tELSE >> ifStmtElseStatements).maybe >> tEND_IF >> op_delim).as(:ifStmt)
395
+ end
396
+ rule(:incrementControl) do
397
+ (variableId >> op_decl >> bound1 >> tTO >> bound2 >> (tBY >> increment).maybe).as(:incrementControl)
398
+ end
399
+ rule(:increment) { numericExpression.as(:increment) }
400
+ rule(:index1) { index.as(:index1) }
401
+ rule(:index2) { index.as(:index2) }
402
+ rule(:index) { numericExpression.as(:index) }
403
+ rule(:indexQualifier) do
404
+ (op_leftbracket >> index1 >> (op_colon >> index2).maybe >> op_rightbracket).as(:indexQualifier)
405
+ end
406
+ rule(:instantiableType) do
407
+ (concreteTypes | entityRef).as(:instantiableType)
408
+ end
409
+ rule(:integerLiteral) { cts(digits.as(:str)).as(:integerLiteral) }
410
+ rule(:integerType) { tINTEGER.as(:integerType) }
411
+ rule(:interfaceSpecification) do
412
+ (referenceClause | useClause).as(:interfaceSpecification)
413
+ end
414
+ rule(:intervalHigh) { simpleExpression.as(:intervalHigh) }
415
+ rule(:intervalItem) { simpleExpression.as(:intervalItem) }
416
+ rule(:intervalLow) { simpleExpression.as(:intervalLow) }
417
+ rule(:interval) do
418
+ (op_left_curly_brace >> intervalLow >> intervalOp >> intervalItem >> intervalOp.as(:intervalOp2) >>
419
+ intervalHigh >> op_right_curly_brace).as(:interval)
420
+ end
421
+ rule(:intervalOp) { (op_less_equal | op_less_than).as(:intervalOp) }
422
+ rule(:inverseAttr) do
423
+ (attributeDecl >> op_colon >> inverseAttrType >> tFOR >> (entityRef >> op_period).maybe >> attributeRef >> op_delim).as(:inverseAttr)
424
+ end
425
+ rule(:inverseAttrType) do
426
+ (((tSET | tBAG) >> boundSpec.maybe >> tOF).maybe >> entityRef).as(:inverseAttrType)
427
+ end
428
+ rule(:inverseClause) do
429
+ (tINVERSE >> inverseAttr.repeat(1).as(:inverseAttr)).as(:inverseClause)
430
+ end
431
+ rule(:letter) { match["a-zA-Z"] }
432
+ rule(:listType) do
433
+ (tLIST >> boundSpec.maybe >> tOF >> tUNIQUE.maybe >> instantiableType).as(:listType)
434
+ end
435
+ rule(:literal) do
436
+ (binaryLiteral | logicalLiteral | realLiteral | integerLiteral | stringLiteral).as(:literal)
437
+ end
438
+ rule(:localDecl) do
439
+ (tLOCAL >> localVariable.repeat(1).as(:localVariable) >> tEND_LOCAL >> op_delim).as(:localDecl)
440
+ end
441
+ rule(:localVariable) do
442
+ ((variableId >> (op_comma >> variableId).repeat).as(:listOf_variableId) >>
443
+ op_colon >> parameterType >>
444
+ (op_decl >> expression).maybe >> op_delim).as(:localVariable)
445
+ end
446
+ rule(:logicalExpression) { expression.as(:logicalExpression) }
447
+ rule(:logicalLiteral) do
448
+ (tFALSE | tTRUE | tUNKNOWN).as(:logicalLiteral)
449
+ end
450
+ rule(:logicalType) { tLOGICAL.as(:logicalType) }
451
+ rule(:multiplicationLikeOp) do
452
+ (op_asterisk | op_slash | tDIV | tMOD | tAND | op_double_pipe).as(:multiplicationLikeOp)
453
+ end
454
+ rule(:namedTypeOrRename) do
455
+ (namedTypes >> (tAS >> (entityId | typeId)).maybe).as(:namedTypeOrRename)
456
+ end
457
+ rule(:namedTypes) { (entityRef | typeRef).as(:namedTypes) }
458
+ rule(:nullStmt) { op_delim.as(:nullStmt) }
459
+ rule(:numberType) { tNUMBER.as(:numberType) }
460
+ rule(:numericExpression) { simpleExpression.as(:numericExpression) }
461
+ rule(:octet) { hexDigit >> hexDigit }
462
+ rule(:oneOf) do
463
+ (tONEOF >> op_leftparen >> (supertypeExpression >>
464
+ (op_comma >> supertypeExpression).repeat).as(:listOf_supertypeExpression) >> op_rightparen).as(:oneOf)
465
+ end
466
+ rule(:op_asterisk) { cstr("*").as(:op_asterisk) }
467
+ rule(:op_colon) { cstr(":").as(:op_colon) }
468
+ rule(:op_colon_equals_colon) { cstr(":=:").as(:op_colon_equals_colon) }
469
+ rule(:op_colon_less_greater_colon) do
470
+ cstr(":<>:").as(:op_colon_less_greater_colon)
471
+ end
472
+ rule(:op_comma) { cstr(",").as(:op_comma) }
473
+ rule(:op_decl) { cstr(":=").as(:op_decl) }
474
+ rule(:op_delim) { cstr(";").as(:op_delim) }
475
+ rule(:op_double_asterisk) { cstr("**").as(:op_double_asterisk) }
476
+ rule(:op_double_backslash) { cstr("\\").as(:op_double_backslash) }
477
+ rule(:op_double_pipe) { cstr("||").as(:op_double_pipe) }
478
+ rule(:op_equals) { cstr("=").as(:op_equals) }
479
+ rule(:op_greater_equal) { cstr(">=").as(:op_greater_equal) }
480
+ rule(:op_greater_than) { cstr(">").as(:op_greater_than) }
481
+ rule(:op_leftbracket) { cstr("[").as(:op_leftbracket) }
482
+ rule(:op_left_curly_brace) { cstr("{").as(:op_left_curly_brace) }
483
+ rule(:op_leftparen) { cstr("(").as(:op_leftparen) }
484
+ rule(:op_less_equal) { cstr("<=").as(:op_less_equal) }
485
+ rule(:op_less_greater) { cstr("<>").as(:op_less_greater) }
486
+ rule(:op_less_than) { cstr("<").as(:op_less_than) }
487
+ rule(:op_minus) { cstr("-").as(:op_minus) }
488
+ rule(:op_period) { cstr(".").as(:op_period) }
489
+ rule(:op_pipe) { cstr("|").as(:op_pipe) }
490
+ rule(:op_plus) { cstr("+").as(:op_plus) }
491
+ rule(:op_query_begin) { cstr("<*").as(:op_query_begin) }
492
+ rule(:op_query_end) { cstr("*>").as(:op_query_end) }
493
+ rule(:op_question_mark) { cstr("?").as(:op_question_mark) }
494
+ rule(:op_rightbracket) { cstr("]").as(:op_rightbracket) }
495
+ rule(:op_right_curly_brace) { cstr("}").as(:op_right_curly_brace) }
496
+ rule(:op_rightparen) { cstr(")").as(:op_rightparen) }
497
+ rule(:op_slash) { cstr("/").as(:op_slash) }
498
+ rule(:parameter) { expression.as(:parameter) }
499
+ rule(:parameterId) { simpleId.as(:parameterId) }
500
+ rule(:parameterRef) { parameterId.as(:parameterRef) }
501
+ rule(:parameterType) do
502
+ (generalizedTypes | namedTypes | simpleTypes).as(:parameterType)
503
+ end
504
+ rule(:population) { entityRef.as(:population) }
505
+ rule(:precisionSpec) { numericExpression.as(:precisionSpec) }
506
+ rule(:primary) do
507
+ (literal | (qualifiableFactor >> qualifier.repeat.as(:qualifier))).as(:primary)
508
+ end
509
+ rule(:procedureCallStmt) do
510
+ ((builtInProcedure | procedureRef) >> actualParameterList.maybe >> op_delim).as(:procedureCallStmt)
511
+ end
512
+ rule(:procedureDecl) do
513
+ (procedureHead >> algorithmHead >> stmt.repeat.as(:stmt) >> tEND_PROCEDURE >> op_delim).as(:procedureDecl)
514
+ end
515
+ rule(:procedureHeadParameter) do
516
+ (tVAR.maybe >> formalParameter).as(:procedureHeadParameter)
517
+ end
518
+ rule(:procedureHead) do
519
+ (tPROCEDURE >> procedureId >>
520
+ (op_leftparen >> (procedureHeadParameter >>
521
+ (op_delim >> procedureHeadParameter).repeat).as(:listOf_procedureHeadParameter) >> op_rightparen).maybe >> op_delim.as(:op_delim2)).as(:procedureHead)
522
+ end
523
+ rule(:procedureId) { simpleId.as(:procedureId) }
524
+ rule(:procedureRef) { procedureId.as(:procedureRef) }
525
+ rule(:qualifiableFactor) do
526
+ (functionCall | attributeRef | constantFactor | generalRef | population).as(:qualifiableFactor)
527
+ end
528
+ rule(:qualifiedAttribute) do
529
+ (tSELF >> groupQualifier >> attributeQualifier).as(:qualifiedAttribute)
530
+ end
531
+ rule(:qualifier) do
532
+ (attributeQualifier | groupQualifier | indexQualifier).as(:qualifier)
533
+ end
534
+ rule(:queryExpression) do
535
+ (tQUERY >> op_leftparen >> variableId >> op_query_begin >> aggregateSource >> op_pipe >> logicalExpression >> op_rightparen).as(:queryExpression)
536
+ end
537
+ rule(:realLiteral) do
538
+ cts((digits >> str(".") >> digits.maybe >> (match["eE"] >> sign.maybe >> digits).maybe).as(:str)).as(:realLiteral)
539
+ end
540
+ rule(:realType) do
541
+ (tREAL >> (op_leftparen >> precisionSpec >> op_rightparen).maybe).as(:realType)
542
+ end
543
+ rule(:redeclaredAttribute) do
544
+ (qualifiedAttribute >> (tRENAMED >> attributeId).maybe).as(:redeclaredAttribute)
545
+ end
546
+ rule(:referenceClause) do
547
+ (tREFERENCE >> tFROM >> schemaRef >>
548
+ (op_leftparen >> (resourceOrRename >> (op_comma >> resourceOrRename).repeat).as(:listOf_resourceOrRename) >> op_rightparen).maybe >> op_delim).as(:referenceClause)
549
+ end
550
+ rule(:referencedAttribute) do
551
+ (attributeRef | qualifiedAttribute).as(:referencedAttribute)
552
+ end
553
+ rule(:relOpExtended) { (relOp | tIN | tLIKE).as(:relOpExtended) }
554
+ rule(:relOp) do
555
+ (op_less_equal | op_greater_equal | op_less_greater | op_less_than | op_greater_than | op_equals |
556
+ op_colon_less_greater_colon | op_colon_equals_colon).as(:relOp)
557
+ end
558
+ rule(:renameId) do
559
+ (constantId | entityId | functionId | procedureId | typeId).as(:renameId)
560
+ end
561
+ rule(:repeatControl) do
562
+ (incrementControl.maybe >> whileControl.maybe >> untilControl.maybe).as(:repeatControl)
563
+ end
564
+ rule(:repeatStmt) do
565
+ (tREPEAT >> repeatControl >> op_delim >> stmt.repeat(1).as(:stmt) >> tEND_REPEAT >> op_delim.as(:op_delim2)).as(:repeatStmt)
566
+ end
567
+ rule(:repetition) { numericExpression.as(:repetition) }
568
+ rule(:resourceOrRename) do
569
+ (resourceRef >> (tAS >> renameId).maybe).as(:resourceOrRename)
570
+ end
571
+ rule(:resourceRef) do
572
+ (constantRef | entityRef | functionRef | procedureRef | typeRef).as(:resourceRef)
573
+ end
574
+ rule(:returnStmt) do
575
+ (tRETURN >> (op_leftparen >> expression >> op_rightparen).maybe >> op_delim).as(:returnStmt)
576
+ end
577
+ rule(:ruleDecl) do
578
+ (ruleHead >> algorithmHead >> stmt.repeat.as(:stmt) >> whereClause >> tEND_RULE >> op_delim).as(:ruleDecl)
579
+ end
580
+ rule(:ruleHead) do
581
+ (tRULE >> ruleId >> tFOR >> op_leftparen >>
582
+ (entityRef >> (op_comma >> entityRef).repeat).as(:listOf_entityRef) >> op_rightparen >> op_delim).as(:ruleHead)
583
+ end
584
+ rule(:ruleId) { simpleId.as(:ruleId) }
585
+ rule(:ruleLabelId) { simpleId.as(:ruleLabelId) }
586
+ rule(:ruleLabelRef) { ruleLabelId.as(:ruleLabelRef) }
587
+ rule(:ruleRef) { ruleId.as(:ruleRef) }
588
+ rule(:schemaBodyDeclaration) do
589
+ (declaration | ruleDecl).as(:schemaBodyDeclaration)
590
+ end
591
+ rule(:schemaBody) do
592
+ (interfaceSpecification.repeat.as(:interfaceSpecification) >> constantDecl.maybe >>
593
+ schemaBodyDeclaration.repeat.as(:schemaBodyDeclaration)).as(:schemaBody)
594
+ end
595
+ rule(:schemaDecl) do
596
+ (tSCHEMA >> schemaId >> schemaVersionId.maybe >> op_delim >> schemaBody >> tEND_SCHEMA >> op_delim.as(:op_delim2)).as(:schemaDecl)
597
+ end
598
+ rule(:schemaId) { simpleId.as(:schemaId) }
599
+ rule(:schemaRef) { schemaId.as(:schemaRef) }
600
+ rule(:schemaVersionId) { stringLiteral.as(:schemaVersionId) }
601
+ rule(:selectExtension) do
602
+ (tBASED_ON >> typeRef >> (tWITH >> selectList).maybe).as(:selectExtension)
603
+ end
604
+ rule(:selectList) do
605
+ (op_leftparen >> (namedTypes >> (op_comma >> namedTypes).repeat).as(:listOf_namedTypes) >> op_rightparen).as(:selectList)
606
+ end
607
+ rule(:selector) { expression.as(:selector) }
608
+ rule(:selectType) do
609
+ ((tEXTENSIBLE >> tGENERIC_ENTITY.maybe).maybe >> tSELECT >> (selectList | selectExtension).maybe).as(:selectType)
610
+ end
611
+ rule(:setType) do
612
+ (tSET >> boundSpec.maybe >> tOF >> instantiableType).as(:setType)
613
+ end
614
+ rule(:sign) { match["+-"] }
615
+ rule(:simpleExpression) do
616
+ (term >> (addLikeOp.as(:operator) >> term).as(:item).repeat.as(:rhs)).as(:simpleExpression)
617
+ end
618
+ rule(:simpleFactor) do
619
+ (simpleFactorExpression | aggregateInitializer | entityConstructor | interval | queryExpression | stringLiteral |
620
+ simpleFactorUnaryExpression | enumerationReference).as(:simpleFactor)
621
+ end
622
+ rule(:simpleFactorExpression) do
623
+ ((op_leftparen >> expression >> op_rightparen) | primary).as(:simpleFactorExpression)
624
+ end
625
+ rule(:simpleFactorUnaryExpression) do
626
+ (unaryOp >> simpleFactorExpression).as(:simpleFactorUnaryExpression)
627
+ end
628
+ rule(:simpleId) do
629
+ # One quantified Re, not lead >> tail-repeat: under skip
630
+ # injection the DSL interleaves trivia before the tail
631
+ # repetition, so a two-atom ident would absorb the following
632
+ # whitespace-separated identifier ("RULE r FOR (e)" parses
633
+ # "r FOR" as one simpleId). A quantified Re consumes the
634
+ # whole identifier in a single step — parsanol GH-69.
635
+ anyKeyword.absent? >> cts(match("[a-zA-Z_][a-zA-Z0-9_]*").as(:str)).as(:simpleId)
636
+ end
637
+ rule(:simpleStringLiteral) do
638
+ cts((str("'") >> (str("'").absent? >> any).repeat >> str("'")).as(:str)).as(:simpleStringLiteral)
639
+ end
640
+ rule(:simpleTypes) do
641
+ (binaryType | booleanType | integerType | logicalType | numberType | realType | stringType).as(:simpleTypes)
642
+ end
643
+ rule(:skipStmt) { (tSKIP >> op_delim).as(:skipStmt) }
644
+ rule(:space) { match[" \r\n\t\f"] | embeddedRemark | tailRemark }
645
+ rule(:spaces) { space.repeat.as(:spaces) }
646
+ rule(:stmt) do
647
+ (aliasStmt | assignmentStmt | caseStmt | compoundStmt | escapeStmt | ifStmt |
648
+ nullStmt | procedureCallStmt | repeatStmt | returnStmt | skipStmt).as(:stmt)
649
+ end
650
+ rule(:stringLiteral) do
651
+ (simpleStringLiteral | encodedStringLiteral).as(:stringLiteral)
652
+ end
653
+ rule(:stringType) { (tSTRING >> widthSpec.maybe).as(:stringType) }
654
+ rule(:subsuper) do
655
+ (supertypeConstraint.maybe >> subtypeDeclaration.maybe).as(:subsuper)
656
+ end
657
+ rule(:subtypeConstraintBody) do
658
+ (abstractSupertype.maybe >> totalOver.maybe >> (supertypeExpression >> op_delim).maybe).as(:subtypeConstraintBody)
659
+ end
660
+ rule(:subtypeConstraintDecl) do
661
+ (subtypeConstraintHead >> subtypeConstraintBody >> tEND_SUBTYPE_CONSTRAINT >> op_delim).as(:subtypeConstraintDecl)
662
+ end
663
+ rule(:subtypeConstraintHead) do
664
+ (tSUBTYPE_CONSTRAINT >> subtypeConstraintId >> tFOR >> entityRef >> op_delim).as(:subtypeConstraintHead)
665
+ end
666
+ rule(:subtypeConstraintId) { simpleId.as(:subtypeConstraintId) }
667
+ rule(:subtypeConstraintRef) do
668
+ subtypeConstraintId.as(:subtypeConstraintRef)
669
+ end
670
+ rule(:subtypeConstraint) do
671
+ (tOF >> op_leftparen >> supertypeExpression >> op_rightparen).as(:subtypeConstraint)
672
+ end
673
+ rule(:subtypeDeclaration) do
674
+ (tSUBTYPE >> tOF >> op_leftparen >> entityRef >> (op_comma >> entityRef).repeat >> op_rightparen).as(:listOf_entityRef).as(:subtypeDeclaration)
675
+ end
676
+ rule(:supertypeConstraint) do
677
+ (abstractSupertypeDeclaration | abstractEntityDeclaration | supertypeRule).as(:supertypeConstraint)
678
+ end
679
+ rule(:supertypeExpression) do
680
+ (supertypeFactor >> (tANDOR.as(:operator) >> supertypeFactor).as(:item).repeat.as(:rhs)).as(:supertypeExpression)
681
+ end
682
+ rule(:supertypeFactor) do
683
+ (supertypeTerm >> (tAND.as(:operator) >> supertypeTerm).as(:item).repeat.as(:rhs)).as(:supertypeFactor)
684
+ end
685
+ rule(:supertypeRule) do
686
+ (tSUPERTYPE >> subtypeConstraint).as(:supertypeRule)
687
+ end
688
+ rule(:supertypeTerm) do
689
+ (entityRef | oneOf | (op_leftparen >> supertypeExpression >> op_rightparen)).as(:supertypeTerm)
690
+ end
691
+ rule(:syntax) do
692
+ (spaces.as(:spaces) >> schemaDecl.repeat(1).as(:schemaDecl) >> spaces.as(:trailer)).as(:syntax)
693
+ end
694
+ rule(:tailRemark) do
695
+ (str("--") >> (str("\n").absent? >> any).repeat >> str("\n").maybe).as(:tailRemark)
696
+ end
697
+ rule(:term) do
698
+ (factor >> (multiplicationLikeOp >> factor).as(:item).repeat.as(:rhs)).as(:term)
699
+ end
700
+ rule(:totalOver) do
701
+ (tTOTAL_OVER >> op_leftparen >> (entityRef >> (op_comma >> entityRef).repeat).as(:listOf_entityRef) >> op_rightparen >> op_delim).as(:totalOver)
702
+ end
703
+ rule(:typeDecl) do
704
+ (tTYPE >> typeId >> op_equals >> underlyingType >> op_delim >> whereClause.maybe >> tEND_TYPE >> op_delim.as(:op_delim2)).as(:typeDecl)
705
+ end
706
+ rule(:typeId) { simpleId.as(:typeId) }
707
+ rule(:typeLabelId) { simpleId.as(:typeLabelId) }
708
+ rule(:typeLabelRef) { typeLabelId.as(:typeLabelRef) }
709
+ rule(:typeLabel) { (typeLabelId | typeLabelRef).as(:typeLabel) }
710
+ rule(:typeRef) { typeId.as(:typeRef) }
711
+ rule(:unaryOp) { (op_plus | op_minus | tNOT).as(:unaryOp) }
712
+ rule(:underlyingType) do
713
+ (concreteTypes | constructedTypes).as(:underlyingType)
714
+ end
715
+ rule(:uniqueClause) do
716
+ (tUNIQUE >> (uniqueRule >> op_delim >> (uniqueRule >> op_delim.as(:op_delim2)).repeat).as(:listOf_uniqueRule)).as(:uniqueClause)
717
+ end
718
+ rule(:uniqueRule) do
719
+ ((ruleLabelId >> op_colon).maybe >> (referencedAttribute >> (op_comma >> referencedAttribute).repeat).as(:listOf_referencedAttribute)).as(:uniqueRule)
720
+ end
721
+ rule(:untilControl) { (tUNTIL >> logicalExpression).as(:untilControl) }
722
+ rule(:useClause) do
723
+ (tUSE >> tFROM >> schemaRef >>
724
+ (op_leftparen >> (namedTypeOrRename >> (op_comma >>
725
+ namedTypeOrRename).repeat).as(:listOf_namedTypeOrRename) >> op_rightparen).maybe >> op_delim).as(:useClause)
726
+ end
727
+ rule(:variableId) { simpleId.as(:variableId) }
728
+ rule(:variableRef) { variableId.as(:variableRef) }
729
+ rule(:whereClause) do
730
+ (tWHERE >> (domainRule >> op_delim).repeat.as(:listOf_domainRule)).as(:whereClause)
731
+ end
732
+ rule(:whileControl) { (tWHILE >> logicalExpression).as(:whileControl) }
733
+ rule(:width) { numericExpression.as(:width) }
734
+ rule(:widthSpec) do
735
+ (op_leftparen >> width >> op_rightparen >> tFIXED.maybe).as(:widthSpec)
736
+ end
737
+ end
738
+ end
739
+ end
740
+ end