@mpeggroup/mpeg-sdl-parser 4.0.0

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 (375) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +337 -0
  3. package/bun.lock +65 -0
  4. package/dist/index.js +11829 -0
  5. package/grammar/sdl.ebnf.grammar +399 -0
  6. package/grammar/sdl.lezer.grammar +629 -0
  7. package/index.ts +83 -0
  8. package/package.json +61 -0
  9. package/src/analyser/checks/check-array-definition.ts +90 -0
  10. package/src/analyser/checks/check-array-element-access.ts +31 -0
  11. package/src/analyser/checks/check-class-declaration.ts +417 -0
  12. package/src/analyser/checks/check-computed-array-definition.ts +44 -0
  13. package/src/analyser/checks/check-computed-elementary-type-definition.ts +45 -0
  14. package/src/analyser/checks/check-elementary-type-definition.ts +167 -0
  15. package/src/analyser/checks/check-expression-binary.ts +242 -0
  16. package/src/analyser/checks/check-expression-lengthof.ts +34 -0
  17. package/src/analyser/checks/check-expression-unary.ts +166 -0
  18. package/src/analyser/checks/check-identifier.ts +71 -0
  19. package/src/analyser/checks/check-if-statement.ts +164 -0
  20. package/src/analyser/checks/check-map-declaration.ts +180 -0
  21. package/src/analyser/checks/check-map-definition.ts +118 -0
  22. package/src/analyser/checks/check-number-literal-float.ts +28 -0
  23. package/src/analyser/checks/check-parameter-list.ts +42 -0
  24. package/src/analyser/checks/check-specification.ts +53 -0
  25. package/src/analyser/checks/check-switch-statement.ts +206 -0
  26. package/src/analyser/checks/check.ts +20 -0
  27. package/src/analyser/create-sdl-analyser.ts +85 -0
  28. package/src/analyser/node-handler/abstract-analysis-node-handler.ts +626 -0
  29. package/src/analyser/node-handler/build-symbol-table-node-handler.ts +649 -0
  30. package/src/analyser/node-handler/specific-check-node-handler.ts +46 -0
  31. package/src/analyser/node-handler/validate-scope-node-handler.ts +290 -0
  32. package/src/analyser/node-handler/validate-type-node-handler.ts +497 -0
  33. package/src/analyser/sdl-analyser.ts +119 -0
  34. package/src/analyser/symbol-table.ts +388 -0
  35. package/src/analyser/util/symbol-table-utils.ts +458 -0
  36. package/src/analyser/util/type-utils.ts +238 -0
  37. package/src/ast/build/consume/consume-abstract-node.ts +199 -0
  38. package/src/ast/build/consume/consume-ast-node.ts +400 -0
  39. package/src/ast/build/consume/consume-primitive.ts +59 -0
  40. package/src/ast/build/consume/consume-trivia.ts +96 -0
  41. package/src/ast/build/consume/consume-white-space-and-missing-errors.ts +27 -0
  42. package/src/ast/build/node/build-aggregate-output-value.ts +57 -0
  43. package/src/ast/build/node/build-aligned-modifier.ts +99 -0
  44. package/src/ast/build/node/build-array-definition.ts +131 -0
  45. package/src/ast/build/node/build-array-element-access.ts +45 -0
  46. package/src/ast/build/node/build-base64-string-literal.ts +41 -0
  47. package/src/ast/build/node/build-binary-expression.ts +113 -0
  48. package/src/ast/build/node/build-binary-literal.ts +37 -0
  49. package/src/ast/build/node/build-bit-modifier.ts +86 -0
  50. package/src/ast/build/node/build-case-clause.ts +101 -0
  51. package/src/ast/build/node/build-class-declaration.ts +124 -0
  52. package/src/ast/build/node/build-class-definition.ts +56 -0
  53. package/src/ast/build/node/build-class-id-range.ts +32 -0
  54. package/src/ast/build/node/build-class-id.ts +19 -0
  55. package/src/ast/build/node/build-class-member-access.ts +27 -0
  56. package/src/ast/build/node/build-compound-statement.ts +33 -0
  57. package/src/ast/build/node/build-computed-array-definition.ts +53 -0
  58. package/src/ast/build/node/build-computed-elementary-type-definition.ts +100 -0
  59. package/src/ast/build/node/build-decimal-literal.ts +15 -0
  60. package/src/ast/build/node/build-default-clause.ts +76 -0
  61. package/src/ast/build/node/build-do-statement.ts +71 -0
  62. package/src/ast/build/node/build-elementary-type-definition.ts +164 -0
  63. package/src/ast/build/node/build-elementary-type-output-value.ts +25 -0
  64. package/src/ast/build/node/build-elementary-type.ts +36 -0
  65. package/src/ast/build/node/build-expandable-modifier.ts +68 -0
  66. package/src/ast/build/node/build-explicit-array-dimension.ts +37 -0
  67. package/src/ast/build/node/build-expression-statement.ts +31 -0
  68. package/src/ast/build/node/build-extended-class-id-range.ts +27 -0
  69. package/src/ast/build/node/build-extends-modifier.ts +41 -0
  70. package/src/ast/build/node/build-floating-point-literal.ts +15 -0
  71. package/src/ast/build/node/build-for-statement.ts +117 -0
  72. package/src/ast/build/node/build-hexadecimal-literal.ts +38 -0
  73. package/src/ast/build/node/build-identifier.ts +8 -0
  74. package/src/ast/build/node/build-if-statement.ts +82 -0
  75. package/src/ast/build/node/build-implicit-array-dimension.ts +78 -0
  76. package/src/ast/build/node/build-integer-literal.ts +15 -0
  77. package/src/ast/build/node/build-length-attribute.ts +48 -0
  78. package/src/ast/build/node/build-lengthof-expression.ts +45 -0
  79. package/src/ast/build/node/build-map-declaration.ts +110 -0
  80. package/src/ast/build/node/build-map-definition.ts +103 -0
  81. package/src/ast/build/node/build-map-entry.ts +33 -0
  82. package/src/ast/build/node/build-missing-error.ts +10 -0
  83. package/src/ast/build/node/build-multiple-character-literal.ts +65 -0
  84. package/src/ast/build/node/build-parameter-list.ts +50 -0
  85. package/src/ast/build/node/build-parameter-value-list.ts +54 -0
  86. package/src/ast/build/node/build-parameter.ts +47 -0
  87. package/src/ast/build/node/build-partial-array-dimension.ts +55 -0
  88. package/src/ast/build/node/build-specification.ts +24 -0
  89. package/src/ast/build/node/build-string-definition.ts +106 -0
  90. package/src/ast/build/node/build-switch-statement.ts +84 -0
  91. package/src/ast/build/node/build-token.ts +26 -0
  92. package/src/ast/build/node/build-unary-expression.ts +109 -0
  93. package/src/ast/build/node/build-unexpected-error.ts +14 -0
  94. package/src/ast/build/node/build-utf-string-literal.ts +110 -0
  95. package/src/ast/build/node/build-while-statement.ts +55 -0
  96. package/src/ast/build/util/array-dimension-kind-by-token-type-id-map.ts +167 -0
  97. package/src/ast/build/util/binary-operator-kind-by-token-type-id-map.ts +152 -0
  98. package/src/ast/build/util/build-context.ts +36 -0
  99. package/src/ast/build/util/class-id-kind-by-token-type-id-map.ts +160 -0
  100. package/src/ast/build/util/expression-kind-by-token-type-id-map.ts +168 -0
  101. package/src/ast/build/util/fetch-node.ts +433 -0
  102. package/src/ast/build/util/node-kind-by-token-type-id-map.ts +202 -0
  103. package/src/ast/build/util/statement-kind-by-token-type-id-map.ts +210 -0
  104. package/src/ast/build/util/string-literal-kind-by-token-type-id-map.ts +162 -0
  105. package/src/ast/build/util/token-kind-by-token-type-id-map.ts +337 -0
  106. package/src/ast/build-ast.ts +114 -0
  107. package/src/ast/node/abstract-array-definition.ts +17 -0
  108. package/src/ast/node/abstract-array-dimension.ts +20 -0
  109. package/src/ast/node/abstract-class-id.ts +13 -0
  110. package/src/ast/node/abstract-composite-node.ts +58 -0
  111. package/src/ast/node/abstract-elementary-type-definition.ts +29 -0
  112. package/src/ast/node/abstract-expression.ts +13 -0
  113. package/src/ast/node/abstract-leaf-node.ts +10 -0
  114. package/src/ast/node/abstract-node.ts +16 -0
  115. package/src/ast/node/abstract-statement.ts +13 -0
  116. package/src/ast/node/aggregate-output-value.ts +28 -0
  117. package/src/ast/node/aligned-modifier.ts +21 -0
  118. package/src/ast/node/array-definition.ts +44 -0
  119. package/src/ast/node/array-element-access.ts +24 -0
  120. package/src/ast/node/binary-expression.ts +28 -0
  121. package/src/ast/node/bit-modifier.ts +24 -0
  122. package/src/ast/node/case-clause.ts +30 -0
  123. package/src/ast/node/class-declaration.ts +39 -0
  124. package/src/ast/node/class-definition.ts +23 -0
  125. package/src/ast/node/class-id-range.ts +17 -0
  126. package/src/ast/node/class-id.ts +14 -0
  127. package/src/ast/node/class-member-access.ts +19 -0
  128. package/src/ast/node/compound-statement.ts +19 -0
  129. package/src/ast/node/computed-array-definition.ts +26 -0
  130. package/src/ast/node/computed-elementary-type-definition.ts +34 -0
  131. package/src/ast/node/default-clause.ts +26 -0
  132. package/src/ast/node/do-statement.ts +28 -0
  133. package/src/ast/node/elementary-type-definition.ts +49 -0
  134. package/src/ast/node/elementary-type-output-value.ts +19 -0
  135. package/src/ast/node/elementary-type.ts +18 -0
  136. package/src/ast/node/enum/array-dimension-kind.ts +11 -0
  137. package/src/ast/node/enum/binary-operator-kind.ts +41 -0
  138. package/src/ast/node/enum/class-id-kind.ts +12 -0
  139. package/src/ast/node/enum/elementary-type-kind.ts +13 -0
  140. package/src/ast/node/enum/expression-kind.ts +11 -0
  141. package/src/ast/node/enum/node-kind.ts +57 -0
  142. package/src/ast/node/enum/number-literal-kind.ts +17 -0
  143. package/src/ast/node/enum/statement-kind.ts +37 -0
  144. package/src/ast/node/enum/string-literal-kind.ts +13 -0
  145. package/src/ast/node/enum/string-variable-kind.ts +25 -0
  146. package/src/ast/node/enum/token-kind.ts +87 -0
  147. package/src/ast/node/expandable-modifier.ts +21 -0
  148. package/src/ast/node/explicit-array-dimension.ts +26 -0
  149. package/src/ast/node/expression-statement.ts +23 -0
  150. package/src/ast/node/extended-class-id-range.ts +20 -0
  151. package/src/ast/node/extends-modifier.ts +21 -0
  152. package/src/ast/node/for-statement.ts +29 -0
  153. package/src/ast/node/identifier.ts +12 -0
  154. package/src/ast/node/if-statement.ts +28 -0
  155. package/src/ast/node/implicit-array-dimension.ts +34 -0
  156. package/src/ast/node/length-attribute.ts +24 -0
  157. package/src/ast/node/length-of-expression.ts +21 -0
  158. package/src/ast/node/map-declaration.ts +34 -0
  159. package/src/ast/node/map-definition.ts +27 -0
  160. package/src/ast/node/map-entry.ts +18 -0
  161. package/src/ast/node/missing-error.ts +9 -0
  162. package/src/ast/node/number-literal.ts +18 -0
  163. package/src/ast/node/parameter-list.ts +25 -0
  164. package/src/ast/node/parameter-value-list.ts +29 -0
  165. package/src/ast/node/parameter.ts +20 -0
  166. package/src/ast/node/partial-array-dimension.ts +28 -0
  167. package/src/ast/node/specification.ts +21 -0
  168. package/src/ast/node/string-definition.ts +28 -0
  169. package/src/ast/node/string-literal.ts +21 -0
  170. package/src/ast/node/switch-statement.ts +32 -0
  171. package/src/ast/node/token.ts +20 -0
  172. package/src/ast/node/trivia.ts +13 -0
  173. package/src/ast/node/unary-expression.ts +31 -0
  174. package/src/ast/node/unexpected-error.ts +12 -0
  175. package/src/ast/node/while-statement.ts +26 -0
  176. package/src/ast/util/types.ts +138 -0
  177. package/src/ast/visitor/node-handler.ts +15 -0
  178. package/src/ast/visitor/node-visitor.ts +13 -0
  179. package/src/ast/visitor/traversing-visitor.ts +69 -0
  180. package/src/completion/completion-rules.ts +447 -0
  181. package/src/completion/get-potential-syntactic-tokens.ts +54 -0
  182. package/src/completion/get-potential-token-type-ids.ts +116 -0
  183. package/src/completion/hierarchical-map.ts +43 -0
  184. package/src/completion/rules/abstract-types.ts +174 -0
  185. package/src/completion/rules/aggregate-output-value-rules.ts +48 -0
  186. package/src/completion/rules/aligned-modifier-rules.ts +45 -0
  187. package/src/completion/rules/array-definition-rules.ts +87 -0
  188. package/src/completion/rules/array-element-access-rules.ts +22 -0
  189. package/src/completion/rules/assignment-expression-rules.ts +19 -0
  190. package/src/completion/rules/binary-expression-rules.ts +23 -0
  191. package/src/completion/rules/bit-modifier-rules.ts +25 -0
  192. package/src/completion/rules/case-clause-rules.ts +39 -0
  193. package/src/completion/rules/class-declaration-rules.ts +81 -0
  194. package/src/completion/rules/class-definition-rules.ts +28 -0
  195. package/src/completion/rules/class-id-range-rules.ts +17 -0
  196. package/src/completion/rules/class-id-rules.ts +9 -0
  197. package/src/completion/rules/class-member-access-rules.ts +7 -0
  198. package/src/completion/rules/compound-statement-rules.ts +25 -0
  199. package/src/completion/rules/computed-array-definition-rules.ts +25 -0
  200. package/src/completion/rules/computed-elementary-type-rules.ts +44 -0
  201. package/src/completion/rules/default-clause-rules.ts +23 -0
  202. package/src/completion/rules/do-statement-rules.ts +38 -0
  203. package/src/completion/rules/elementary-type-definition-rules.ts +62 -0
  204. package/src/completion/rules/elementary-type-output-value-rules.ts +13 -0
  205. package/src/completion/rules/elementary-type-rules.ts +18 -0
  206. package/src/completion/rules/expandable-modifier-rules.ts +21 -0
  207. package/src/completion/rules/explicit-array-dimension-rules.ts +22 -0
  208. package/src/completion/rules/expression-statement-rules.ts +22 -0
  209. package/src/completion/rules/extended-class-id-range-rules.ts +17 -0
  210. package/src/completion/rules/extends-modifier-rules.ts +17 -0
  211. package/src/completion/rules/for-statement-rules.ts +51 -0
  212. package/src/completion/rules/if-statement-rules.ts +42 -0
  213. package/src/completion/rules/implicit-array-dimension-rules.ts +21 -0
  214. package/src/completion/rules/length-attribute-rules.ts +19 -0
  215. package/src/completion/rules/lengthof-expression-rules.ts +23 -0
  216. package/src/completion/rules/map-declaration-rules.ts +45 -0
  217. package/src/completion/rules/map-definition-rules.ts +46 -0
  218. package/src/completion/rules/map-entry-rules.ts +17 -0
  219. package/src/completion/rules/parameter-list-rules.ts +21 -0
  220. package/src/completion/rules/parameter-rules.ts +17 -0
  221. package/src/completion/rules/parameter-value-list-rules.ts +27 -0
  222. package/src/completion/rules/partial-array-dimension-rules.ts +33 -0
  223. package/src/completion/rules/specification-rules.ts +37 -0
  224. package/src/completion/rules/string-definition-rules.ts +103 -0
  225. package/src/completion/rules/switch-statement-rules.ts +50 -0
  226. package/src/completion/rules/unary-expression-rules.ts +41 -0
  227. package/src/completion/rules/utf-string-literal-rules.ts +17 -0
  228. package/src/completion/rules/while-statement-rules.ts +38 -0
  229. package/src/lezer/context-tracker.ts +45 -0
  230. package/src/lezer/create-sdl-parser.ts +88 -0
  231. package/src/lezer/create-syntax-error-from-text-and-cursor.ts +110 -0
  232. package/src/lezer/create-syntax-error-from-text-and-position.ts +36 -0
  233. package/src/lezer/parser.terms.ts +129 -0
  234. package/src/lezer/parser.ts +63 -0
  235. package/src/lezer/props/fold-node-prop-source.ts +27 -0
  236. package/src/lezer/props/primitive-node-prop-source.ts +19 -0
  237. package/src/lezer/props/style-tags-node-prop-source.ts +188 -0
  238. package/src/lezer/props/syntactic-token-node-prop-source.ts +298 -0
  239. package/src/lezer/sdl-string-input.ts +46 -0
  240. package/src/location.ts +13 -0
  241. package/src/parse-helper.ts +93 -0
  242. package/src/prettier/prettier-plugin-sdl.ts +89 -0
  243. package/src/prettier/print-abstract-array-dimension.ts +84 -0
  244. package/src/prettier/print-abstract-class-id.ts +53 -0
  245. package/src/prettier/print-abstract-expression.ts +168 -0
  246. package/src/prettier/print-abstract-node.ts +224 -0
  247. package/src/prettier/print-abstract-statement.ts +124 -0
  248. package/src/prettier/print-aggregate-output-value.ts +35 -0
  249. package/src/prettier/print-aligned-modifier.ts +50 -0
  250. package/src/prettier/print-array-definition.ts +95 -0
  251. package/src/prettier/print-array-element-access.ts +14 -0
  252. package/src/prettier/print-bit-modifier.ts +48 -0
  253. package/src/prettier/print-case-clause.ts +58 -0
  254. package/src/prettier/print-class-declaration.ts +99 -0
  255. package/src/prettier/print-class-definition.ts +44 -0
  256. package/src/prettier/print-class-member-access.ts +13 -0
  257. package/src/prettier/print-computed-array-definition.ts +33 -0
  258. package/src/prettier/print-computed-elementary-type-definition.ts +60 -0
  259. package/src/prettier/print-default-clause.ts +39 -0
  260. package/src/prettier/print-do-statement.ts +31 -0
  261. package/src/prettier/print-elementary-type-definition.ts +108 -0
  262. package/src/prettier/print-elementary-type-output-value.ts +13 -0
  263. package/src/prettier/print-elementary-type.ts +28 -0
  264. package/src/prettier/print-expandable-modifier.ts +41 -0
  265. package/src/prettier/print-extends-modifier.ts +29 -0
  266. package/src/prettier/print-for-statement.ts +64 -0
  267. package/src/prettier/print-identifier.ts +10 -0
  268. package/src/prettier/print-if-statement.ts +76 -0
  269. package/src/prettier/print-length-attribute.ts +14 -0
  270. package/src/prettier/print-map-declaration.ts +75 -0
  271. package/src/prettier/print-map-definition.ts +67 -0
  272. package/src/prettier/print-map-entry.ts +22 -0
  273. package/src/prettier/print-number-literal.ts +84 -0
  274. package/src/prettier/print-parameter-list.ts +20 -0
  275. package/src/prettier/print-parameter-value-list.ts +20 -0
  276. package/src/prettier/print-parameter.ts +34 -0
  277. package/src/prettier/print-specification.ts +51 -0
  278. package/src/prettier/print-string-definition.ts +114 -0
  279. package/src/prettier/print-string-literal.ts +57 -0
  280. package/src/prettier/print-switch-statement.ts +46 -0
  281. package/src/prettier/print-token.ts +7 -0
  282. package/src/prettier/print-unexpected-error.ts +10 -0
  283. package/src/prettier/print-while-statement.ts +26 -0
  284. package/src/prettier/util/print-utils.ts +607 -0
  285. package/src/prettier/util/types.ts +40 -0
  286. package/src/scanner-error.ts +65 -0
  287. package/src/util/location-utils.ts +16 -0
  288. package/src/util/logger.ts +165 -0
  289. package/tests/analyser/create-sdl-analyser.test.ts +54 -0
  290. package/tests/analyser/get-sdl-analyser-test-scenarios.ts +80 -0
  291. package/tests/analyser/sdl-analyser-scenarios.test.ts +67 -0
  292. package/tests/analyser/semantic-error-scenarios.test.ts +40 -0
  293. package/tests/analyser/symbol-table.test.ts +188 -0
  294. package/tests/analyser/test-cases/array_definition.txt +50 -0
  295. package/tests/analyser/test-cases/class_declaration.txt +112 -0
  296. package/tests/analyser/test-cases/class_definition.txt +60 -0
  297. package/tests/analyser/test-cases/compound_statement.txt +63 -0
  298. package/tests/analyser/test-cases/computed_array_definition.txt +12 -0
  299. package/tests/analyser/test-cases/computed_elementary_type_definition.txt +39 -0
  300. package/tests/analyser/test-cases/do_statement.txt +16 -0
  301. package/tests/analyser/test-cases/elementary_type_definition.txt +58 -0
  302. package/tests/analyser/test-cases/expression.txt +159 -0
  303. package/tests/analyser/test-cases/for_statement.txt +55 -0
  304. package/tests/analyser/test-cases/if_statement.txt +57 -0
  305. package/tests/analyser/test-cases/map_declaration.txt +89 -0
  306. package/tests/analyser/test-cases/map_definition.txt +35 -0
  307. package/tests/analyser/test-cases/number_literal.txt +31 -0
  308. package/tests/analyser/test-cases/parameter_list.txt +16 -0
  309. package/tests/analyser/test-cases/scopes.txt +239 -0
  310. package/tests/analyser/test-cases/specification.txt +28 -0
  311. package/tests/analyser/test-cases/string_definition.txt +40 -0
  312. package/tests/analyser/test-cases/switch_statement.txt +96 -0
  313. package/tests/analyser/test-cases/while_statement.txt +16 -0
  314. package/tests/analyser/util/symbol-table-utils.test.ts +65 -0
  315. package/tests/ast/__snapshots__/build-ast.test.ts.snap +38897 -0
  316. package/tests/ast/build-ast.test.ts +463 -0
  317. package/tests/ast/visitor/traversing-visitor.test.ts +36 -0
  318. package/tests/completion/get-potential-syntactic-tokens.test.ts +89 -0
  319. package/tests/completion/get-potential-token-type-ids.test.ts +76 -0
  320. package/tests/completion/test-potential-syntactic-tokens-scenario.ts +24 -0
  321. package/tests/completion/test-potential-token-type-ids-scenario.ts +33 -0
  322. package/tests/fixtures/history-recording-node-handler.ts +232 -0
  323. package/tests/lezer/create-parse-error-from-text-and-position.test.ts +129 -0
  324. package/tests/lezer/create-sdl-parser.test.ts +15 -0
  325. package/tests/lezer/sdl-parser-scenarios.test.ts +24 -0
  326. package/tests/lezer/sdl-string-input.test.ts +12 -0
  327. package/tests/lezer/syntax-error-scenarios.test.ts +114 -0
  328. package/tests/lezer/test-cases/array_definition.txt +109 -0
  329. package/tests/lezer/test-cases/class_declaration.txt +141 -0
  330. package/tests/lezer/test-cases/class_definition.txt +89 -0
  331. package/tests/lezer/test-cases/comment.txt +335 -0
  332. package/tests/lezer/test-cases/compound_statement.txt +109 -0
  333. package/tests/lezer/test-cases/computed_array_definition.txt +33 -0
  334. package/tests/lezer/test-cases/computed_elementary_type_definition.txt +59 -0
  335. package/tests/lezer/test-cases/do_statement.txt +48 -0
  336. package/tests/lezer/test-cases/elementary_type_definition.txt +158 -0
  337. package/tests/lezer/test-cases/expression.txt +1203 -0
  338. package/tests/lezer/test-cases/for_statement.txt +183 -0
  339. package/tests/lezer/test-cases/if_statement.txt +183 -0
  340. package/tests/lezer/test-cases/invalid.txt +97 -0
  341. package/tests/lezer/test-cases/map_declaration.txt +152 -0
  342. package/tests/lezer/test-cases/map_definition.txt +59 -0
  343. package/tests/lezer/test-cases/number_literal.txt +273 -0
  344. package/tests/lezer/test-cases/specification.txt +38 -0
  345. package/tests/lezer/test-cases/string_definition.txt +263 -0
  346. package/tests/lezer/test-cases/string_literal.txt +303 -0
  347. package/tests/lezer/test-cases/switch_statement.txt +407 -0
  348. package/tests/lezer/test-cases/while_statement.txt +45 -0
  349. package/tests/parse-helper.test.ts +361 -0
  350. package/tests/prettier/__snapshots__/prettier-plugin-sdl.test.ts.snap +127 -0
  351. package/tests/prettier/prettier-plugin-sdl.test.ts +58 -0
  352. package/tests/prettier/print-array.test.ts +29 -0
  353. package/tests/prettier/print-class.test.ts +15 -0
  354. package/tests/prettier/print-do.test.ts +25 -0
  355. package/tests/prettier/print-elementary-type.test.ts +62 -0
  356. package/tests/prettier/print-error.test.ts +40 -0
  357. package/tests/prettier/print-expression.test.ts +17 -0
  358. package/tests/prettier/print-for.test.ts +23 -0
  359. package/tests/prettier/print-if.test.ts +71 -0
  360. package/tests/prettier/print-number-literal.test.ts +28 -0
  361. package/tests/prettier/print-specification.test.ts +54 -0
  362. package/tests/prettier/print-string.test.ts +36 -0
  363. package/tests/prettier/print-switch.test.ts +69 -0
  364. package/tests/prettier/print-while.test.ts +23 -0
  365. package/tests/prettier/test-prettier-scenario.ts +41 -0
  366. package/tests/prettier/util/print-utils.test.ts +665 -0
  367. package/tests/prettier/util/types.test.ts +38 -0
  368. package/tests/sample-specifications/invalid.sdl +24 -0
  369. package/tests/sample-specifications/prettified-invalid.sdl +28 -0
  370. package/tests/sample-specifications/prettified-various-elements-narrow.sdl +97 -0
  371. package/tests/sample-specifications/prettified-various-elements.sdl +90 -0
  372. package/tests/sample-specifications/sample.sdl +24 -0
  373. package/tests/sample-specifications/various-elements.sdl +88 -0
  374. package/tests/util/logger.test.ts +36 -0
  375. package/tsconfig.json +29 -0
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@mpeggroup/mpeg-sdl-parser",
3
+ "description": "ISO/IEC 14496-34 Syntactic Description Language (MPEG SDL) parser implemented in TypeScript",
4
+ "homepage": "https://github.com/mpeggroup/mpeg-sdl-parser#readme",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/mpeggroup/mpeg-sdl-parser.git"
8
+ },
9
+ "scripts": {
10
+ "build": "bun build --entrypoints ./index.ts --outdir ./dist --target node --format esm --external '@lezer/*' --external '@codemirror/*' --external 'prettier'",
11
+ "prepublishOnly": "bun run build",
12
+ "generate": "lezer-generator --typeScript --output src/lezer/parser ./grammar/sdl.lezer.grammar"
13
+ },
14
+ "license": "MIT",
15
+ "keywords": [
16
+ "bun",
17
+ "mpeg",
18
+ "sdl",
19
+ "parser"
20
+ ],
21
+ "module": "index.ts",
22
+ "main": "dist/index.js",
23
+ "type": "module",
24
+ "version": "4.0.0",
25
+ "files": [
26
+ "dist",
27
+ "grammar",
28
+ "src",
29
+ "tests",
30
+ "bun.lock",
31
+ "index.ts",
32
+ "LICENSE",
33
+ "package.json",
34
+ "README.md",
35
+ "tsconfig.json"
36
+ ],
37
+ "publishConfig": {
38
+ "access": "public"
39
+ },
40
+ "devDependencies": {
41
+ "@types/bun": "^1.3.13",
42
+ "@types/node": "^25.6.0"
43
+ },
44
+ "peerDependencies": {
45
+ "typescript": "6.0.3"
46
+ },
47
+ "dependencies": {
48
+ "@codemirror/state": "6.5.4",
49
+ "@codemirror/language": "6.12.3",
50
+ "@lezer/common": "1.5.0",
51
+ "@lezer/generator": "1.8.0",
52
+ "@lezer/highlight": "1.2.3",
53
+ "@lezer/lr": "1.4.7",
54
+ "prettier": "3.8.3"
55
+ },
56
+ "overrides": {
57
+ "@lezer/common": "1.5.0",
58
+ "@lezer/lr": "1.4.7",
59
+ "@codemirror/state": "6.5.4"
60
+ }
61
+ }
@@ -0,0 +1,90 @@
1
+ import type { ArrayDefinition } from "../../ast/node/array-definition.ts";
2
+ import type { ClassDeclaration } from "../../ast/node/class-declaration.ts";
3
+ import { ArrayDimensionKind } from "../../ast/node/enum/array-dimension-kind.ts";
4
+ import { NodeKind } from "../../ast/node/enum/node-kind.ts";
5
+ import { NumberLiteralKind } from "../../ast/node/enum/number-literal-kind.ts";
6
+ import { StatementKind } from "../../ast/node/enum/statement-kind.ts";
7
+ import type { ExplicitArrayDimension } from "../../ast/node/explicit-array-dimension.ts";
8
+ import { isIdentifier, isNumberLiteral } from "../../ast/util/types.ts";
9
+ import type { SymbolTable } from "../symbol-table.ts";
10
+ import type { Check, CheckResult } from "./check.ts";
11
+
12
+ function checkArrayDimensionsPositiveInteger(
13
+ definition: ArrayDefinition,
14
+ ): CheckResult[] {
15
+ const results: CheckResult[] = [];
16
+
17
+ for (const dimension of definition.dimensions) {
18
+ if (dimension.nodeKind === NodeKind.ARRAY_DIMENSION) {
19
+ const explicitDimension = dimension as ExplicitArrayDimension;
20
+ if (
21
+ explicitDimension.arrayDimensionKind === ArrayDimensionKind.EXPLICIT
22
+ ) {
23
+ const size = explicitDimension.size;
24
+
25
+ // Only check direct NumberLiterals, skip expressions as per spec note
26
+ if (isNumberLiteral(size)) {
27
+ if (
28
+ size.value <= 0 ||
29
+ size.numberLiteralKind !== NumberLiteralKind.INTEGER
30
+ ) {
31
+ results.push({
32
+ message: "Array dimensions must be a positive integer.",
33
+ location: size.startToken!.getLocation(),
34
+ });
35
+ }
36
+ }
37
+ }
38
+ }
39
+ }
40
+
41
+ return results;
42
+ }
43
+
44
+ function checkImplicitArrayClassId(
45
+ definition: ArrayDefinition,
46
+ symbolTable: SymbolTable,
47
+ ): CheckResult[] {
48
+ const results: CheckResult[] = [];
49
+
50
+ if (
51
+ definition.implicitArrayDimension &&
52
+ definition.classIdentifier &&
53
+ isIdentifier(definition.classIdentifier)
54
+ ) {
55
+ const classSymbol = symbolTable.lookupClass(
56
+ definition.classIdentifier.name,
57
+ );
58
+
59
+ if (classSymbol) {
60
+ const classDeclaration = classSymbol.node as ClassDeclaration;
61
+
62
+ if (!classDeclaration.bitModifier) {
63
+ results.push({
64
+ message:
65
+ "Implicit arrays can only contain classes which have a classId defined.",
66
+ location: definition.classIdentifier.startToken!.getLocation(),
67
+ });
68
+ }
69
+ }
70
+ }
71
+
72
+ return results;
73
+ }
74
+
75
+ export const checkArrayDefinition: Check = {
76
+ nodeKind: NodeKind.STATEMENT,
77
+ subKind: StatementKind.ARRAY_DEFINITION,
78
+ checkFunc: function (
79
+ definition: ArrayDefinition,
80
+ symbolTable: SymbolTable,
81
+ _strict: boolean,
82
+ ): CheckResult[] {
83
+ const results: CheckResult[] = [];
84
+
85
+ results.push(...checkArrayDimensionsPositiveInteger(definition));
86
+ results.push(...checkImplicitArrayClassId(definition, symbolTable));
87
+
88
+ return results;
89
+ },
90
+ };
@@ -0,0 +1,31 @@
1
+ import type { ArrayElementAccess } from "../../ast/node/array-element-access.ts";
2
+ import { NodeKind } from "../../ast/node/enum/node-kind.ts";
3
+ import { NumberLiteralKind } from "../../ast/node/enum/number-literal-kind.ts";
4
+ import { isNumberLiteral } from "../../ast/util/types.ts";
5
+ import type { Check, CheckResult } from "./check.ts";
6
+
7
+ export const checkArrayElementAccess: Check = {
8
+ nodeKind: NodeKind.ARRAY_ELEMENT_ACCESS,
9
+ checkFunc: function (
10
+ node: ArrayElementAccess,
11
+ _symbolTable,
12
+ _strict,
13
+ ): CheckResult[] {
14
+ const results: CheckResult[] = [];
15
+
16
+ if (isNumberLiteral(node.index)) {
17
+ if (
18
+ node.index.numberLiteralKind === NumberLiteralKind.FLOATING_POINT ||
19
+ node.index.value < 0
20
+ ) {
21
+ results.push({
22
+ message:
23
+ "Array element access cannot be performed with floating point or negative integer values.",
24
+ location: node.index.startToken!.getLocation(),
25
+ });
26
+ }
27
+ }
28
+
29
+ return results;
30
+ },
31
+ };
@@ -0,0 +1,417 @@
1
+ import type { ClassDeclaration } from "../../ast/node/class-declaration.ts";
2
+ import { NodeKind } from "../../ast/node/enum/node-kind.ts";
3
+ import { NumberLiteralKind } from "../../ast/node/enum/number-literal-kind.ts";
4
+ import { StatementKind } from "../../ast/node/enum/statement-kind.ts";
5
+ import { ClassIdKind } from "../../ast/node/enum/class-id-kind.ts";
6
+ import type { AbstractNode } from "../../ast/node/abstract-node.ts";
7
+ import type { ParameterList } from "../../ast/node/parameter-list.ts";
8
+ import type { ClassDefinition } from "../../ast/node/class-definition.ts";
9
+ import type { ClassIdRange } from "../../ast/node/class-id-range.ts";
10
+ import type { ClassId } from "../../ast/node/class-id.ts";
11
+ import {
12
+ isAlignedModifier,
13
+ isBitModifier,
14
+ isCompositeNode,
15
+ isExpandableModifier,
16
+ isExtendsModifier,
17
+ isIdentifier,
18
+ isNumberLiteral,
19
+ isToken,
20
+ } from "../../ast/util/types.ts";
21
+ import { getRequiredIdentifier } from "../util/symbol-table-utils.ts";
22
+ import type { Check, CheckResult } from "./check.ts";
23
+ import type { Parameter } from "../../ast/node/parameter.ts";
24
+ import type { SymbolTable } from "../symbol-table.ts";
25
+ import type { AbstractClassId } from "../../ast/node/abstract-class-id.ts";
26
+
27
+ function collectAllIdentifiers(node: AbstractNode): string[] {
28
+ const identifiers: string[] = [];
29
+
30
+ if (isIdentifier(node)) {
31
+ identifiers.push(node.name);
32
+ }
33
+
34
+ if (isCompositeNode(node)) {
35
+ for (const child of node.children) {
36
+ identifiers.push(...collectAllIdentifiers(child));
37
+ }
38
+ }
39
+
40
+ return identifiers;
41
+ }
42
+
43
+ function checkMaxClassSizePositiveInteger(
44
+ declaration: ClassDeclaration,
45
+ ): CheckResult[] {
46
+ const results: CheckResult[] = [];
47
+
48
+ if (
49
+ declaration.expandableModifier &&
50
+ isExpandableModifier(declaration.expandableModifier)
51
+ ) {
52
+ const maxClassSize = declaration.expandableModifier.maxClassSize;
53
+ if (maxClassSize && isNumberLiteral(maxClassSize)) {
54
+ if (
55
+ maxClassSize.value <= 0 ||
56
+ maxClassSize.numberLiteralKind !== NumberLiteralKind.INTEGER
57
+ ) {
58
+ results.push({
59
+ message: "maxClassSize must be a positive integer",
60
+ location: maxClassSize.startToken!.getLocation(),
61
+ });
62
+ }
63
+ }
64
+ }
65
+
66
+ return results;
67
+ }
68
+
69
+ function checkExpandableCannotBeAbstract(
70
+ declaration: ClassDeclaration,
71
+ ): CheckResult[] {
72
+ const results: CheckResult[] = [];
73
+
74
+ if (
75
+ declaration.expandableModifier &&
76
+ isExpandableModifier(declaration.expandableModifier) &&
77
+ declaration.abstractKeyword && isToken(declaration.abstractKeyword)
78
+ ) {
79
+ results.push({
80
+ message:
81
+ "Because the class is expandable, it has an encoded sizeOfInstance value therefore it cannot be abstract.",
82
+ location: declaration.abstractKeyword.getLocation(),
83
+ });
84
+ }
85
+
86
+ return results;
87
+ }
88
+
89
+ function checkParameterReferencedWithinClass(
90
+ declaration: ClassDeclaration,
91
+ strict: boolean,
92
+ ): CheckResult[] {
93
+ const results: CheckResult[] = [];
94
+
95
+ if (
96
+ !declaration.parameterList ||
97
+ declaration.parameterList.nodeKind !== NodeKind.PARAMETER_LIST
98
+ ) {
99
+ return results;
100
+ }
101
+
102
+ const parameterList = declaration.parameterList as ParameterList;
103
+
104
+ const classBodyIdentifiers = new Set<string>();
105
+ for (const statement of declaration.statements) {
106
+ for (const name of collectAllIdentifiers(statement)) {
107
+ classBodyIdentifiers.add(name);
108
+ }
109
+ }
110
+
111
+ for (const param of parameterList.parameters) {
112
+ if (param.nodeKind !== NodeKind.PARAMETER) {
113
+ continue;
114
+ }
115
+ const parameter = param as Parameter;
116
+ const identifier = getRequiredIdentifier(
117
+ parameter.identifier,
118
+ parameter,
119
+ strict,
120
+ );
121
+ if (identifier && !classBodyIdentifiers.has(identifier.name)) {
122
+ results.push({
123
+ message:
124
+ "A parameter in a parameter list must be referenced within the class declaration.",
125
+ location: identifier.startToken!.getLocation(),
126
+ });
127
+ }
128
+ }
129
+
130
+ return results;
131
+ }
132
+
133
+ function checkClassIdNotInValidRangeOfBaseClass(
134
+ declaration: ClassDeclaration,
135
+ symbolTable: SymbolTable,
136
+ ): CheckResult[] {
137
+ const results: CheckResult[] = [];
138
+
139
+ if (!isExtendsModifier(declaration.extendsModifier)) {
140
+ return results;
141
+ }
142
+
143
+ const extendsModifier = declaration.extendsModifier;
144
+
145
+ if (!isIdentifier(extendsModifier.identifier)) {
146
+ return results;
147
+ }
148
+
149
+ const baseClassSymbol = symbolTable.lookupClass(
150
+ extendsModifier.identifier.name,
151
+ );
152
+
153
+ if (!baseClassSymbol) {
154
+ return results;
155
+ }
156
+
157
+ const baseClass = baseClassSymbol.node as ClassDeclaration;
158
+
159
+ if (!isBitModifier(baseClass.bitModifier)) {
160
+ return results;
161
+ }
162
+
163
+ if (!isBitModifier(declaration.bitModifier)) {
164
+ return results;
165
+ }
166
+
167
+ const baseBitModifier = baseClass.bitModifier;
168
+ const thisBitModifier = declaration.bitModifier;
169
+
170
+ if (
171
+ (baseBitModifier.classId as AbstractClassId).classIdKind ===
172
+ ClassIdKind.RANGE
173
+ ) {
174
+ const baseRange = baseBitModifier.classId as ClassIdRange;
175
+ const baseStartClassId = baseRange.startClassId as ClassId;
176
+ const baseEndClassId = baseRange.endClassId as ClassId;
177
+ const baseMin = isNumberLiteral(baseStartClassId.value)
178
+ ? baseStartClassId.value.value
179
+ : null;
180
+ const baseMax = isNumberLiteral(baseEndClassId.value)
181
+ ? baseEndClassId.value.value
182
+ : null;
183
+
184
+ if (baseMin !== null && baseMax !== null) {
185
+ if (
186
+ (thisBitModifier.classId as AbstractClassId).classIdKind ===
187
+ ClassIdKind.SINGLE
188
+ ) {
189
+ const thisClassId = thisBitModifier.classId as ClassId;
190
+ const thisValue = isNumberLiteral(thisClassId.value)
191
+ ? thisClassId.value.value
192
+ : null;
193
+ if (
194
+ thisValue !== null && (thisValue < baseMin || thisValue > baseMax)
195
+ ) {
196
+ results.push({
197
+ message:
198
+ "The specified classId is not within the range of valid classIds specified in the base class.",
199
+ location: thisBitModifier.startToken!.getLocation(),
200
+ });
201
+ }
202
+ } else if (
203
+ (thisBitModifier.classId as AbstractClassId).classIdKind ===
204
+ ClassIdKind.RANGE
205
+ ) {
206
+ const thisRange = thisBitModifier.classId as ClassIdRange;
207
+ const thisStartClassId = thisRange.startClassId as ClassId;
208
+ const thisEndClassId = thisRange.endClassId as ClassId;
209
+ const thisMin = isNumberLiteral(thisStartClassId.value)
210
+ ? thisStartClassId.value.value
211
+ : null;
212
+ const thisMax = isNumberLiteral(thisEndClassId.value)
213
+ ? thisEndClassId.value.value
214
+ : null;
215
+
216
+ if (
217
+ (thisMin !== null) && (thisMax !== null) &&
218
+ ((thisMin < baseMin) || (thisMax > baseMax))
219
+ ) {
220
+ results.push({
221
+ message:
222
+ "The specified classId is not within the range of valid classIds specified in the base class.",
223
+ location: thisBitModifier.startToken!.getLocation(),
224
+ });
225
+ }
226
+ }
227
+ }
228
+ }
229
+
230
+ return results;
231
+ }
232
+
233
+ function checkCannotExtendItself(
234
+ declaration: ClassDeclaration,
235
+ ): CheckResult[] {
236
+ const results: CheckResult[] = [];
237
+
238
+ if (!isExtendsModifier(declaration.extendsModifier)) {
239
+ return results;
240
+ }
241
+
242
+ const extendsModifier = declaration.extendsModifier;
243
+
244
+ if (
245
+ !isIdentifier(extendsModifier.identifier) ||
246
+ !isIdentifier(declaration.identifier)
247
+ ) {
248
+ return results;
249
+ }
250
+
251
+ if (extendsModifier.identifier.name === declaration.identifier.name) {
252
+ results.push({
253
+ message: "A class cannot extend itself.",
254
+ location: extendsModifier.identifier.startToken!.getLocation(),
255
+ });
256
+ }
257
+
258
+ return results;
259
+ }
260
+
261
+ function checkCannotRecursivelyContainItself(
262
+ declaration: ClassDeclaration,
263
+ ): CheckResult[] {
264
+ const results: CheckResult[] = [];
265
+
266
+ if (!isIdentifier(declaration.identifier)) {
267
+ return results;
268
+ }
269
+
270
+ const className = declaration.identifier.name;
271
+
272
+ function checkRecursive(statements: AbstractNode[]): boolean {
273
+ for (const statement of statements) {
274
+ if (
275
+ statement.nodeKind === NodeKind.STATEMENT &&
276
+ (statement as { statementKind?: StatementKind }).statementKind ===
277
+ StatementKind.CLASS_DEFINITION
278
+ ) {
279
+ const classDef = statement as ClassDefinition;
280
+ if (
281
+ isIdentifier(classDef.classIdentifier) &&
282
+ classDef.classIdentifier.name === className
283
+ ) {
284
+ return true;
285
+ }
286
+ }
287
+ }
288
+ return false;
289
+ }
290
+
291
+ if (checkRecursive(declaration.statements)) {
292
+ results.push({
293
+ message: "A class cannot recursively contain itself as a member.",
294
+ location: declaration.identifier.startToken!.getLocation(),
295
+ });
296
+ }
297
+
298
+ return results;
299
+ }
300
+
301
+ function checkExpandableCannotExtendExpandable(
302
+ declaration: ClassDeclaration,
303
+ symbolTable: SymbolTable,
304
+ ): CheckResult[] {
305
+ const results: CheckResult[] = [];
306
+
307
+ if (!isExpandableModifier(declaration.expandableModifier)) {
308
+ return results;
309
+ }
310
+
311
+ if (!isExtendsModifier(declaration.extendsModifier)) {
312
+ return results;
313
+ }
314
+
315
+ const extendsModifier = declaration.extendsModifier;
316
+
317
+ if (!isIdentifier(extendsModifier.identifier)) {
318
+ return results;
319
+ }
320
+
321
+ const baseClassSymbol = symbolTable.lookupClass(
322
+ extendsModifier.identifier.name,
323
+ );
324
+
325
+ if (!baseClassSymbol) {
326
+ return results;
327
+ }
328
+
329
+ const baseClass = baseClassSymbol.node as ClassDeclaration;
330
+
331
+ if (isExpandableModifier(baseClass.expandableModifier)) {
332
+ results.push({
333
+ message: "An expandable class cannot extend an expandable class.",
334
+ location: declaration.expandableModifier.startToken!.getLocation(),
335
+ });
336
+ }
337
+
338
+ return results;
339
+ }
340
+
341
+ function checkAlignmentMustMatchBaseClass(
342
+ declaration: ClassDeclaration,
343
+ symbolTable: SymbolTable,
344
+ ): CheckResult[] {
345
+ const results: CheckResult[] = [];
346
+
347
+ if (!isExtendsModifier(declaration.extendsModifier)) {
348
+ return results;
349
+ }
350
+
351
+ const extendsModifier = declaration.extendsModifier;
352
+
353
+ if (!isIdentifier(extendsModifier.identifier)) {
354
+ return results;
355
+ }
356
+
357
+ const identifier = extendsModifier.identifier;
358
+
359
+ const baseClassSymbol = symbolTable.lookupClass(identifier.name);
360
+ if (!baseClassSymbol) {
361
+ return results;
362
+ }
363
+
364
+ const baseClass = baseClassSymbol.node as ClassDeclaration;
365
+
366
+ if (isAlignedModifier(declaration.alignedModifier)) {
367
+ if (isAlignedModifier(baseClass.alignedModifier)) {
368
+ if (
369
+ declaration.alignedModifier.alignment !==
370
+ baseClass.alignedModifier.alignment
371
+ ) {
372
+ results.push({
373
+ message:
374
+ "The alignment of a class which extends another must not differ from the alignment of the base class.",
375
+ location: identifier.startToken!.getLocation(),
376
+ });
377
+ }
378
+ }
379
+ } else if (!isAlignedModifier(baseClass.alignedModifier)) {
380
+ return results;
381
+ }
382
+ const location = identifier.startToken!.getLocation();
383
+ results.push({
384
+ message:
385
+ "The alignment of a class which extends another must not differ from the alignment of the base class.",
386
+ location,
387
+ });
388
+
389
+ return results;
390
+ }
391
+
392
+ export const checkClassDeclaration: Check = {
393
+ nodeKind: NodeKind.STATEMENT,
394
+ subKind: StatementKind.CLASS_DECLARATION,
395
+ checkFunc: function (
396
+ declaration: ClassDeclaration,
397
+ symbolTable: SymbolTable,
398
+ strict: boolean,
399
+ ): CheckResult[] {
400
+ const results: CheckResult[] = [];
401
+
402
+ results.push(...checkMaxClassSizePositiveInteger(declaration));
403
+ results.push(...checkExpandableCannotBeAbstract(declaration));
404
+ results.push(...checkParameterReferencedWithinClass(declaration, strict));
405
+ results.push(
406
+ ...checkClassIdNotInValidRangeOfBaseClass(declaration, symbolTable),
407
+ );
408
+ results.push(...checkCannotExtendItself(declaration));
409
+ results.push(...checkCannotRecursivelyContainItself(declaration));
410
+ results.push(
411
+ ...checkExpandableCannotExtendExpandable(declaration, symbolTable),
412
+ );
413
+ results.push(...checkAlignmentMustMatchBaseClass(declaration, symbolTable));
414
+
415
+ return results;
416
+ },
417
+ };
@@ -0,0 +1,44 @@
1
+ import type { ComputedArrayDefinition } from "../../ast/node/computed-array-definition.ts";
2
+ import type { ExplicitArrayDimension } from "../../ast/node/explicit-array-dimension.ts";
3
+ import { ArrayDimensionKind } from "../../ast/node/enum/array-dimension-kind.ts";
4
+ import { NodeKind } from "../../ast/node/enum/node-kind.ts";
5
+ import { NumberLiteralKind } from "../../ast/node/enum/number-literal-kind.ts";
6
+ import { StatementKind } from "../../ast/node/enum/statement-kind.ts";
7
+ import { isNumberLiteral } from "../../ast/util/types.ts";
8
+ import type { Check, CheckResult } from "./check.ts";
9
+
10
+ export const checkComputedArrayDefinition: Check = {
11
+ nodeKind: NodeKind.STATEMENT,
12
+ subKind: StatementKind.COMPUTED_ARRAY_DEFINITION,
13
+ checkFunc: function (
14
+ definition: ComputedArrayDefinition,
15
+ _symbolTable,
16
+ _strict,
17
+ ): CheckResult[] {
18
+ const results: CheckResult[] = [];
19
+
20
+ for (const dimension of definition.dimensions) {
21
+ if (dimension.nodeKind === NodeKind.ARRAY_DIMENSION) {
22
+ const explicitDimension = dimension as ExplicitArrayDimension;
23
+ if (
24
+ explicitDimension.arrayDimensionKind === ArrayDimensionKind.EXPLICIT
25
+ ) {
26
+ const size = explicitDimension.size;
27
+ if (isNumberLiteral(size)) {
28
+ if (
29
+ size.value <= 0 ||
30
+ size.numberLiteralKind !== NumberLiteralKind.INTEGER
31
+ ) {
32
+ results.push({
33
+ message: "Array dimensions must be a positive integer.",
34
+ location: size.startToken!.getLocation(),
35
+ });
36
+ }
37
+ }
38
+ }
39
+ }
40
+ }
41
+
42
+ return results;
43
+ },
44
+ };
@@ -0,0 +1,45 @@
1
+ import type { ComputedElementaryTypeDefinition } from "../../ast/node/computed-elementary-type-definition.ts";
2
+ import { NodeKind } from "../../ast/node/enum/node-kind.ts";
3
+ import { StatementKind } from "../../ast/node/enum/statement-kind.ts";
4
+ import type { SymbolTable } from "../symbol-table.ts";
5
+ import { getRequiredIdentifier } from "../util/symbol-table-utils.ts";
6
+ import type { Check, CheckResult } from "./check.ts";
7
+
8
+ export const checkComputedElementaryTypeDefinition: Check = {
9
+ nodeKind: NodeKind.STATEMENT,
10
+ subKind: StatementKind.COMPUTED_ELEMENTARY_TYPE_DEFINITION,
11
+ checkFunc: function (
12
+ definition: ComputedElementaryTypeDefinition,
13
+ symbolTable: SymbolTable,
14
+ strict: boolean,
15
+ ): CheckResult[] {
16
+ if (definition.value !== undefined) {
17
+ return [];
18
+ }
19
+
20
+ const identifier = getRequiredIdentifier(
21
+ definition.identifier,
22
+ definition,
23
+ strict,
24
+ );
25
+
26
+ if (!identifier) {
27
+ return [];
28
+ }
29
+
30
+ // get the symbol using the identifier.name
31
+ const symbol = symbolTable.lookupVariable(identifier.name);
32
+
33
+ if (!symbol || !symbol.attributes.isConst) {
34
+ return [];
35
+ }
36
+
37
+ return [
38
+ {
39
+ message:
40
+ `${identifier.name}: const computed elementary type definition must have a value specified`,
41
+ location: identifier.startToken!.getLocation(),
42
+ },
43
+ ];
44
+ },
45
+ };