expressir 2.4.29-aarch64-mingw-ucrt

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 (424) hide show
  1. checksums.yaml +7 -0
  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 +19 -0
  9. data/.github/workflows/release.yml +37 -0
  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 +55 -0
  15. data/.hound.yml +3 -0
  16. data/.rspec +2 -0
  17. data/.rubocop.yml +18 -0
  18. data/.rubocop_todo.yml +297 -0
  19. data/CHANGELOG.md +159 -0
  20. data/Gemfile +18 -0
  21. data/README.adoc +2783 -0
  22. data/Rakefile +41 -0
  23. data/TODO.bugs/01-stale-transformer-autoload.md +39 -0
  24. data/TODO.bugs/02-parser-class-instance-vars.md +36 -0
  25. data/TODO.bugs/03-builder-mutable-state.md +43 -0
  26. data/TODO.bugs/04-formatter-public-send-dispatch.md +53 -0
  27. data/TODO.bugs/05-anonymous-formatter-subclass.md +45 -0
  28. data/TODO.bugs/06-collection-registry-single-source.md +53 -0
  29. data/TODO.bugs/07-require-relative-cleanup.md +42 -0
  30. data/TODO.bugs/08-require-expressir-in-commands.md +34 -0
  31. data/TODO.bugs/09-parser-split.md +53 -0
  32. data/TODO.bugs/10-to-s-override.md +42 -0
  33. data/TODO.bugs/11-parser-class-variables.md +39 -0
  34. data/TODO.bugs/12-marker-modules-vs-registry.md +64 -0
  35. data/TODO.bugs/13-string-literal-scanner-limitation.md +52 -0
  36. data/TODO.bugs/14-model-formatting-leak.md +30 -0
  37. data/TODO.bugs/15-expression-children-macro.md +27 -0
  38. data/TODO.bugs/16-pretty-formatter-duplication.md +28 -0
  39. data/TODO.bugs/17-snake-case-cache-mutable-constant.md +28 -0
  40. data/TODO.bugs/18-const-get-private-constants.md +30 -0
  41. data/TODO.bugs/19-format-methods-public.md +22 -0
  42. data/TODO.bugs/20-coverage-nested-entities-dedup.md +20 -0
  43. data/TODO.bugs/21-operator-tokens-secondary-dispatch.md +21 -0
  44. data/TODO.bugs/22-builder-fast-path-wrappers.md +32 -0
  45. data/TODO.bugs/23-coverage-inverse-maps.md +21 -0
  46. data/TODO.bugs/24-streaming-builder-complexity.md +19 -0
  47. data/TODO.bugs/25-debug-puts-in-production.md +21 -0
  48. data/TODO.bugs/26-generic-entity-children-misplaced.md +21 -0
  49. data/TODO.bugs/27-package-build-god-method.md +19 -0
  50. data/TODO.bugs/28-package-god-class.md +30 -0
  51. data/TODO.bugs/29-validate-ascii-god-class.md +24 -0
  52. data/TODO.bugs/30-unicode-map-extraction.md +19 -0
  53. data/TODO.bugs/README.md +43 -0
  54. data/TODO.max-perf/01-restore-ci-green.md +36 -0
  55. data/TODO.max-perf/02-streaming-parse-path.md +31 -0
  56. data/TODO.max-perf/03-cli-parallel-opt-in.md +27 -0
  57. data/TODO.max-perf/04-benchmark-harness.md +28 -0
  58. data/TODO.max-perf/05-parallel-fidelity-specs.md +22 -0
  59. data/TODO.max-perf/06-builder-cpu-audit.md +41 -0
  60. data/TODO.max-perf/07-upstream-parsanol-roadmap.md +27 -0
  61. data/TODO.max-perf/08-builder-build-perf.md +45 -0
  62. data/TODO.max-perf/09-grammar-cold-start.md +25 -0
  63. data/TODO.max-perf/10-parser-facade-hygiene.md +23 -0
  64. data/TODO.max-perf/11-ci-green-closeout.md +25 -0
  65. data/TODO.max-perf/12-require-boot-profile.md +25 -0
  66. data/TODO.max-perf/13-key-conversion-specs.md +26 -0
  67. data/TODO.max-perf/14-builder-call-handler-audit.md +28 -0
  68. data/TODO.parity-ee/00-overview.md +76 -0
  69. data/TODO.parity-ee/01-annex-g-rule-extraction.md +41 -0
  70. data/TODO.parity-ee/02-eeng-algorithm-inventory.md +8 -0
  71. data/TODO.parity-ee/03-eeng-oracle-harness.md +33 -0
  72. data/TODO.parity-ee/04-shtolo-concatenate.md +44 -0
  73. data/TODO.parity-ee/05-shtolo-longform-flatten.md +53 -0
  74. data/TODO.parity-ee/06-interface-scheduling-parity.md +47 -0
  75. data/TODO.parity-ee/07-semantic-checks-port.md +35 -0
  76. data/TODO.parity-ee/08-pretty-roundtrip-gate.md +27 -0
  77. data/TODO.parity-ee/09-smrl-index-and-listing.md +22 -0
  78. data/TODO.parity-ee/10-interface-dot-graph.md +21 -0
  79. data/TODO.parity-ee/11-import-eeng-tests.md +79 -0
  80. data/TODO.parity-ee/12-full-check-catalog.md +67 -0
  81. data/TODO.parity-ee/13-population-p21.md +54 -0
  82. data/TODO.parity-ee/14-shtolo-completion.md +44 -0
  83. data/TODO.parity-ee/15-part28-xml.md +51 -0
  84. data/TODO.parity-ee/16-compare-patch.md +48 -0
  85. data/TODO.parity-ee/17-official-tests.md +42 -0
  86. data/TODO.parity-ee/18-mim-mapping.md +47 -0
  87. data/TODO.parity-ee/19-architecture.md +97 -0
  88. data/TODO.parity-ee/parity-matrix.md +108 -0
  89. data/TODO.refpath-v2/00-overview.md +64 -0
  90. data/TODO.suma-improvements/00-overview.md +23 -0
  91. data/TODO.suma-improvements/01-prebuilt-platform-gems.md +33 -0
  92. data/TODO.suma-improvements/02-suma-e2e.md +39 -0
  93. data/TODO.suma-improvements/03-item-graph.md +22 -0
  94. data/TODO.suma-improvements/04-compiled-set-default.md +16 -0
  95. data/TODO.suma-improvements/05-validation-in-docs.md +17 -0
  96. data/TODO.suma-improvements/06-memory-remeasure.md +36 -0
  97. data/TODO.suma-improvements/07-part28-xml.md +15 -0
  98. data/TODO.suma-improvements/08-windows-gnu-toolchain.md +15 -0
  99. data/TODO.suma-improvements/09-checker-tranche3.md +13 -0
  100. data/TODO.suma-improvements/10-expressdoc.md +8 -0
  101. data/benchmark/srl_benchmark.rb +458 -0
  102. data/benchmark/srl_native_benchmark.rb +146 -0
  103. data/benchmark/srl_ruby_benchmark.rb +132 -0
  104. data/bin/console +11 -0
  105. data/bin/rspec +30 -0
  106. data/bin/setup +8 -0
  107. data/docs/Gemfile +12 -0
  108. data/docs/_config.yml +141 -0
  109. data/docs/_guides/changes/changes-format.adoc +778 -0
  110. data/docs/_guides/changes/importing-eengine.adoc +898 -0
  111. data/docs/_guides/changes/index.adoc +396 -0
  112. data/docs/_guides/changes/programmatic-usage.adoc +1038 -0
  113. data/docs/_guides/changes/validating-changes.adoc +681 -0
  114. data/docs/_guides/cli/benchmark-performance.adoc +834 -0
  115. data/docs/_guides/cli/coverage-analysis.adoc +921 -0
  116. data/docs/_guides/cli/format-schemas.adoc +547 -0
  117. data/docs/_guides/cli/index.adoc +8 -0
  118. data/docs/_guides/cli/managing-changes.adoc +927 -0
  119. data/docs/_guides/cli/validate-ascii.adoc +645 -0
  120. data/docs/_guides/cli/validate-schemas.adoc +534 -0
  121. data/docs/_guides/formatter/formatter-architecture.adoc +401 -0
  122. data/docs/_guides/index.adoc +165 -0
  123. data/docs/_guides/ler/creating-packages.adoc +664 -0
  124. data/docs/_guides/ler/index.adoc +305 -0
  125. data/docs/_guides/ler/loading-packages.adoc +707 -0
  126. data/docs/_guides/ler/package-formats.adoc +748 -0
  127. data/docs/_guides/ler/querying-packages.adoc +826 -0
  128. data/docs/_guides/ler/step-packages.adoc +385 -0
  129. data/docs/_guides/ler/validating-packages.adoc +750 -0
  130. data/docs/_guides/liquid/basic-templates.adoc +813 -0
  131. data/docs/_guides/liquid/documentation-generation.adoc +1042 -0
  132. data/docs/_guides/liquid/drops-reference.adoc +829 -0
  133. data/docs/_guides/liquid/filters-and-tags.adoc +912 -0
  134. data/docs/_guides/liquid/index.adoc +468 -0
  135. data/docs/_guides/manifests/creating-manifests.adoc +483 -0
  136. data/docs/_guides/manifests/index.adoc +307 -0
  137. data/docs/_guides/manifests/resolving-manifests.adoc +557 -0
  138. data/docs/_guides/manifests/validating-manifests.adoc +713 -0
  139. data/docs/_guides/ruby-api/formatting-schemas.adoc +605 -0
  140. data/docs/_guides/ruby-api/index.adoc +257 -0
  141. data/docs/_guides/ruby-api/parsing-files.adoc +421 -0
  142. data/docs/_guides/ruby-api/search-engine.adoc +609 -0
  143. data/docs/_guides/ruby-api/working-with-repository.adoc +577 -0
  144. data/docs/_pages/data-model.adoc +665 -0
  145. data/docs/_pages/express-language.adoc +506 -0
  146. data/docs/_pages/getting-started.adoc +414 -0
  147. data/docs/_pages/index.adoc +116 -0
  148. data/docs/_pages/introduction.adoc +256 -0
  149. data/docs/_pages/ler-packages.adoc +837 -0
  150. data/docs/_pages/parsers.adoc +709 -0
  151. data/docs/_pages/schema-manifests.adoc +431 -0
  152. data/docs/_references/index.adoc +228 -0
  153. data/docs/_tutorials/creating-ler-package.adoc +735 -0
  154. data/docs/_tutorials/documentation-coverage.adoc +795 -0
  155. data/docs/_tutorials/formatting-schemas.adoc +89 -0
  156. data/docs/_tutorials/index.adoc +231 -0
  157. data/docs/_tutorials/liquid-templates.adoc +806 -0
  158. data/docs/_tutorials/parsing-your-first-schema.adoc +522 -0
  159. data/docs/_tutorials/querying-schemas.adoc +751 -0
  160. data/docs/_tutorials/working-with-multiple-schemas.adoc +676 -0
  161. data/docs/index.adoc +242 -0
  162. data/docs/lychee.toml +90 -0
  163. data/examples/demo_ler_usage.sh +86 -0
  164. data/examples/ler/README.md +111 -0
  165. data/examples/ler/simple_example.ler +0 -0
  166. data/examples/ler/simple_schema.exp +33 -0
  167. data/examples/ler_build.rb +75 -0
  168. data/examples/ler_cli.rb +79 -0
  169. data/examples/ler_demo_complete.rb +276 -0
  170. data/examples/ler_query.rb +91 -0
  171. data/examples/ler_query_examples.rb +305 -0
  172. data/examples/ler_stats.rb +81 -0
  173. data/examples/phase3_demo.rb +159 -0
  174. data/examples/query_demo_simple.rb +131 -0
  175. data/exe/expressir +11 -0
  176. data/exe/expressir-format +14 -0
  177. data/exe/expressir-format-test +82 -0
  178. data/expressir.gemspec +61 -0
  179. data/lib/expressir/3.4/expressir_core.so +0 -0
  180. data/lib/expressir/4.0/expressir_core.so +0 -0
  181. data/lib/expressir/benchmark.rb +310 -0
  182. data/lib/expressir/changes/item_change.rb +20 -0
  183. data/lib/expressir/changes/mapping_change.rb +16 -0
  184. data/lib/expressir/changes/schema_change.rb +85 -0
  185. data/lib/expressir/changes/version_change.rb +26 -0
  186. data/lib/expressir/changes.rb +9 -0
  187. data/lib/expressir/cli.rb +148 -0
  188. data/lib/expressir/commands/base.rb +25 -0
  189. data/lib/expressir/commands/benchmark.rb +59 -0
  190. data/lib/expressir/commands/benchmark_cache.rb +80 -0
  191. data/lib/expressir/commands/changes.rb +34 -0
  192. data/lib/expressir/commands/changes_import_eengine.rb +146 -0
  193. data/lib/expressir/commands/changes_validate.rb +63 -0
  194. data/lib/expressir/commands/check.rb +56 -0
  195. data/lib/expressir/commands/clean.rb +20 -0
  196. data/lib/expressir/commands/coverage.rb +458 -0
  197. data/lib/expressir/commands/expand.rb +26 -0
  198. data/lib/expressir/commands/file_violations.rb +70 -0
  199. data/lib/expressir/commands/fix.rb +33 -0
  200. data/lib/expressir/commands/flatten.rb +29 -0
  201. data/lib/expressir/commands/format.rb +43 -0
  202. data/lib/expressir/commands/manifest.rb +420 -0
  203. data/lib/expressir/commands/mapping_validate.rb +68 -0
  204. data/lib/expressir/commands/non_ascii_character.rb +49 -0
  205. data/lib/expressir/commands/non_ascii_violation_collection.rb +301 -0
  206. data/lib/expressir/commands/package.rb +1222 -0
  207. data/lib/expressir/commands/parity_inputs.rb +160 -0
  208. data/lib/expressir/commands/validate.rb +106 -0
  209. data/lib/expressir/commands/validate_ascii.rb +94 -0
  210. data/lib/expressir/commands/validate_load.rb +91 -0
  211. data/lib/expressir/commands/version.rb +9 -0
  212. data/lib/expressir/commands/xsd.rb +23 -0
  213. data/lib/expressir/commands.rb +30 -0
  214. data/lib/expressir/config.rb +60 -0
  215. data/lib/expressir/coverage.rb +510 -0
  216. data/lib/expressir/eengine/arm_compare_report.rb +23 -0
  217. data/lib/expressir/eengine/changes_section.rb +16 -0
  218. data/lib/expressir/eengine/compare_report.rb +69 -0
  219. data/lib/expressir/eengine/mim_compare_report.rb +23 -0
  220. data/lib/expressir/eengine/modified_object.rb +21 -0
  221. data/lib/expressir/eengine.rb +9 -0
  222. data/lib/expressir/errors.rb +113 -0
  223. data/lib/expressir/express/adoc_hyperlink_formatter.rb +30 -0
  224. data/lib/expressir/express/adoc_source_formatter.rb +12 -0
  225. data/lib/expressir/express/ast_key_converter.rb +114 -0
  226. data/lib/expressir/express/builder.rb +277 -0
  227. data/lib/expressir/express/builder_context.rb +22 -0
  228. data/lib/expressir/express/builder_registry.rb +397 -0
  229. data/lib/expressir/express/builders/attribute_decl_builder.rb +32 -0
  230. data/lib/expressir/express/builders/built_in_builder.rb +75 -0
  231. data/lib/expressir/express/builders/constant_builder.rb +108 -0
  232. data/lib/expressir/express/builders/declaration_builder.rb +20 -0
  233. data/lib/expressir/express/builders/derive_clause_builder.rb +14 -0
  234. data/lib/expressir/express/builders/derived_attr_builder.rb +28 -0
  235. data/lib/expressir/express/builders/domain_rule_builder.rb +21 -0
  236. data/lib/expressir/express/builders/entity_decl_builder.rb +116 -0
  237. data/lib/expressir/express/builders/explicit_attr_builder.rb +49 -0
  238. data/lib/expressir/express/builders/expression_builder.rb +416 -0
  239. data/lib/expressir/express/builders/function_decl_builder.rb +86 -0
  240. data/lib/expressir/express/builders/helpers.rb +148 -0
  241. data/lib/expressir/express/builders/interface_builder.rb +151 -0
  242. data/lib/expressir/express/builders/inverse_attr_builder.rb +43 -0
  243. data/lib/expressir/express/builders/inverse_attr_type_builder.rb +30 -0
  244. data/lib/expressir/express/builders/inverse_clause_builder.rb +14 -0
  245. data/lib/expressir/express/builders/literal_builder.rb +93 -0
  246. data/lib/expressir/express/builders/procedure_decl_builder.rb +82 -0
  247. data/lib/expressir/express/builders/qualifier_builder.rb +102 -0
  248. data/lib/expressir/express/builders/reference_builder.rb +18 -0
  249. data/lib/expressir/express/builders/rule_decl_builder.rb +97 -0
  250. data/lib/expressir/express/builders/schema_body_decl_builder.rb +18 -0
  251. data/lib/expressir/express/builders/schema_decl_builder.rb +56 -0
  252. data/lib/expressir/express/builders/schema_version_builder.rb +34 -0
  253. data/lib/expressir/express/builders/simple_id_builder.rb +17 -0
  254. data/lib/expressir/express/builders/statement_builder.rb +243 -0
  255. data/lib/expressir/express/builders/subtype_constraint_builder.rb +166 -0
  256. data/lib/expressir/express/builders/syntax_builder.rb +30 -0
  257. data/lib/expressir/express/builders/type_builder.rb +238 -0
  258. data/lib/expressir/express/builders/type_decl_builder.rb +26 -0
  259. data/lib/expressir/express/builders/unique_clause_builder.rb +20 -0
  260. data/lib/expressir/express/builders/unique_rule_builder.rb +41 -0
  261. data/lib/expressir/express/builders/where_clause_builder.rb +20 -0
  262. data/lib/expressir/express/builders.rb +55 -0
  263. data/lib/expressir/express/cache.rb +76 -0
  264. data/lib/expressir/express/checker.rb +812 -0
  265. data/lib/expressir/express/concatenator.rb +79 -0
  266. data/lib/expressir/express/core.rb +95 -0
  267. data/lib/expressir/express/error.rb +124 -0
  268. data/lib/expressir/express/formatter.rb +149 -0
  269. data/lib/expressir/express/formatters/data_types_formatter.rb +362 -0
  270. data/lib/expressir/express/formatters/declarations_formatter.rb +753 -0
  271. data/lib/expressir/express/formatters/expressions_formatter.rb +180 -0
  272. data/lib/expressir/express/formatters/literals_formatter.rb +55 -0
  273. data/lib/expressir/express/formatters/references_formatter.rb +53 -0
  274. data/lib/expressir/express/formatters/remark_formatter.rb +270 -0
  275. data/lib/expressir/express/formatters/remark_item_formatter.rb +28 -0
  276. data/lib/expressir/express/formatters/statements_formatter.rb +272 -0
  277. data/lib/expressir/express/formatters/supertype_expressions_formatter.rb +54 -0
  278. data/lib/expressir/express/formatters.rb +22 -0
  279. data/lib/expressir/express/grammar/parser.rb +712 -0
  280. data/lib/expressir/express/grammar.rb +11 -0
  281. data/lib/expressir/express/hyperlink_formatter.rb +35 -0
  282. data/lib/expressir/express/interface_dot.rb +105 -0
  283. data/lib/expressir/express/lazy_repository.rb +211 -0
  284. data/lib/expressir/express/line_map.rb +48 -0
  285. data/lib/expressir/express/listing.rb +174 -0
  286. data/lib/expressir/express/model_traversal.rb +42 -0
  287. data/lib/expressir/express/model_visitor.rb +25 -0
  288. data/lib/expressir/express/node_position_index.rb +342 -0
  289. data/lib/expressir/express/parallel_files.rb +229 -0
  290. data/lib/expressir/express/parser.rb +523 -0
  291. data/lib/expressir/express/pretty_formatter.rb +586 -0
  292. data/lib/expressir/express/pretty_gate.rb +61 -0
  293. data/lib/expressir/express/refs_overlay.rb +47 -0
  294. data/lib/expressir/express/remark_attacher.rb +1098 -0
  295. data/lib/expressir/express/remark_overlay.rb +86 -0
  296. data/lib/expressir/express/remark_scanner.rb +245 -0
  297. data/lib/expressir/express/resolve_references_model_visitor.rb +29 -0
  298. data/lib/expressir/express/schema_block_scanner.rb +137 -0
  299. data/lib/expressir/express/schema_head_formatter.rb +22 -0
  300. data/lib/expressir/express/schema_plain_source_formatter.rb +11 -0
  301. data/lib/expressir/express/schema_source_formatter.rb +15 -0
  302. data/lib/expressir/express/scope_resolver.rb +223 -0
  303. data/lib/expressir/express/self_schema_reference.rb +126 -0
  304. data/lib/expressir/express/shtolo.rb +679 -0
  305. data/lib/expressir/express/smrl_xml.rb +125 -0
  306. data/lib/expressir/express/source_formatter.rb +15 -0
  307. data/lib/expressir/express/streaming_builder.rb +435 -0
  308. data/lib/expressir/express/xsd.rb +259 -0
  309. data/lib/expressir/express.rb +53 -0
  310. data/lib/expressir/liquid.rb +1 -0
  311. data/lib/expressir/manifest/resolver.rb +210 -0
  312. data/lib/expressir/manifest/validator.rb +192 -0
  313. data/lib/expressir/manifest.rb +6 -0
  314. data/lib/expressir/mapping/refpath.rb +857 -0
  315. data/lib/expressir/mapping.rb +253 -0
  316. data/lib/expressir/model/cache.rb +18 -0
  317. data/lib/expressir/model/concerns.rb +42 -0
  318. data/lib/expressir/model/data_types/aggregate.rb +26 -0
  319. data/lib/expressir/model/data_types/array.rb +25 -0
  320. data/lib/expressir/model/data_types/bag.rb +21 -0
  321. data/lib/expressir/model/data_types/binary.rb +19 -0
  322. data/lib/expressir/model/data_types/boolean.rb +15 -0
  323. data/lib/expressir/model/data_types/enumeration.rb +21 -0
  324. data/lib/expressir/model/data_types/enumeration_item.rb +24 -0
  325. data/lib/expressir/model/data_types/generic.rb +24 -0
  326. data/lib/expressir/model/data_types/generic_entity.rb +24 -0
  327. data/lib/expressir/model/data_types/integer.rb +15 -0
  328. data/lib/expressir/model/data_types/list.rb +23 -0
  329. data/lib/expressir/model/data_types/logical.rb +15 -0
  330. data/lib/expressir/model/data_types/number.rb +15 -0
  331. data/lib/expressir/model/data_types/real.rb +17 -0
  332. data/lib/expressir/model/data_types/select.rb +23 -0
  333. data/lib/expressir/model/data_types/set.rb +21 -0
  334. data/lib/expressir/model/data_types/string.rb +19 -0
  335. data/lib/expressir/model/data_types.rb +25 -0
  336. data/lib/expressir/model/declarations/attribute.rb +38 -0
  337. data/lib/expressir/model/declarations/constant.rb +28 -0
  338. data/lib/expressir/model/declarations/derived_attribute.rb +25 -0
  339. data/lib/expressir/model/declarations/entity.rb +62 -0
  340. data/lib/expressir/model/declarations/function.rb +59 -0
  341. data/lib/expressir/model/declarations/informal_proposition_rule.rb +25 -0
  342. data/lib/expressir/model/declarations/interface.rb +37 -0
  343. data/lib/expressir/model/declarations/interface_item.rb +21 -0
  344. data/lib/expressir/model/declarations/interfaced_item.rb +33 -0
  345. data/lib/expressir/model/declarations/inverse_attribute.rb +25 -0
  346. data/lib/expressir/model/declarations/parameter.rb +28 -0
  347. data/lib/expressir/model/declarations/procedure.rb +57 -0
  348. data/lib/expressir/model/declarations/remark_item.rb +21 -0
  349. data/lib/expressir/model/declarations/rule.rb +66 -0
  350. data/lib/expressir/model/declarations/schema.rb +215 -0
  351. data/lib/expressir/model/declarations/schema_version.rb +19 -0
  352. data/lib/expressir/model/declarations/schema_version_item.rb +19 -0
  353. data/lib/expressir/model/declarations/subtype_constraint.rb +32 -0
  354. data/lib/expressir/model/declarations/type.rb +45 -0
  355. data/lib/expressir/model/declarations/unique_rule.rb +26 -0
  356. data/lib/expressir/model/declarations/variable.rb +28 -0
  357. data/lib/expressir/model/declarations/where_rule.rb +26 -0
  358. data/lib/expressir/model/declarations.rb +31 -0
  359. data/lib/expressir/model/dependency_resolver.rb +268 -0
  360. data/lib/expressir/model/exp_file.rb +42 -0
  361. data/lib/expressir/model/expressions/aggregate_initializer.rb +18 -0
  362. data/lib/expressir/model/expressions/aggregate_initializer_item.rb +20 -0
  363. data/lib/expressir/model/expressions/binary_expression.rb +59 -0
  364. data/lib/expressir/model/expressions/entity_constructor.rb +20 -0
  365. data/lib/expressir/model/expressions/function_call.rb +20 -0
  366. data/lib/expressir/model/expressions/interval.rb +29 -0
  367. data/lib/expressir/model/expressions/query_expression.rb +31 -0
  368. data/lib/expressir/model/expressions/unary_expression.rb +25 -0
  369. data/lib/expressir/model/expressions.rb +18 -0
  370. data/lib/expressir/model/identifier.rb +26 -0
  371. data/lib/expressir/model/indexes/entity_index.rb +103 -0
  372. data/lib/expressir/model/indexes/item_graph.rb +185 -0
  373. data/lib/expressir/model/indexes/reference_index.rb +148 -0
  374. data/lib/expressir/model/indexes/type_index.rb +149 -0
  375. data/lib/expressir/model/indexes.rb +12 -0
  376. data/lib/expressir/model/interface_validator.rb +384 -0
  377. data/lib/expressir/model/literals/binary.rb +17 -0
  378. data/lib/expressir/model/literals/integer.rb +17 -0
  379. data/lib/expressir/model/literals/logical.rb +21 -0
  380. data/lib/expressir/model/literals/real.rb +17 -0
  381. data/lib/expressir/model/literals/string.rb +20 -0
  382. data/lib/expressir/model/literals.rb +13 -0
  383. data/lib/expressir/model/model_element.rb +377 -0
  384. data/lib/expressir/model/references/attribute_reference.rb +19 -0
  385. data/lib/expressir/model/references/group_reference.rb +19 -0
  386. data/lib/expressir/model/references/index_reference.rb +23 -0
  387. data/lib/expressir/model/references/simple_reference.rb +21 -0
  388. data/lib/expressir/model/references.rb +12 -0
  389. data/lib/expressir/model/remark_format.rb +17 -0
  390. data/lib/expressir/model/remark_info.rb +92 -0
  391. data/lib/expressir/model/remark_placement.rb +42 -0
  392. data/lib/expressir/model/repository.rb +483 -0
  393. data/lib/expressir/model/repository_validator.rb +293 -0
  394. data/lib/expressir/model/search_engine.rb +551 -0
  395. data/lib/expressir/model/statements/alias.rb +31 -0
  396. data/lib/expressir/model/statements/assignment.rb +23 -0
  397. data/lib/expressir/model/statements/case.rb +42 -0
  398. data/lib/expressir/model/statements/case_action.rb +20 -0
  399. data/lib/expressir/model/statements/compound.rb +21 -0
  400. data/lib/expressir/model/statements/escape.rb +18 -0
  401. data/lib/expressir/model/statements/if.rb +26 -0
  402. data/lib/expressir/model/statements/null.rb +18 -0
  403. data/lib/expressir/model/statements/procedure_call.rb +22 -0
  404. data/lib/expressir/model/statements/repeat.rb +40 -0
  405. data/lib/expressir/model/statements/return.rb +20 -0
  406. data/lib/expressir/model/statements/skip.rb +18 -0
  407. data/lib/expressir/model/statements.rb +20 -0
  408. data/lib/expressir/model/supertype_expressions/binary_supertype_expression.rb +25 -0
  409. data/lib/expressir/model/supertype_expressions/oneof_supertype_expression.rb +17 -0
  410. data/lib/expressir/model/supertype_expressions.rb +12 -0
  411. data/lib/expressir/model.rb +39 -0
  412. data/lib/expressir/package/builder.rb +231 -0
  413. data/lib/expressir/package/metadata.rb +79 -0
  414. data/lib/expressir/package/reader.rb +149 -0
  415. data/lib/expressir/package.rb +8 -0
  416. data/lib/expressir/schema_manifest.rb +159 -0
  417. data/lib/expressir/schema_manifest_entry.rb +15 -0
  418. data/lib/expressir/version.rb +8 -0
  419. data/lib/expressir.rb +94 -0
  420. data/lib/tasks/verify_remarks.rake +16 -0
  421. data/rakelib/native.rake +24 -0
  422. data/rakelib/oracle.rake +52 -0
  423. data/rakelib/verify_remarks.rake +16 -0
  424. metadata +690 -0
@@ -0,0 +1,148 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Expressir
4
+ module Express
5
+ module Builders
6
+ # Shared helper methods for all builders.
7
+ # Included as a module to avoid duplication.
8
+ module Helpers
9
+ # Extract text from Parsanol::Slice or return as-is
10
+ def extract_text(val)
11
+ return nil unless val
12
+ return val.to_s if val.is_a?(String)
13
+ return val.to_s if val.is_a?(Symbol)
14
+ return val.to_s if val.is_a?(Parsanol::Slice)
15
+
16
+ if val.is_a?(Hash)
17
+ str = val[:str]
18
+ return str.to_s if str
19
+ end
20
+ val
21
+ end
22
+
23
+ # Get first value from a hash (for union types)
24
+ def first_value(hash)
25
+ return nil unless hash.is_a?(Hash)
26
+
27
+ hash.values.first
28
+ end
29
+
30
+ # Recursively extract text from nested structures
31
+ def extract_nested_text(data)
32
+ return nil unless data
33
+ return data.to_s if data.is_a?(String)
34
+ return data.to_s if data.is_a?(Symbol)
35
+ return data.to_s if data.is_a?(Parsanol::Slice)
36
+
37
+ if data.is_a?(Hash)
38
+ str = data[:str]
39
+ return str.to_s if str
40
+
41
+ data.each_value do |value|
42
+ result = extract_nested_text(value)
43
+ return result if result
44
+ end
45
+ elsif data.is_a?(Array)
46
+ data.each do |item|
47
+ result = extract_nested_text(item)
48
+ return result if result
49
+ end
50
+ end
51
+ nil
52
+ end
53
+
54
+ # Extract ID from reference types like functionId, constantId, etc.
55
+ def extract_id_ref(data)
56
+ id_data = data[:function_id] || data[:constant_id] || data[:parameter_id] ||
57
+ data[:variable_id] || data[:attribute_id] || data[:entity_id] ||
58
+ data[:type_id] || data[:procedure_id] || data[:schema_id] ||
59
+ data[:type_label_id] || data[:enumeration_id] || data[:rename_id] ||
60
+ data[:simple_id]
61
+
62
+ extract_nested_text(id_data || first_value(data))
63
+ end
64
+
65
+ # Extract interval operator
66
+ def extract_interval_op(data)
67
+ return nil unless data
68
+
69
+ if data.is_a?(Array)
70
+ data.each do |item|
71
+ next unless item.is_a?(Hash)
72
+ return "LESS_THAN" if item[:op_less_than]
73
+ return "LESS_THAN_OR_EQUAL" if item[:op_less_equal]
74
+ end
75
+ nil
76
+ elsif data.is_a?(Hash)
77
+ return "LESS_THAN" if data[:op_less_than]
78
+ return "LESS_THAN_OR_EQUAL" if data[:op_less_equal]
79
+
80
+ nil
81
+ end
82
+ end
83
+
84
+ # Extract binary operator
85
+ def extract_operator(data)
86
+ return nil unless data
87
+ return :ADDITION if data[:op_plus]
88
+ return :SUBTRACTION if data[:op_minus]
89
+ return :OR if data[:t_or]
90
+ return :XOR if data[:t_xor]
91
+ return :MULTIPLICATION if data[:op_asterisk]
92
+ return :REAL_DIVISION if data[:op_slash]
93
+ return :INTEGER_DIVISION if data[:t_div]
94
+ return :MODULO if data[:t_mod]
95
+ return :AND if data[:t_and]
96
+ return :COMBINE if data[:op_double_pipe]
97
+
98
+ extract_text(first_value(data))&.upcase&.to_sym
99
+ end
100
+
101
+ # Extract unary operator
102
+ def extract_unary_op(data)
103
+ return nil unless data
104
+ return :PLUS if data[:op_plus]
105
+ return :MINUS if data[:op_minus]
106
+ return :NOT if data[:t_not]
107
+
108
+ extract_text(first_value(data))&.upcase&.to_sym
109
+ end
110
+
111
+ # Extract relational operator
112
+ def extract_rel_op(data)
113
+ return nil unless data
114
+ return :EQUAL if data[:t_equal] || data[:op_equals]
115
+ return :NOT_EQUAL if data[:t_not_equal] || data[:op_less_greater]
116
+ return :LESS_THAN if data[:t_less_than] || data[:op_less_than]
117
+ return :GREATER_THAN if data[:t_greater_than] || data[:op_greater_than]
118
+ return :LESS_THAN_OR_EQUAL if data[:t_less_than_or_equal] || data[:op_less_equal]
119
+ return :GREATER_THAN_OR_EQUAL if data[:t_greater_than_or_equal] || data[:op_greater_equal]
120
+ return :INSTANCE_EQUAL if data[:t_instance_equal] || data[:op_colon_equals_colon]
121
+ return :INSTANCE_NOT_EQUAL if data[:t_instance_not_equal] || data[:op_colon_less_greater_colon]
122
+
123
+ extract_text(first_value(data))&.upcase&.to_sym
124
+ end
125
+
126
+ # Apply qualifier to reference
127
+ def apply_qualifier(ref, qualifier)
128
+ case qualifier
129
+ when Expressir::Model::References::AttributeReference
130
+ Expressir::Model::References::AttributeReference.new(ref: ref,
131
+ attribute: qualifier.attribute)
132
+ when Expressir::Model::References::GroupReference
133
+ Expressir::Model::References::GroupReference.new(ref: ref,
134
+ entity: qualifier.entity)
135
+ when Expressir::Model::References::IndexReference
136
+ Expressir::Model::References::IndexReference.new(ref: ref,
137
+ index1: qualifier.index1, index2: qualifier.index2)
138
+ when Expressir::Model::References::SimpleReference
139
+ Expressir::Model::References::AttributeReference.new(ref: ref,
140
+ attribute: qualifier)
141
+ else
142
+ ref
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,151 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Expressir
4
+ module Express
5
+ module Builders
6
+ # Builds interface specification nodes (use/reference clauses).
7
+ class InterfaceBuilder
8
+ def build_interface_specification(ast_data)
9
+ ast_data = ast_data[:interface_specification] if ast_data[:interface_specification]
10
+ if ast_data[:reference_clause]
11
+ Builder.build({ reference_clause: ast_data[:reference_clause] })
12
+ elsif ast_data[:use_clause]
13
+ Builder.build({ use_clause: ast_data[:use_clause] })
14
+ end
15
+ end
16
+
17
+ def build_use_clause(ast_data)
18
+ schema_ref_data = ast_data[:schema_ref]
19
+ schema = if schema_ref_data
20
+ Builder.build({ schema_ref: schema_ref_data })
21
+ end
22
+
23
+ list_data = ast_data[:list_of_named_type_or_rename]
24
+ items = build_items(list_data, :named_type_or_rename)
25
+
26
+ Expressir::Model::Declarations::Interface.new(
27
+ kind: Expressir::Model::Declarations::Interface::USE,
28
+ schema: schema,
29
+ items: items.compact,
30
+ )
31
+ end
32
+
33
+ def build_reference_clause(ast_data)
34
+ schema_ref_data = ast_data[:schema_ref]
35
+ schema = if schema_ref_data
36
+ Builder.build({ schema_ref: schema_ref_data })
37
+ end
38
+
39
+ list_data = ast_data[:list_of_resource_or_rename]
40
+ items = build_items(list_data, :resource_or_rename)
41
+
42
+ Expressir::Model::Declarations::Interface.new(
43
+ kind: Expressir::Model::Declarations::Interface::REFERENCE,
44
+ schema: schema,
45
+ items: items.compact,
46
+ )
47
+ end
48
+
49
+ def build_named_type_or_rename(ast_data)
50
+ named_types_data = ast_data[:named_types]
51
+ ref = if named_types_data.is_a?(Hash)
52
+ if named_types_data[:entity_ref]
53
+ Builder.build({ entity_ref: named_types_data[:entity_ref] })
54
+ elsif named_types_data[:type_ref]
55
+ Builder.build({ type_ref: named_types_data[:type_ref] })
56
+ end
57
+ end
58
+
59
+ id = nil
60
+ if ast_data[:entity_id].is_a?(Hash)
61
+ id = Builder.build({ entity_id: ast_data[:entity_id] })
62
+ elsif ast_data[:type_id].is_a?(Hash)
63
+ id = Builder.build({ type_id: ast_data[:type_id] })
64
+ end
65
+
66
+ Expressir::Model::Declarations::InterfaceItem.new(ref: ref, id: id)
67
+ end
68
+
69
+ def build_resource_or_rename(ast_data)
70
+ ref_data = ast_data[:resource_ref]
71
+ ref = if ref_data.is_a?(Hash)
72
+ if ref_data[:constant_ref]
73
+ Builder.build({ constant_ref: ref_data[:constant_ref] })
74
+ elsif ref_data[:entity_ref]
75
+ Builder.build({ entity_ref: ref_data[:entity_ref] })
76
+ elsif ref_data[:function_ref]
77
+ Builder.build({ function_ref: ref_data[:function_ref] })
78
+ elsif ref_data[:procedure_ref]
79
+ Builder.build({ procedure_ref: ref_data[:procedure_ref] })
80
+ elsif ref_data[:type_ref]
81
+ Builder.build({ type_ref: ref_data[:type_ref] })
82
+ end
83
+ end
84
+
85
+ id_data = ast_data[:rename_id]
86
+ id = if id_data.is_a?(Hash)
87
+ if id_data[:constant_id]
88
+ Builder.build({ constant_id: id_data[:constant_id] })
89
+ elsif id_data[:entity_id]
90
+ Builder.build({ entity_id: id_data[:entity_id] })
91
+ elsif id_data[:function_id]
92
+ Builder.build({ function_id: id_data[:function_id] })
93
+ elsif id_data[:procedure_id]
94
+ Builder.build({ procedure_id: id_data[:procedure_id] })
95
+ elsif id_data[:type_id]
96
+ Builder.build({ type_id: id_data[:type_id] })
97
+ end
98
+ end
99
+
100
+ Expressir::Model::Declarations::InterfaceItem.new(ref: ref, id: id)
101
+ end
102
+
103
+ def build_resource_ref(ast_data)
104
+ if ast_data[:constant_ref]
105
+ Builder.build({ constant_ref: ast_data[:constant_ref] })
106
+ elsif ast_data[:entity_ref]
107
+ Builder.build({ entity_ref: ast_data[:entity_ref] })
108
+ elsif ast_data[:function_ref]
109
+ Builder.build({ function_ref: ast_data[:function_ref] })
110
+ elsif ast_data[:procedure_ref]
111
+ Builder.build({ procedure_ref: ast_data[:procedure_ref] })
112
+ elsif ast_data[:type_ref]
113
+ Builder.build({ type_ref: ast_data[:type_ref] })
114
+ end
115
+ end
116
+
117
+ def build_rename_id(ast_data)
118
+ if ast_data[:constant_id]
119
+ Builder.build({ constant_id: ast_data[:constant_id] })
120
+ elsif ast_data[:entity_id]
121
+ Builder.build({ entity_id: ast_data[:entity_id] })
122
+ elsif ast_data[:function_id]
123
+ Builder.build({ function_id: ast_data[:function_id] })
124
+ elsif ast_data[:procedure_id]
125
+ Builder.build({ procedure_id: ast_data[:procedure_id] })
126
+ elsif ast_data[:type_id]
127
+ Builder.build({ type_id: ast_data[:type_id] })
128
+ end
129
+ end
130
+
131
+ private
132
+
133
+ def build_items(list_data, item_key)
134
+ if list_data.is_a?(Hash)
135
+ items_data = list_data[item_key]
136
+ items_data ? [Builder.build({ item_key => items_data })] : []
137
+ elsif list_data.is_a?(Array)
138
+ list_data.filter_map do |item|
139
+ next unless item.is_a?(Hash)
140
+
141
+ items_data = item[item_key]
142
+ Builder.build({ item_key => items_data }) if items_data
143
+ end
144
+ else
145
+ []
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Expressir
4
+ module Express
5
+ module Builders
6
+ # Builds inverse_attr nodes.
7
+ class InverseAttrBuilder
8
+ def call(ast_data)
9
+ attr_decl_data = ast_data[:attribute_decl]
10
+ attr = if attr_decl_data.is_a?(Hash)
11
+ Builder.build({ attribute_decl: attr_decl_data })
12
+ end
13
+
14
+ type_data = ast_data[:inverse_attr_type]
15
+ type = if type_data.is_a?(Hash)
16
+ Builder.build({ inverse_attr_type: type_data })
17
+ end
18
+
19
+ expression = if ast_data[:entity_ref]
20
+ ref = Builder.build({ entity_ref: ast_data[:entity_ref] })
21
+ attr_ref = if ast_data[:attribute_ref]
22
+ Builder.build({ attribute_ref: ast_data[:attribute_ref] })
23
+ end
24
+ Expressir::Model::References::AttributeReference.new(ref: ref,
25
+ attribute: attr_ref)
26
+ else
27
+ attr_ref_data = ast_data[:attribute_ref]
28
+ if attr_ref_data
29
+ Builder.build({ attribute_ref: attr_ref_data })
30
+ end
31
+ end
32
+
33
+ Expressir::Model::Declarations::InverseAttribute.new(
34
+ id: attr&.id,
35
+ supertype_attribute: attr&.supertype_attribute,
36
+ type: type,
37
+ expression: expression,
38
+ )
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Expressir
4
+ module Express
5
+ module Builders
6
+ # Builds inverse_attr_type nodes.
7
+ class InverseAttrTypeBuilder
8
+ def call(ast_data)
9
+ bound_spec = ast_data[:bound_spec] || {}
10
+ bound1 = Builder.build_optional(bound_spec[:bound1])
11
+ bound2 = Builder.build_optional(bound_spec[:bound2])
12
+ base_type_data = ast_data[:entity_ref]
13
+ base_type = if base_type_data.is_a?(Hash)
14
+ Builder.build({ entity_ref: base_type_data })
15
+ end
16
+
17
+ if ast_data[:t_set]
18
+ Expressir::Model::DataTypes::Set.new(bound1: bound1,
19
+ bound2: bound2, base_type: base_type)
20
+ elsif ast_data[:t_bag]
21
+ Expressir::Model::DataTypes::Bag.new(bound1: bound1,
22
+ bound2: bound2, base_type: base_type)
23
+ else
24
+ base_type
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Expressir
4
+ module Express
5
+ module Builders
6
+ # Builds inverse_clause nodes.
7
+ class InverseClauseBuilder
8
+ def call(ast_data)
9
+ Builder.build_children(ast_data[:inverse_attr])
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Expressir
4
+ module Express
5
+ module Builders
6
+ # Builds literal nodes (integer, real, binary, logical, string).
7
+ class LiteralBuilder
8
+ include ::Expressir::Express::Builders::Helpers
9
+
10
+ # Integer literal
11
+ def build_integer(ast_data)
12
+ val = extract_text(ast_data[:integer] || ast_data[:str])
13
+ Expressir::Model::Literals::Integer.new(value: val)
14
+ end
15
+
16
+ # Real literal
17
+ def build_real(ast_data)
18
+ val = extract_text(ast_data[:real] || ast_data[:str])
19
+ Expressir::Model::Literals::Real.new(value: val)
20
+ end
21
+
22
+ # Binary literal
23
+ def build_binary(ast_data)
24
+ val = extract_text(ast_data[:binary] || ast_data[:str])
25
+ Expressir::Model::Literals::Binary.new(value: val)
26
+ end
27
+
28
+ # Logical literal
29
+ def build_logical(ast_data)
30
+ value = if ast_data[:t_true]
31
+ Expressir::Model::Literals::Logical::TRUE
32
+ elsif ast_data[:t_false]
33
+ Expressir::Model::Literals::Logical::FALSE
34
+ elsif ast_data[:t_unknown]
35
+ Expressir::Model::Literals::Logical::UNKNOWN
36
+ else
37
+ val = extract_text(ast_data[:logical] || ast_data[:str]).to_s.strip.upcase
38
+ case val
39
+ when "TRUE" then Expressir::Model::Literals::Logical::TRUE
40
+ when "FALSE" then Expressir::Model::Literals::Logical::FALSE
41
+ else Expressir::Model::Literals::Logical::UNKNOWN
42
+ end
43
+ end
44
+ Expressir::Model::Literals::Logical.new(value: value)
45
+ end
46
+
47
+ # String literal
48
+ def build_string(ast_data)
49
+ if ast_data[:string_literal] && ast_data.keys.length == 1
50
+ ast_data = ast_data[:string_literal]
51
+ end
52
+
53
+ if ast_data[:simple_string_literal].is_a?(Hash)
54
+ build_simple_string(ast_data[:simple_string_literal])
55
+ elsif ast_data[:encoded_string_literal].is_a?(Hash)
56
+ build_encoded_string(ast_data[:encoded_string_literal])
57
+ else
58
+ val = extract_text(ast_data[:str])
59
+ val = val[1..-2] if val && val.length >= 2
60
+ Expressir::Model::Literals::String.new(value: val)
61
+ end
62
+ end
63
+
64
+ def build_simple_string(ast_data)
65
+ val = extract_text(ast_data[:str])
66
+ val = val[1..-2] if val && val.length >= 2
67
+ Expressir::Model::Literals::String.new(value: val)
68
+ end
69
+
70
+ def build_encoded_string(ast_data)
71
+ val = extract_text(ast_data[:str])
72
+ val = val[1..-2] if val && val.length >= 2
73
+ Expressir::Model::Literals::String.new(value: val, encoded: true)
74
+ end
75
+
76
+ # Generic literal dispatcher
77
+ def call(ast_data)
78
+ if ast_data[:binary_literal]
79
+ Builder.build({ binary_literal: ast_data[:binary_literal] })
80
+ elsif ast_data[:integer_literal]
81
+ Builder.build({ integer_literal: ast_data[:integer_literal] })
82
+ elsif ast_data[:logical_literal]
83
+ Builder.build({ logical_literal: ast_data[:logical_literal] })
84
+ elsif ast_data[:real_literal]
85
+ Builder.build({ real_literal: ast_data[:real_literal] })
86
+ elsif ast_data[:string_literal]
87
+ Builder.build({ string_literal: ast_data[:string_literal] })
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Expressir
4
+ module Express
5
+ module Builders
6
+ # Builds procedure declaration nodes.
7
+ class ProcedureDeclBuilder
8
+ def call(ast_data)
9
+ head = ast_data[:procedure_head]
10
+ algorithm_head = ast_data[:algorithm_head]
11
+ stmts = ast_data[:stmt]
12
+
13
+ id = Builder.build_optional(head[:procedure_id]) if head
14
+ parameters = build_parameters(head)
15
+
16
+ declarations = []
17
+ if algorithm_head.is_a?(Hash)
18
+ declarations = Builder.build_children(algorithm_head[:declaration])
19
+ end
20
+
21
+ types = declarations.grep(Expressir::Model::Declarations::Type)
22
+ entities = declarations.grep(Expressir::Model::Declarations::Entity)
23
+ subtype_constraints = declarations.grep(Expressir::Model::Declarations::SubtypeConstraint)
24
+ functions = declarations.grep(Expressir::Model::Declarations::Function)
25
+ procedures = declarations.grep(Expressir::Model::Declarations::Procedure)
26
+ constants = if algorithm_head.is_a?(Hash) && algorithm_head[:constant_decl]
27
+ build_constant_decl(algorithm_head[:constant_decl])
28
+ else
29
+ []
30
+ end
31
+ variables = if algorithm_head.is_a?(Hash) && algorithm_head[:local_decl]
32
+ build_local_decl(algorithm_head[:local_decl])
33
+ else
34
+ []
35
+ end
36
+ statements = Builder.build_children(stmts)
37
+
38
+ Expressir::Model::Declarations::Procedure.new(
39
+ id: id,
40
+ parameters: parameters,
41
+ types: types,
42
+ entities: entities,
43
+ subtype_constraints: subtype_constraints,
44
+ functions: functions,
45
+ procedures: procedures,
46
+ constants: constants,
47
+ variables: variables,
48
+ statements: statements.compact,
49
+ )
50
+ end
51
+
52
+ private
53
+
54
+ def build_parameters(head)
55
+ return [] unless head && head[:list_of_procedure_head_parameter]
56
+
57
+ params_data = head[:list_of_procedure_head_parameter]
58
+ if params_data.is_a?(Hash)
59
+ param_values = params_data[:procedure_head_parameter]
60
+ params_data = param_values.is_a?(Array) ? param_values : [param_values]
61
+ end
62
+
63
+ parameters = []
64
+ Builder.ensure_array(params_data).each do |param|
65
+ actual_param = param[:procedure_head_parameter] || param
66
+ result = Builder.build({ procedure_head_parameter: actual_param })
67
+ parameters.concat(Builder.ensure_array(result)) if result
68
+ end
69
+ parameters
70
+ end
71
+
72
+ def build_constant_decl(data)
73
+ Builder.build_children(data[:constant_body])
74
+ end
75
+
76
+ def build_local_decl(data)
77
+ Builder.build_children(data[:local_variable])
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Expressir
4
+ module Express
5
+ module Builders
6
+ # Builds qualifier nodes (attribute, group, index qualifiers).
7
+ class QualifierBuilder
8
+ def build_redeclared_attribute(ast_data)
9
+ qualified_attr = ast_data[:qualified_attribute]
10
+ if qualified_attr.is_a?(Hash)
11
+ Builder.build({ qualified_attribute: qualified_attr })
12
+ end
13
+ end
14
+
15
+ def build_referenced_attribute(ast_data)
16
+ if ast_data[:attribute_ref]
17
+ Builder.build({ attribute_ref: ast_data[:attribute_ref] })
18
+ elsif ast_data[:qualified_attribute]
19
+ Builder.build({ qualified_attribute: ast_data[:qualified_attribute] })
20
+ end
21
+ end
22
+
23
+ def build_qualified_attribute(ast_data)
24
+ # t_self is part of qualified_attribute grammar
25
+ self_ref = if ast_data[:t_self]
26
+ Expressir::Model::References::SimpleReference.new(id: "SELF")
27
+ end
28
+
29
+ # group_qualifier contains the entity reference
30
+ entity_ref = if ast_data[:group_qualifier]
31
+ Builder.build({ entity_ref: ast_data[:group_qualifier][:entity_ref] })
32
+ end
33
+
34
+ # Create GroupReference with ref (SELF) and entity
35
+ group_qual = if self_ref || entity_ref
36
+ Expressir::Model::References::GroupReference.new(
37
+ ref: self_ref, entity: entity_ref,
38
+ )
39
+ end
40
+
41
+ attr_qual = if ast_data[:attribute_qualifier]
42
+ Builder.build({ attribute_qualifier: ast_data[:attribute_qualifier] })
43
+ end
44
+
45
+ if group_qual && attr_qual
46
+ Expressir::Model::References::AttributeReference.new(
47
+ ref: group_qual, attribute: attr_qual,
48
+ )
49
+ else
50
+ attr_qual || group_qual
51
+ end
52
+ end
53
+
54
+ def build_group_qualifier(ast_data)
55
+ entity = if ast_data[:entity_ref]
56
+ Builder.build({ entity_ref: ast_data[:entity_ref] })
57
+ end
58
+ Expressir::Model::References::GroupReference.new(entity: entity)
59
+ end
60
+
61
+ def build_attribute_qualifier(ast_data)
62
+ Builder.build({ attribute_ref: ast_data[:attribute_ref] })
63
+ end
64
+
65
+ def build_index_qualifier(ast_data)
66
+ index1 = Builder.build_optional(ast_data[:index1])
67
+ index2 = Builder.build_optional(ast_data[:index2])
68
+ Expressir::Model::References::IndexReference.new(index1: index1,
69
+ index2: index2)
70
+ end
71
+
72
+ def build_index1(ast_data)
73
+ Builder.build_optional(ast_data[:numeric_expression])
74
+ end
75
+
76
+ def build_index2(ast_data)
77
+ Builder.build_optional(ast_data[:numeric_expression])
78
+ end
79
+
80
+ def build_index(ast_data)
81
+ Builder.build_optional(ast_data[:numeric_expression])
82
+ end
83
+
84
+ def build_enumeration_reference(ast_data)
85
+ type_ref = Builder.build_optional(ast_data[:type_ref])
86
+ enum_ref = if ast_data[:enumeration_ref]
87
+ Builder.build({ enumeration_ref: ast_data[:enumeration_ref] })
88
+ end
89
+
90
+ if type_ref && enum_ref
91
+ Expressir::Model::References::AttributeReference.new(
92
+ ref: type_ref,
93
+ attribute: enum_ref,
94
+ )
95
+ elsif enum_ref
96
+ enum_ref
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Expressir
4
+ module Express
5
+ module Builders
6
+ # Builds reference nodes (attribute_ref, entity_ref, etc.).
7
+ # Returns SimpleReference for all reference types.
8
+ class ReferenceBuilder
9
+ include ::Expressir::Express::Builders::Helpers
10
+
11
+ def call(ast_data)
12
+ id = extract_id_ref(ast_data)
13
+ Expressir::Model::References::SimpleReference.new(id: id)
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end