semantifold 0.1.1 → 0.3.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 (399) hide show
  1. package/README.md +42 -10
  2. package/build/index.d.ts +32 -3
  3. package/build/index.d.ts.map +1 -1
  4. package/build/index.js +99 -4
  5. package/build/src/acceptance.d.ts +32 -0
  6. package/build/src/acceptance.d.ts.map +1 -0
  7. package/build/src/acceptance.js +358 -0
  8. package/build/src/array.d.ts +7 -0
  9. package/build/src/array.d.ts.map +1 -0
  10. package/build/src/array.js +18 -0
  11. package/build/src/artifact-path.d.ts +13 -0
  12. package/build/src/artifact-path.d.ts.map +1 -0
  13. package/build/src/artifact-path.js +30 -0
  14. package/build/src/artifacts.d.ts +7 -0
  15. package/build/src/artifacts.d.ts.map +1 -0
  16. package/build/src/artifacts.js +389 -0
  17. package/build/src/backends/c-runtime.d.ts +3 -0
  18. package/build/src/backends/c-runtime.d.ts.map +1 -0
  19. package/build/src/backends/c-runtime.js +151 -0
  20. package/build/src/backends/c-validation.d.ts +12 -0
  21. package/build/src/backends/c-validation.d.ts.map +1 -0
  22. package/build/src/backends/c-validation.js +85 -0
  23. package/build/src/backends/c.d.ts +31 -0
  24. package/build/src/backends/c.d.ts.map +1 -0
  25. package/build/src/backends/c.js +308 -0
  26. package/build/src/backends/cpp-runtime.d.ts +3 -0
  27. package/build/src/backends/cpp-runtime.d.ts.map +1 -0
  28. package/build/src/backends/cpp-runtime.js +99 -0
  29. package/build/src/backends/cpp-validation.d.ts +9 -0
  30. package/build/src/backends/cpp-validation.d.ts.map +1 -0
  31. package/build/src/backends/cpp-validation.js +74 -0
  32. package/build/src/backends/cpp.d.ts +16 -0
  33. package/build/src/backends/cpp.d.ts.map +1 -0
  34. package/build/src/backends/cpp.js +285 -0
  35. package/build/src/backends/csharp.d.ts +20 -0
  36. package/build/src/backends/csharp.d.ts.map +1 -0
  37. package/build/src/backends/csharp.js +259 -0
  38. package/build/src/backends/go.d.ts +20 -0
  39. package/build/src/backends/go.d.ts.map +1 -0
  40. package/build/src/backends/go.js +374 -0
  41. package/build/src/backends/identifiers.d.ts +12 -0
  42. package/build/src/backends/identifiers.d.ts.map +1 -1
  43. package/build/src/backends/identifiers.js +79 -2
  44. package/build/src/backends/index.d.ts.map +1 -1
  45. package/build/src/backends/index.js +27 -37
  46. package/build/src/backends/native-validation.d.ts +9 -0
  47. package/build/src/backends/native-validation.d.ts.map +1 -0
  48. package/build/src/backends/native-validation.js +59 -0
  49. package/build/src/backends/ordered-expressions.d.ts +74 -0
  50. package/build/src/backends/ordered-expressions.d.ts.map +1 -0
  51. package/build/src/backends/ordered-expressions.js +159 -0
  52. package/build/src/backends/python.d.ts +8 -0
  53. package/build/src/backends/python.d.ts.map +1 -0
  54. package/build/src/backends/python.js +162 -0
  55. package/build/src/backends/scalars.d.ts.map +1 -1
  56. package/build/src/backends/scalars.js +8 -2
  57. package/build/src/backends/shared.d.ts.map +1 -1
  58. package/build/src/backends/shared.js +67 -19
  59. package/build/src/binary-mapping.d.ts +32 -0
  60. package/build/src/binary-mapping.d.ts.map +1 -0
  61. package/build/src/binary-mapping.js +285 -0
  62. package/build/src/diagnostic.d.ts +36 -4
  63. package/build/src/diagnostic.d.ts.map +1 -1
  64. package/build/src/diagnostic.js +42 -3
  65. package/build/src/frontends/c-parser.d.ts +20 -0
  66. package/build/src/frontends/c-parser.d.ts.map +1 -0
  67. package/build/src/frontends/c-parser.js +14 -0
  68. package/build/src/frontends/c.d.ts +220 -0
  69. package/build/src/frontends/c.d.ts.map +1 -0
  70. package/build/src/frontends/c.js +750 -0
  71. package/build/src/frontends/cpp-parser.d.ts +11 -0
  72. package/build/src/frontends/cpp-parser.d.ts.map +1 -0
  73. package/build/src/frontends/cpp-parser.js +15 -0
  74. package/build/src/frontends/cpp.d.ts +227 -0
  75. package/build/src/frontends/cpp.d.ts.map +1 -0
  76. package/build/src/frontends/cpp.js +784 -0
  77. package/build/src/frontends/csharp.d.ts +14 -0
  78. package/build/src/frontends/csharp.d.ts.map +1 -0
  79. package/build/src/frontends/csharp.js +708 -0
  80. package/build/src/frontends/go.d.ts +15 -0
  81. package/build/src/frontends/go.d.ts.map +1 -0
  82. package/build/src/frontends/go.js +712 -0
  83. package/build/src/frontends/index.d.ts.map +1 -1
  84. package/build/src/frontends/index.js +5 -23
  85. package/build/src/frontends/python.d.ts +14 -0
  86. package/build/src/frontends/python.d.ts.map +1 -0
  87. package/build/src/frontends/python.js +615 -0
  88. package/build/src/frontends/scalars.d.ts.map +1 -1
  89. package/build/src/frontends/scalars.js +21 -1
  90. package/build/src/language-registry.d.ts +113 -0
  91. package/build/src/language-registry.d.ts.map +1 -0
  92. package/build/src/language-registry.js +421 -0
  93. package/build/src/mapping.js +3 -2
  94. package/build/src/semantic/location.d.ts +7 -0
  95. package/build/src/semantic/location.d.ts.map +1 -1
  96. package/build/src/semantic/location.js +10 -1
  97. package/build/src/semantic/provenance.js +3 -3
  98. package/build/src/semantic/types.d.ts +399 -2
  99. package/build/src/semantic/types.d.ts.map +1 -1
  100. package/build/src/semantic/types.js +110 -2
  101. package/build/src/subprocess.d.ts +38 -0
  102. package/build/src/subprocess.d.ts.map +1 -0
  103. package/build/src/subprocess.js +233 -0
  104. package/build/src/timeout.d.ts +8 -0
  105. package/build/src/timeout.d.ts.map +1 -0
  106. package/build/src/timeout.js +11 -0
  107. package/build/src/toolchains.d.ts +107 -0
  108. package/build/src/toolchains.d.ts.map +1 -0
  109. package/build/src/toolchains.js +417 -0
  110. package/docs/architecture.md +23 -5
  111. package/docs/c.md +60 -0
  112. package/docs/cpp.md +61 -0
  113. package/docs/goals.md +4 -2
  114. package/docs/language-support.md +46 -6
  115. package/docs/parser-qualification.md +219 -0
  116. package/docs/plans/2026-09-05-standard-library-portability.md +46 -0
  117. package/docs/source-maps.md +38 -5
  118. package/docs/standard-library-portability.md +190 -0
  119. package/docs/testing.md +131 -3
  120. package/index.js +109 -4
  121. package/node_modules/node-addon-api/LICENSE.md +9 -0
  122. package/node_modules/node-addon-api/README.md +95 -0
  123. package/node_modules/node-addon-api/common.gypi +21 -0
  124. package/node_modules/node-addon-api/except.gypi +25 -0
  125. package/node_modules/node-addon-api/index.js +14 -0
  126. package/node_modules/node-addon-api/napi-inl.deprecated.h +186 -0
  127. package/node_modules/node-addon-api/napi-inl.h +7250 -0
  128. package/node_modules/node-addon-api/napi.h +3463 -0
  129. package/node_modules/node-addon-api/node_addon_api.gyp +42 -0
  130. package/node_modules/node-addon-api/node_api.gyp +9 -0
  131. package/node_modules/node-addon-api/noexcept.gypi +26 -0
  132. package/node_modules/node-addon-api/nothing.c +0 -0
  133. package/node_modules/node-addon-api/package-support.json +21 -0
  134. package/node_modules/node-addon-api/package.json +481 -0
  135. package/node_modules/node-addon-api/tools/README.md +73 -0
  136. package/node_modules/node-addon-api/tools/check-napi.js +99 -0
  137. package/node_modules/node-addon-api/tools/clang-format.js +71 -0
  138. package/node_modules/node-addon-api/tools/conversion.js +301 -0
  139. package/node_modules/node-gyp-build/LICENSE +21 -0
  140. package/node_modules/node-gyp-build/README.md +58 -0
  141. package/node_modules/node-gyp-build/SECURITY.md +5 -0
  142. package/node_modules/node-gyp-build/bin.js +84 -0
  143. package/node_modules/node-gyp-build/build-test.js +19 -0
  144. package/node_modules/node-gyp-build/index.js +6 -0
  145. package/node_modules/node-gyp-build/node-gyp-build.js +207 -0
  146. package/node_modules/node-gyp-build/optional.js +7 -0
  147. package/node_modules/node-gyp-build/package.json +43 -0
  148. package/node_modules/semantifold-tree-sitter-legacy-internal/LICENSE +15 -0
  149. package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +7 -0
  150. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/LICENSE +21 -0
  151. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/README.md +90 -0
  152. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/binding.gyp +79 -0
  153. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/index.js +895 -0
  154. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/package.json +62 -0
  155. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
  156. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
  157. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
  158. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
  159. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/addon_data.h +47 -0
  160. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/binding.cc +35 -0
  161. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.cc +140 -0
  162. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.h +22 -0
  163. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.cc +106 -0
  164. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.h +17 -0
  165. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.cc +70 -0
  166. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.h +19 -0
  167. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
  168. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
  169. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.cc +1056 -0
  170. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.h +30 -0
  171. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.cc +298 -0
  172. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.h +35 -0
  173. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.cc +383 -0
  174. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.h +39 -0
  175. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.cc +307 -0
  176. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.h +45 -0
  177. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
  178. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.h +52 -0
  179. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/tree-sitter.d.ts +211 -0
  180. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1266 -0
  181. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
  182. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
  183. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +290 -0
  184. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
  185. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
  186. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
  187. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +501 -0
  188. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
  189. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
  190. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +221 -0
  191. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +299 -0
  192. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
  193. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +419 -0
  194. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +49 -0
  195. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +14 -0
  196. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +774 -0
  197. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2151 -0
  198. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +230 -0
  199. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +62 -0
  200. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4134 -0
  201. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
  202. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
  203. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +899 -0
  204. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
  205. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1060 -0
  206. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +382 -0
  207. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +165 -0
  208. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
  209. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +714 -0
  210. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
  211. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
  212. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
  213. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
  214. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
  215. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
  216. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
  217. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
  218. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
  219. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
  220. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +50 -0
  221. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +23 -0
  222. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +109 -0
  223. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1294 -0
  224. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1823 -0
  225. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
  226. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/LICENSE +21 -0
  227. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/README.md +18 -0
  228. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/binding.gyp +29 -0
  229. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding.cc +20 -0
  230. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding_test.js +9 -0
  231. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.d.ts +28 -0
  232. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.js +11 -0
  233. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/grammar.js +1470 -0
  234. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/package.json +60 -0
  235. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-arm64/tree-sitter-c.node +0 -0
  236. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-x64/tree-sitter-c.node +0 -0
  237. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-arm64/tree-sitter-c.node +0 -0
  238. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-x64/tree-sitter-c.node +0 -0
  239. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-arm64/tree-sitter-c.node +0 -0
  240. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-x64/tree-sitter-c.node +0 -0
  241. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/highlights.scm +81 -0
  242. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/tags.scm +9 -0
  243. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/grammar.json +9735 -0
  244. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/node-types.json +4614 -0
  245. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/parser.c +119615 -0
  246. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/alloc.h +54 -0
  247. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/array.h +290 -0
  248. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/parser.h +266 -0
  249. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter-c.wasm +0 -0
  250. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter.json +43 -0
  251. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/LICENSE +21 -0
  252. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/README.md +22 -0
  253. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/binding.gyp +30 -0
  254. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding.cc +20 -0
  255. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding_test.js +9 -0
  256. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.d.ts +28 -0
  257. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.js +11 -0
  258. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/grammar.js +1436 -0
  259. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/package.json +61 -0
  260. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-arm64/tree-sitter-cpp.node +0 -0
  261. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-x64/tree-sitter-cpp.node +0 -0
  262. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-arm64/tree-sitter-cpp.node +0 -0
  263. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-x64/tree-sitter-cpp.node +0 -0
  264. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-arm64/tree-sitter-cpp.node +0 -0
  265. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-x64/tree-sitter-cpp.node +0 -0
  266. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/highlights.scm +70 -0
  267. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/injections.scm +3 -0
  268. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/tags.scm +15 -0
  269. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/grammar.json +17084 -0
  270. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/node-types.json +7997 -0
  271. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/parser.c +530368 -0
  272. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/scanner.c +148 -0
  273. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/alloc.h +54 -0
  274. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/array.h +290 -0
  275. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/parser.h +266 -0
  276. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter-cpp.wasm +0 -0
  277. package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter.json +55 -0
  278. package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +22 -0
  279. package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +152 -0
  280. package/node_modules/tree-sitter/LICENSE +21 -0
  281. package/node_modules/tree-sitter/README.md +128 -0
  282. package/node_modules/tree-sitter/binding.gyp +88 -0
  283. package/node_modules/tree-sitter/index.js +950 -0
  284. package/node_modules/tree-sitter/package.json +76 -0
  285. package/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
  286. package/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
  287. package/node_modules/tree-sitter/prebuilds/linux-arm64/tree-sitter.node +0 -0
  288. package/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
  289. package/node_modules/tree-sitter/prebuilds/win32-arm64/tree-sitter.node +0 -0
  290. package/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
  291. package/node_modules/tree-sitter/src/addon_data.h +47 -0
  292. package/node_modules/tree-sitter/src/binding.cc +35 -0
  293. package/node_modules/tree-sitter/src/conversions.cc +140 -0
  294. package/node_modules/tree-sitter/src/conversions.h +22 -0
  295. package/node_modules/tree-sitter/src/language.cc +105 -0
  296. package/node_modules/tree-sitter/src/language.h +17 -0
  297. package/node_modules/tree-sitter/src/logger.cc +70 -0
  298. package/node_modules/tree-sitter/src/logger.h +19 -0
  299. package/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
  300. package/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
  301. package/node_modules/tree-sitter/src/node.cc +1088 -0
  302. package/node_modules/tree-sitter/src/node.h +30 -0
  303. package/node_modules/tree-sitter/src/parser.cc +332 -0
  304. package/node_modules/tree-sitter/src/parser.h +35 -0
  305. package/node_modules/tree-sitter/src/query.cc +425 -0
  306. package/node_modules/tree-sitter/src/query.h +40 -0
  307. package/node_modules/tree-sitter/src/tree.cc +316 -0
  308. package/node_modules/tree-sitter/src/tree.h +45 -0
  309. package/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
  310. package/node_modules/tree-sitter/src/tree_cursor.h +52 -0
  311. package/node_modules/tree-sitter/tree-sitter.d.ts +1083 -0
  312. package/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1478 -0
  313. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
  314. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
  315. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +291 -0
  316. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
  317. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
  318. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
  319. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +523 -0
  320. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
  321. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
  322. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +293 -0
  323. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +293 -0
  324. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
  325. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +483 -0
  326. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +54 -0
  327. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +12 -0
  328. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +875 -0
  329. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2297 -0
  330. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +286 -0
  331. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +48 -0
  332. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/portable/endian.h +241 -0
  333. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4347 -0
  334. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
  335. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
  336. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +912 -0
  337. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
  338. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1034 -0
  339. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +399 -0
  340. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +170 -0
  341. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
  342. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +716 -0
  343. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
  344. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/ts_assert.h +11 -0
  345. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
  346. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
  347. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
  348. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
  349. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
  350. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
  351. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
  352. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
  353. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
  354. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +75 -0
  355. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +24 -0
  356. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +137 -0
  357. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1314 -0
  358. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1937 -0
  359. package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
  360. package/package.json +24 -6
  361. package/src/acceptance.js +380 -0
  362. package/src/array.js +19 -0
  363. package/src/artifact-path.js +34 -0
  364. package/src/artifacts.js +420 -0
  365. package/src/backends/c-runtime.js +151 -0
  366. package/src/backends/c-validation.js +83 -0
  367. package/src/backends/c.js +308 -0
  368. package/src/backends/cpp-runtime.js +99 -0
  369. package/src/backends/cpp-validation.js +70 -0
  370. package/src/backends/cpp.js +285 -0
  371. package/src/backends/csharp.js +270 -0
  372. package/src/backends/go.js +383 -0
  373. package/src/backends/identifiers.js +80 -1
  374. package/src/backends/index.js +23 -32
  375. package/src/backends/native-validation.js +64 -0
  376. package/src/backends/ordered-expressions.js +161 -0
  377. package/src/backends/python.js +175 -0
  378. package/src/backends/scalars.js +8 -1
  379. package/src/backends/shared.js +64 -17
  380. package/src/binary-mapping.js +305 -0
  381. package/src/diagnostic.js +34 -2
  382. package/src/frontends/c-parser.js +17 -0
  383. package/src/frontends/c.js +780 -0
  384. package/src/frontends/cpp-parser.js +18 -0
  385. package/src/frontends/cpp.js +816 -0
  386. package/src/frontends/csharp.js +759 -0
  387. package/src/frontends/go.js +770 -0
  388. package/src/frontends/index.js +5 -20
  389. package/src/frontends/python.js +689 -0
  390. package/src/frontends/scalars.js +20 -0
  391. package/src/language-registry.js +454 -0
  392. package/src/mapping.js +2 -1
  393. package/src/semantic/location.js +10 -0
  394. package/src/semantic/provenance.js +2 -2
  395. package/src/semantic/types.js +124 -1
  396. package/src/subprocess.js +232 -0
  397. package/src/timeout.js +12 -0
  398. package/src/toolchains.js +448 -0
  399. package/tsconfig.json +1 -0
@@ -0,0 +1,1470 @@
1
+ /**
2
+ * @file C grammar for tree-sitter
3
+ * @author Max Brunsfeld <maxbrunsfeld@gmail.com>
4
+ * @author Amaan Qureshi <amaanq12@gmail.com>
5
+ * @license MIT
6
+ */
7
+
8
+ /// <reference types="tree-sitter-cli/dsl" />
9
+ // @ts-check
10
+
11
+ const PREC = {
12
+ PAREN_DECLARATOR: -10,
13
+ ASSIGNMENT: -2,
14
+ CONDITIONAL: -1,
15
+ DEFAULT: 0,
16
+ LOGICAL_OR: 1,
17
+ LOGICAL_AND: 2,
18
+ INCLUSIVE_OR: 3,
19
+ EXCLUSIVE_OR: 4,
20
+ BITWISE_AND: 5,
21
+ EQUAL: 6,
22
+ RELATIONAL: 7,
23
+ OFFSETOF: 8,
24
+ SHIFT: 9,
25
+ ADD: 10,
26
+ MULTIPLY: 11,
27
+ CAST: 12,
28
+ SIZEOF: 13,
29
+ UNARY: 14,
30
+ CALL: 15,
31
+ FIELD: 16,
32
+ SUBSCRIPT: 17,
33
+ };
34
+
35
+ module.exports = grammar({
36
+ name: 'c',
37
+
38
+ conflicts: $ => [
39
+ [$.type_specifier, $._declarator],
40
+ [$.type_specifier, $._declarator, $.macro_type_specifier],
41
+ [$.type_specifier, $.expression],
42
+ [$.type_specifier, $.expression, $.macro_type_specifier],
43
+ [$.type_specifier, $.macro_type_specifier],
44
+ [$.type_specifier, $.sized_type_specifier],
45
+ [$.sized_type_specifier],
46
+ [$.attributed_statement],
47
+ [$._declaration_modifiers, $.attributed_statement],
48
+ [$.enum_specifier],
49
+ [$.type_specifier, $._old_style_parameter_list],
50
+ [$.parameter_list, $._old_style_parameter_list],
51
+ [$.function_declarator, $._function_declaration_declarator],
52
+ [$._block_item, $.statement],
53
+ [$._top_level_item, $._top_level_statement],
54
+ [$.type_specifier, $._top_level_expression_statement],
55
+ [$.type_qualifier, $.extension_expression],
56
+ ],
57
+
58
+ extras: $ => [
59
+ /\s|\\\r?\n/,
60
+ $.comment,
61
+ ],
62
+
63
+ inline: $ => [
64
+ $._type_identifier,
65
+ $._field_identifier,
66
+ $._statement_identifier,
67
+ $._non_case_statement,
68
+ $._assignment_left_expression,
69
+ $._expression_not_binary,
70
+ ],
71
+
72
+ supertypes: $ => [
73
+ $.expression,
74
+ $.statement,
75
+ $.type_specifier,
76
+ $._declarator,
77
+ $._field_declarator,
78
+ $._type_declarator,
79
+ $._abstract_declarator,
80
+ ],
81
+
82
+ word: $ => $.identifier,
83
+
84
+ rules: {
85
+ translation_unit: $ => repeat($._top_level_item),
86
+
87
+ // Top level items are block items with the exception of the expression statement
88
+ _top_level_item: $ => choice(
89
+ $.function_definition,
90
+ alias($._old_style_function_definition, $.function_definition),
91
+ $.linkage_specification,
92
+ $.declaration,
93
+ $._top_level_statement,
94
+ $.attributed_statement,
95
+ $.type_definition,
96
+ $._empty_declaration,
97
+ $.preproc_if,
98
+ $.preproc_ifdef,
99
+ $.preproc_include,
100
+ $.preproc_def,
101
+ $.preproc_function_def,
102
+ $.preproc_call,
103
+ ),
104
+
105
+ _block_item: $ => choice(
106
+ $.function_definition,
107
+ alias($._old_style_function_definition, $.function_definition),
108
+ $.linkage_specification,
109
+ $.declaration,
110
+ $.statement,
111
+ $.attributed_statement,
112
+ $.type_definition,
113
+ $._empty_declaration,
114
+ $.preproc_if,
115
+ $.preproc_ifdef,
116
+ $.preproc_include,
117
+ $.preproc_def,
118
+ $.preproc_function_def,
119
+ $.preproc_call,
120
+ ),
121
+
122
+ // Preprocesser
123
+
124
+ preproc_include: $ => seq(
125
+ preprocessor('include'),
126
+ field('path', choice(
127
+ $.string_literal,
128
+ $.system_lib_string,
129
+ $.identifier,
130
+ alias($.preproc_call_expression, $.call_expression),
131
+ )),
132
+ token.immediate(/\r?\n/),
133
+ ),
134
+
135
+ preproc_def: $ => seq(
136
+ preprocessor('define'),
137
+ field('name', $.identifier),
138
+ field('value', optional($.preproc_arg)),
139
+ token.immediate(/\r?\n/),
140
+ ),
141
+
142
+ preproc_function_def: $ => seq(
143
+ preprocessor('define'),
144
+ field('name', $.identifier),
145
+ field('parameters', $.preproc_params),
146
+ field('value', optional($.preproc_arg)),
147
+ token.immediate(/\r?\n/),
148
+ ),
149
+
150
+ preproc_params: $ => seq(
151
+ token.immediate('('), commaSep(choice($.identifier, '...')), ')',
152
+ ),
153
+
154
+ preproc_call: $ => seq(
155
+ field('directive', $.preproc_directive),
156
+ field('argument', optional($.preproc_arg)),
157
+ token.immediate(/\r?\n/),
158
+ ),
159
+
160
+ ...preprocIf('', $ => $._block_item),
161
+ ...preprocIf('_in_field_declaration_list', $ => $._field_declaration_list_item),
162
+ ...preprocIf('_in_enumerator_list', $ => seq($.enumerator, ',')),
163
+ ...preprocIf('_in_enumerator_list_no_comma', $ => $.enumerator, -1),
164
+
165
+ preproc_arg: _ => token(prec(-1, /\S([^/\n]|\/[^*]|\\\r?\n)*/)),
166
+ preproc_directive: _ => /#[ \t]*[a-zA-Z0-9]\w*/,
167
+
168
+ _preproc_expression: $ => choice(
169
+ $.identifier,
170
+ alias($.preproc_call_expression, $.call_expression),
171
+ $.number_literal,
172
+ $.char_literal,
173
+ $.preproc_defined,
174
+ alias($.preproc_unary_expression, $.unary_expression),
175
+ alias($.preproc_binary_expression, $.binary_expression),
176
+ alias($.preproc_parenthesized_expression, $.parenthesized_expression),
177
+ ),
178
+
179
+ preproc_parenthesized_expression: $ => seq(
180
+ '(',
181
+ $._preproc_expression,
182
+ ')',
183
+ ),
184
+
185
+ preproc_defined: $ => choice(
186
+ prec(PREC.CALL, seq('defined', '(', $.identifier, ')')),
187
+ seq('defined', $.identifier),
188
+ ),
189
+
190
+ preproc_unary_expression: $ => prec.left(PREC.UNARY, seq(
191
+ field('operator', choice('!', '~', '-', '+')),
192
+ field('argument', $._preproc_expression),
193
+ )),
194
+
195
+ preproc_call_expression: $ => prec(PREC.CALL, seq(
196
+ field('function', $.identifier),
197
+ field('arguments', alias($.preproc_argument_list, $.argument_list)),
198
+ )),
199
+
200
+ preproc_argument_list: $ => seq(
201
+ '(',
202
+ commaSep($._preproc_expression),
203
+ ')',
204
+ ),
205
+
206
+ preproc_binary_expression: $ => {
207
+ const table = [
208
+ ['+', PREC.ADD],
209
+ ['-', PREC.ADD],
210
+ ['*', PREC.MULTIPLY],
211
+ ['/', PREC.MULTIPLY],
212
+ ['%', PREC.MULTIPLY],
213
+ ['||', PREC.LOGICAL_OR],
214
+ ['&&', PREC.LOGICAL_AND],
215
+ ['|', PREC.INCLUSIVE_OR],
216
+ ['^', PREC.EXCLUSIVE_OR],
217
+ ['&', PREC.BITWISE_AND],
218
+ ['==', PREC.EQUAL],
219
+ ['!=', PREC.EQUAL],
220
+ ['>', PREC.RELATIONAL],
221
+ ['>=', PREC.RELATIONAL],
222
+ ['<=', PREC.RELATIONAL],
223
+ ['<', PREC.RELATIONAL],
224
+ ['<<', PREC.SHIFT],
225
+ ['>>', PREC.SHIFT],
226
+ ];
227
+
228
+ return choice(...table.map(([operator, precedence]) => {
229
+ return prec.left(precedence, seq(
230
+ field('left', $._preproc_expression),
231
+ // @ts-ignore
232
+ field('operator', operator),
233
+ field('right', $._preproc_expression),
234
+ ));
235
+ }));
236
+ },
237
+
238
+ // Main Grammar
239
+
240
+ function_definition: $ => seq(
241
+ optional($.ms_call_modifier),
242
+ $._declaration_specifiers,
243
+ optional($.ms_call_modifier),
244
+ field('declarator', $._declarator),
245
+ field('body', $.compound_statement),
246
+ ),
247
+
248
+ _old_style_function_definition: $ => seq(
249
+ optional($.ms_call_modifier),
250
+ $._declaration_specifiers,
251
+ field('declarator', alias($._old_style_function_declarator, $.function_declarator)),
252
+ repeat($.declaration),
253
+ field('body', $.compound_statement),
254
+ ),
255
+
256
+ declaration: $ => seq(
257
+ $._declaration_specifiers,
258
+ commaSep1(field('declarator', choice(
259
+ seq(
260
+ optional($.ms_call_modifier),
261
+ $._declaration_declarator,
262
+ optional($.gnu_asm_expression),
263
+ ),
264
+ $.init_declarator,
265
+ ))),
266
+ ';',
267
+ ),
268
+
269
+ type_definition: $ => seq(
270
+ optional('__extension__'),
271
+ 'typedef',
272
+ $._type_definition_type,
273
+ $._type_definition_declarators,
274
+ repeat($.attribute_specifier),
275
+ ';',
276
+ ),
277
+ _type_definition_type: $ => seq(repeat($.type_qualifier), field('type', $.type_specifier), repeat($.type_qualifier)),
278
+ _type_definition_declarators: $ => commaSep1(field('declarator', $._type_declarator)),
279
+
280
+ _declaration_modifiers: $ => choice(
281
+ $.storage_class_specifier,
282
+ $.type_qualifier,
283
+ $.attribute_specifier,
284
+ $.attribute_declaration,
285
+ $.ms_declspec_modifier,
286
+ ),
287
+
288
+ _declaration_specifiers: $ => prec.right(seq(
289
+ repeat($._declaration_modifiers),
290
+ field('type', $.type_specifier),
291
+ repeat($._declaration_modifiers),
292
+ )),
293
+
294
+ linkage_specification: $ => seq(
295
+ 'extern',
296
+ field('value', $.string_literal),
297
+ field('body', choice(
298
+ $.function_definition,
299
+ $.declaration,
300
+ $.declaration_list,
301
+ )),
302
+ ),
303
+
304
+ attribute_specifier: $ => seq(
305
+ choice('__attribute__', '__attribute'),
306
+ '(',
307
+ $.argument_list,
308
+ ')',
309
+ ),
310
+
311
+ attribute: $ => seq(
312
+ optional(seq(field('prefix', $.identifier), '::')),
313
+ field('name', $.identifier),
314
+ optional($.argument_list),
315
+ ),
316
+
317
+ attribute_declaration: $ => seq(
318
+ '[[',
319
+ commaSep1($.attribute),
320
+ ']]',
321
+ ),
322
+
323
+ ms_declspec_modifier: $ => seq(
324
+ '__declspec',
325
+ '(',
326
+ $.identifier,
327
+ ')',
328
+ ),
329
+
330
+ ms_based_modifier: $ => seq(
331
+ '__based',
332
+ $.argument_list,
333
+ ),
334
+
335
+ ms_call_modifier: _ => choice(
336
+ '__cdecl',
337
+ '__clrcall',
338
+ '__stdcall',
339
+ '__fastcall',
340
+ '__thiscall',
341
+ '__vectorcall',
342
+ ),
343
+
344
+ ms_restrict_modifier: _ => '__restrict',
345
+
346
+ ms_unsigned_ptr_modifier: _ => '__uptr',
347
+
348
+ ms_signed_ptr_modifier: _ => '__sptr',
349
+
350
+ ms_unaligned_ptr_modifier: _ => choice('_unaligned', '__unaligned'),
351
+
352
+ ms_pointer_modifier: $ => choice(
353
+ $.ms_unaligned_ptr_modifier,
354
+ $.ms_restrict_modifier,
355
+ $.ms_unsigned_ptr_modifier,
356
+ $.ms_signed_ptr_modifier,
357
+ ),
358
+
359
+ declaration_list: $ => seq(
360
+ '{',
361
+ repeat($._block_item),
362
+ '}',
363
+ ),
364
+
365
+ _declarator: $ => choice(
366
+ $.attributed_declarator,
367
+ $.pointer_declarator,
368
+ $.function_declarator,
369
+ $.array_declarator,
370
+ $.parenthesized_declarator,
371
+ $.identifier,
372
+ ),
373
+
374
+ _declaration_declarator: $ => choice(
375
+ $.attributed_declarator,
376
+ $.pointer_declarator,
377
+ alias($._function_declaration_declarator, $.function_declarator),
378
+ $.array_declarator,
379
+ $.parenthesized_declarator,
380
+ $.identifier,
381
+ ),
382
+
383
+ _field_declarator: $ => choice(
384
+ alias($.attributed_field_declarator, $.attributed_declarator),
385
+ alias($.pointer_field_declarator, $.pointer_declarator),
386
+ alias($.function_field_declarator, $.function_declarator),
387
+ alias($.array_field_declarator, $.array_declarator),
388
+ alias($.parenthesized_field_declarator, $.parenthesized_declarator),
389
+ $._field_identifier,
390
+ ),
391
+
392
+ _type_declarator: $ => choice(
393
+ alias($.attributed_type_declarator, $.attributed_declarator),
394
+ alias($.pointer_type_declarator, $.pointer_declarator),
395
+ alias($.function_type_declarator, $.function_declarator),
396
+ alias($.array_type_declarator, $.array_declarator),
397
+ alias($.parenthesized_type_declarator, $.parenthesized_declarator),
398
+ $._type_identifier,
399
+ alias(choice('signed', 'unsigned', 'long', 'short'), $.primitive_type),
400
+ $.primitive_type,
401
+ ),
402
+
403
+ _abstract_declarator: $ => choice(
404
+ $.abstract_pointer_declarator,
405
+ $.abstract_function_declarator,
406
+ $.abstract_array_declarator,
407
+ $.abstract_parenthesized_declarator,
408
+ ),
409
+
410
+ parenthesized_declarator: $ => prec.dynamic(PREC.PAREN_DECLARATOR, seq(
411
+ '(',
412
+ optional($.ms_call_modifier),
413
+ $._declarator,
414
+ ')',
415
+ )),
416
+ parenthesized_field_declarator: $ => prec.dynamic(PREC.PAREN_DECLARATOR, seq(
417
+ '(',
418
+ optional($.ms_call_modifier),
419
+ $._field_declarator,
420
+ ')',
421
+ )),
422
+ parenthesized_type_declarator: $ => prec.dynamic(PREC.PAREN_DECLARATOR, seq(
423
+ '(',
424
+ optional($.ms_call_modifier),
425
+ $._type_declarator,
426
+ ')',
427
+ )),
428
+ abstract_parenthesized_declarator: $ => prec(1, seq(
429
+ '(',
430
+ optional($.ms_call_modifier),
431
+ $._abstract_declarator,
432
+ ')',
433
+ )),
434
+
435
+
436
+ attributed_declarator: $ => prec.right(seq(
437
+ $._declarator,
438
+ repeat1($.attribute_declaration),
439
+ )),
440
+ attributed_field_declarator: $ => prec.right(seq(
441
+ $._field_declarator,
442
+ repeat1($.attribute_declaration),
443
+ )),
444
+ attributed_type_declarator: $ => prec.right(seq(
445
+ $._type_declarator,
446
+ repeat1($.attribute_declaration),
447
+ )),
448
+
449
+ pointer_declarator: $ => prec.dynamic(1, prec.right(seq(
450
+ optional($.ms_based_modifier),
451
+ '*',
452
+ repeat($.ms_pointer_modifier),
453
+ repeat($.type_qualifier),
454
+ field('declarator', $._declarator),
455
+ ))),
456
+ pointer_field_declarator: $ => prec.dynamic(1, prec.right(seq(
457
+ optional($.ms_based_modifier),
458
+ '*',
459
+ repeat($.ms_pointer_modifier),
460
+ repeat($.type_qualifier),
461
+ field('declarator', $._field_declarator),
462
+ ))),
463
+ pointer_type_declarator: $ => prec.dynamic(1, prec.right(seq(
464
+ optional($.ms_based_modifier),
465
+ '*',
466
+ repeat($.ms_pointer_modifier),
467
+ repeat($.type_qualifier),
468
+ field('declarator', $._type_declarator),
469
+ ))),
470
+ abstract_pointer_declarator: $ => prec.dynamic(1, prec.right(seq('*',
471
+ repeat($.ms_pointer_modifier),
472
+ repeat($.type_qualifier),
473
+ field('declarator', optional($._abstract_declarator)),
474
+ ))),
475
+
476
+ function_declarator: $ => prec.right(1,
477
+ seq(
478
+ field('declarator', $._declarator),
479
+ field('parameters', $.parameter_list),
480
+ optional($.gnu_asm_expression),
481
+ repeat(choice(
482
+ $.attribute_specifier,
483
+ $.identifier,
484
+ alias($.preproc_call_expression, $.call_expression),
485
+ )),
486
+ ),
487
+ ),
488
+
489
+ _function_declaration_declarator: $ => prec.right(1,
490
+ seq(
491
+ field('declarator', $._declarator),
492
+ field('parameters', $.parameter_list),
493
+ optional($.gnu_asm_expression),
494
+ repeat($.attribute_specifier),
495
+ )),
496
+
497
+ function_field_declarator: $ => prec(1, seq(
498
+ field('declarator', $._field_declarator),
499
+ field('parameters', $.parameter_list),
500
+ )),
501
+ function_type_declarator: $ => prec(1, seq(
502
+ field('declarator', $._type_declarator),
503
+ field('parameters', $.parameter_list),
504
+ )),
505
+ abstract_function_declarator: $ => prec(1, seq(
506
+ field('declarator', optional($._abstract_declarator)),
507
+ field('parameters', $.parameter_list),
508
+ )),
509
+
510
+ _old_style_function_declarator: $ => seq(
511
+ field('declarator', $._declarator),
512
+ field('parameters', alias($._old_style_parameter_list, $.parameter_list)),
513
+ ),
514
+
515
+ array_declarator: $ => prec(1, seq(
516
+ field('declarator', $._declarator),
517
+ '[',
518
+ repeat(choice($.type_qualifier, 'static')),
519
+ field('size', optional(choice($.expression, '*'))),
520
+ ']',
521
+ )),
522
+ array_field_declarator: $ => prec(1, seq(
523
+ field('declarator', $._field_declarator),
524
+ '[',
525
+ repeat(choice($.type_qualifier, 'static')),
526
+ field('size', optional(choice($.expression, '*'))),
527
+ ']',
528
+ )),
529
+ array_type_declarator: $ => prec(1, seq(
530
+ field('declarator', $._type_declarator),
531
+ '[',
532
+ repeat(choice($.type_qualifier, 'static')),
533
+ field('size', optional(choice($.expression, '*'))),
534
+ ']',
535
+ )),
536
+ abstract_array_declarator: $ => prec(1, seq(
537
+ field('declarator', optional($._abstract_declarator)),
538
+ '[',
539
+ repeat(choice($.type_qualifier, 'static')),
540
+ field('size', optional(choice($.expression, '*'))),
541
+ ']',
542
+ )),
543
+
544
+ init_declarator: $ => seq(
545
+ field('declarator', $._declarator),
546
+ '=',
547
+ field('value', choice($.initializer_list, $.expression)),
548
+ ),
549
+
550
+ compound_statement: $ => seq(
551
+ '{',
552
+ repeat($._block_item),
553
+ '}',
554
+ ),
555
+
556
+ storage_class_specifier: _ => choice(
557
+ 'extern',
558
+ 'static',
559
+ 'auto',
560
+ 'register',
561
+ 'inline',
562
+ '__inline',
563
+ '__inline__',
564
+ '__forceinline',
565
+ 'thread_local',
566
+ '__thread',
567
+ ),
568
+
569
+ type_qualifier: $ => choice(
570
+ 'const',
571
+ 'constexpr',
572
+ 'volatile',
573
+ 'restrict',
574
+ '__restrict__',
575
+ '__extension__',
576
+ '_Atomic',
577
+ '_Noreturn',
578
+ 'noreturn',
579
+ '_Nonnull',
580
+ $.alignas_qualifier,
581
+ ),
582
+
583
+ alignas_qualifier: $ => seq(
584
+ choice('alignas', '_Alignas'),
585
+ '(',
586
+ choice($.expression, $.type_descriptor),
587
+ ')',
588
+ ),
589
+
590
+ type_specifier: $ => choice(
591
+ $.struct_specifier,
592
+ $.union_specifier,
593
+ $.enum_specifier,
594
+ $.macro_type_specifier,
595
+ $.sized_type_specifier,
596
+ $.primitive_type,
597
+ $._type_identifier,
598
+ ),
599
+
600
+ sized_type_specifier: $ => choice(
601
+ seq(
602
+ repeat(choice(
603
+ 'signed',
604
+ 'unsigned',
605
+ 'long',
606
+ 'short',
607
+ )),
608
+ field('type', optional(choice(
609
+ prec.dynamic(-1, $._type_identifier),
610
+ $.primitive_type,
611
+ ))),
612
+ repeat1(choice(
613
+ 'signed',
614
+ 'unsigned',
615
+ 'long',
616
+ 'short',
617
+ )),
618
+ ),
619
+ seq(
620
+ repeat1(choice(
621
+ 'signed',
622
+ 'unsigned',
623
+ 'long',
624
+ 'short',
625
+ )),
626
+ repeat($.type_qualifier),
627
+ field('type', optional(choice(
628
+ prec.dynamic(-1, $._type_identifier),
629
+ $.primitive_type,
630
+ ))),
631
+ repeat(choice(
632
+ 'signed',
633
+ 'unsigned',
634
+ 'long',
635
+ 'short',
636
+ )),
637
+ ),
638
+ ),
639
+
640
+ primitive_type: _ => token(choice(
641
+ 'bool',
642
+ 'char',
643
+ 'int',
644
+ 'float',
645
+ 'double',
646
+ 'void',
647
+ 'size_t',
648
+ 'ssize_t',
649
+ 'ptrdiff_t',
650
+ 'intptr_t',
651
+ 'uintptr_t',
652
+ 'charptr_t',
653
+ 'nullptr_t',
654
+ 'max_align_t',
655
+ ...[8, 16, 32, 64].map(n => `int${n}_t`),
656
+ ...[8, 16, 32, 64].map(n => `uint${n}_t`),
657
+ ...[8, 16, 32, 64].map(n => `char${n}_t`),
658
+ )),
659
+
660
+ enum_specifier: $ => seq(
661
+ 'enum',
662
+ choice(
663
+ seq(
664
+ field('name', $._type_identifier),
665
+ optional(seq(':', field('underlying_type', $.primitive_type))),
666
+ field('body', optional($.enumerator_list)),
667
+ ),
668
+ field('body', $.enumerator_list),
669
+ ),
670
+ optional($.attribute_specifier),
671
+ ),
672
+
673
+ enumerator_list: $ => seq(
674
+ '{',
675
+ repeat(choice(
676
+ seq($.enumerator, ','),
677
+ alias($.preproc_if_in_enumerator_list, $.preproc_if),
678
+ alias($.preproc_ifdef_in_enumerator_list, $.preproc_ifdef),
679
+ seq($.preproc_call, ','),
680
+ )),
681
+ optional(seq(
682
+ choice(
683
+ $.enumerator,
684
+ alias($.preproc_if_in_enumerator_list_no_comma, $.preproc_if),
685
+ alias($.preproc_ifdef_in_enumerator_list_no_comma, $.preproc_ifdef),
686
+ $.preproc_call,
687
+ ),
688
+ )),
689
+ '}',
690
+ ),
691
+
692
+ struct_specifier: $ => prec.right(seq(
693
+ 'struct',
694
+ optional($.attribute_specifier),
695
+ optional($.ms_declspec_modifier),
696
+ choice(
697
+ seq(
698
+ field('name', $._type_identifier),
699
+ field('body', optional($.field_declaration_list)),
700
+ ),
701
+ field('body', $.field_declaration_list),
702
+ ),
703
+ optional($.attribute_specifier),
704
+ )),
705
+
706
+ union_specifier: $ => prec.right(seq(
707
+ 'union',
708
+ optional($.ms_declspec_modifier),
709
+ choice(
710
+ seq(
711
+ field('name', $._type_identifier),
712
+ field('body', optional($.field_declaration_list)),
713
+ ),
714
+ field('body', $.field_declaration_list),
715
+ ),
716
+ optional($.attribute_specifier),
717
+ )),
718
+
719
+ field_declaration_list: $ => seq(
720
+ '{',
721
+ repeat($._field_declaration_list_item),
722
+ '}',
723
+ ),
724
+
725
+ _field_declaration_list_item: $ => choice(
726
+ $.field_declaration,
727
+ $.preproc_def,
728
+ $.preproc_function_def,
729
+ $.preproc_call,
730
+ alias($.preproc_if_in_field_declaration_list, $.preproc_if),
731
+ alias($.preproc_ifdef_in_field_declaration_list, $.preproc_ifdef),
732
+ ),
733
+
734
+ field_declaration: $ => seq(
735
+ $._declaration_specifiers,
736
+ optional($._field_declaration_declarator),
737
+ optional($.attribute_specifier),
738
+ ';',
739
+ ),
740
+ _field_declaration_declarator: $ => commaSep1(seq(
741
+ field('declarator', $._field_declarator),
742
+ optional($.bitfield_clause),
743
+ )),
744
+
745
+ bitfield_clause: $ => seq(':', $.expression),
746
+
747
+ enumerator: $ => seq(
748
+ field('name', $.identifier),
749
+ optional(seq('=', field('value', $.expression))),
750
+ ),
751
+
752
+ variadic_parameter: _ => '...',
753
+
754
+ parameter_list: $ => seq(
755
+ '(',
756
+ choice(
757
+ commaSep(choice($.parameter_declaration, $.variadic_parameter)),
758
+ $.compound_statement,
759
+ ),
760
+ ')',
761
+ ),
762
+ _old_style_parameter_list: $ => seq(
763
+ '(',
764
+ commaSep(choice($.identifier, $.variadic_parameter)),
765
+ ')',
766
+ ),
767
+
768
+ parameter_declaration: $ => seq(
769
+ $._declaration_specifiers,
770
+ optional(field('declarator', choice(
771
+ $._declarator,
772
+ $._abstract_declarator,
773
+ ))),
774
+ repeat($.attribute_specifier),
775
+ ),
776
+
777
+ // Statements
778
+
779
+ attributed_statement: $ => seq(
780
+ repeat1($.attribute_declaration),
781
+ $.statement,
782
+ ),
783
+
784
+ statement: $ => choice(
785
+ $.case_statement,
786
+ $._non_case_statement,
787
+ ),
788
+
789
+ _non_case_statement: $ => choice(
790
+ $.attributed_statement,
791
+ $.labeled_statement,
792
+ $.compound_statement,
793
+ $.expression_statement,
794
+ $.if_statement,
795
+ $.switch_statement,
796
+ $.do_statement,
797
+ $.while_statement,
798
+ $.for_statement,
799
+ $.return_statement,
800
+ $.break_statement,
801
+ $.continue_statement,
802
+ $.goto_statement,
803
+ $.seh_try_statement,
804
+ $.seh_leave_statement,
805
+ ),
806
+
807
+ _top_level_statement: $ => choice(
808
+ $.case_statement,
809
+ $.attributed_statement,
810
+ $.labeled_statement,
811
+ $.compound_statement,
812
+ alias($._top_level_expression_statement, $.expression_statement),
813
+ $.if_statement,
814
+ $.switch_statement,
815
+ $.do_statement,
816
+ $.while_statement,
817
+ $.for_statement,
818
+ $.return_statement,
819
+ $.break_statement,
820
+ $.continue_statement,
821
+ $.goto_statement,
822
+ ),
823
+
824
+ labeled_statement: $ => seq(
825
+ field('label', $._statement_identifier),
826
+ ':',
827
+ choice($.declaration, $.statement),
828
+ ),
829
+
830
+ // This is missing binary expressions, others were kept so that macro code can be parsed better and code examples
831
+ _top_level_expression_statement: $ => seq(
832
+ optional($._expression_not_binary),
833
+ ';',
834
+ ),
835
+
836
+ expression_statement: $ => seq(
837
+ optional(choice(
838
+ $.expression,
839
+ $.comma_expression,
840
+ )),
841
+ ';',
842
+ ),
843
+
844
+ if_statement: $ => prec.right(seq(
845
+ 'if',
846
+ field('condition', $.parenthesized_expression),
847
+ field('consequence', $.statement),
848
+ optional(field('alternative', $.else_clause)),
849
+ )),
850
+
851
+ else_clause: $ => seq('else', $.statement),
852
+
853
+ switch_statement: $ => seq(
854
+ 'switch',
855
+ field('condition', $.parenthesized_expression),
856
+ field('body', $.compound_statement),
857
+ ),
858
+
859
+ case_statement: $ => prec.right(seq(
860
+ choice(
861
+ seq('case', field('value', $.expression)),
862
+ 'default',
863
+ ),
864
+ ':',
865
+ repeat(choice(
866
+ $._non_case_statement,
867
+ $.declaration,
868
+ $.type_definition,
869
+ )),
870
+ )),
871
+
872
+ while_statement: $ => seq(
873
+ 'while',
874
+ field('condition', $.parenthesized_expression),
875
+ field('body', $.statement),
876
+ ),
877
+
878
+ do_statement: $ => seq(
879
+ 'do',
880
+ field('body', $.statement),
881
+ 'while',
882
+ field('condition', $.parenthesized_expression),
883
+ ';',
884
+ ),
885
+
886
+ for_statement: $ => seq(
887
+ 'for',
888
+ '(',
889
+ $._for_statement_body,
890
+ ')',
891
+ field('body', $.statement),
892
+ ),
893
+ _for_statement_body: $ => seq(
894
+ choice(
895
+ field('initializer', $.declaration),
896
+ seq(field('initializer', optional(choice($.expression, $.comma_expression))), ';'),
897
+ ),
898
+ field('condition', optional(choice($.expression, $.comma_expression))),
899
+ ';',
900
+ field('update', optional(choice($.expression, $.comma_expression))),
901
+ ),
902
+
903
+ return_statement: $ => seq(
904
+ 'return',
905
+ optional(choice($.expression, $.comma_expression)),
906
+ ';',
907
+ ),
908
+
909
+ break_statement: _ => seq(
910
+ 'break', ';',
911
+ ),
912
+
913
+ continue_statement: _ => seq(
914
+ 'continue', ';',
915
+ ),
916
+
917
+ goto_statement: $ => seq(
918
+ 'goto',
919
+ field('label', $._statement_identifier),
920
+ ';',
921
+ ),
922
+
923
+ seh_try_statement: $ => seq(
924
+ '__try',
925
+ field('body', $.compound_statement),
926
+ choice($.seh_except_clause, $.seh_finally_clause),
927
+ ),
928
+
929
+ seh_except_clause: $ => seq(
930
+ '__except',
931
+ field('filter', $.parenthesized_expression),
932
+ field('body', $.compound_statement),
933
+ ),
934
+
935
+ seh_finally_clause: $ => seq(
936
+ '__finally',
937
+ field('body', $.compound_statement),
938
+ ),
939
+
940
+ seh_leave_statement: _ => seq(
941
+ '__leave', ';',
942
+ ),
943
+
944
+ // Expressions
945
+
946
+ expression: $ => choice(
947
+ $._expression_not_binary,
948
+ $.binary_expression,
949
+ ),
950
+
951
+ _expression_not_binary: $ => choice(
952
+ $.conditional_expression,
953
+ $.assignment_expression,
954
+ $.unary_expression,
955
+ $.update_expression,
956
+ $.cast_expression,
957
+ $.pointer_expression,
958
+ $.sizeof_expression,
959
+ $.alignof_expression,
960
+ $.offsetof_expression,
961
+ $.generic_expression,
962
+ $.subscript_expression,
963
+ $.call_expression,
964
+ $.field_expression,
965
+ $.compound_literal_expression,
966
+ $.identifier,
967
+ $.number_literal,
968
+ $._string,
969
+ $.true,
970
+ $.false,
971
+ $.null,
972
+ $.char_literal,
973
+ $.parenthesized_expression,
974
+ $.gnu_asm_expression,
975
+ $.extension_expression,
976
+ ),
977
+
978
+ _string: $ => prec.left(choice(
979
+ $.string_literal,
980
+ $.concatenated_string,
981
+ )),
982
+
983
+ comma_expression: $ => seq(
984
+ field('left', $.expression),
985
+ ',',
986
+ field('right', choice($.expression, $.comma_expression)),
987
+ ),
988
+
989
+ conditional_expression: $ => prec.right(PREC.CONDITIONAL, seq(
990
+ field('condition', $.expression),
991
+ '?',
992
+ optional(field('consequence', choice($.expression, $.comma_expression))),
993
+ ':',
994
+ field('alternative', $.expression),
995
+ )),
996
+
997
+ _assignment_left_expression: $ => choice(
998
+ $.identifier,
999
+ $.call_expression,
1000
+ $.field_expression,
1001
+ $.pointer_expression,
1002
+ $.subscript_expression,
1003
+ $.parenthesized_expression,
1004
+ ),
1005
+
1006
+ assignment_expression: $ => prec.right(PREC.ASSIGNMENT, seq(
1007
+ field('left', $._assignment_left_expression),
1008
+ field('operator', choice(
1009
+ '=',
1010
+ '*=',
1011
+ '/=',
1012
+ '%=',
1013
+ '+=',
1014
+ '-=',
1015
+ '<<=',
1016
+ '>>=',
1017
+ '&=',
1018
+ '^=',
1019
+ '|=',
1020
+ )),
1021
+ field('right', $.expression),
1022
+ )),
1023
+
1024
+ pointer_expression: $ => prec.left(PREC.CAST, seq(
1025
+ field('operator', choice('*', '&')),
1026
+ field('argument', $.expression),
1027
+ )),
1028
+
1029
+ unary_expression: $ => prec.left(PREC.UNARY, seq(
1030
+ field('operator', choice('!', '~', '-', '+')),
1031
+ field('argument', $.expression),
1032
+ )),
1033
+
1034
+ binary_expression: $ => {
1035
+ const table = [
1036
+ ['+', PREC.ADD],
1037
+ ['-', PREC.ADD],
1038
+ ['*', PREC.MULTIPLY],
1039
+ ['/', PREC.MULTIPLY],
1040
+ ['%', PREC.MULTIPLY],
1041
+ ['||', PREC.LOGICAL_OR],
1042
+ ['&&', PREC.LOGICAL_AND],
1043
+ ['|', PREC.INCLUSIVE_OR],
1044
+ ['^', PREC.EXCLUSIVE_OR],
1045
+ ['&', PREC.BITWISE_AND],
1046
+ ['==', PREC.EQUAL],
1047
+ ['!=', PREC.EQUAL],
1048
+ ['>', PREC.RELATIONAL],
1049
+ ['>=', PREC.RELATIONAL],
1050
+ ['<=', PREC.RELATIONAL],
1051
+ ['<', PREC.RELATIONAL],
1052
+ ['<<', PREC.SHIFT],
1053
+ ['>>', PREC.SHIFT],
1054
+ ];
1055
+
1056
+ return choice(...table.map(([operator, precedence]) => {
1057
+ return prec.left(precedence, seq(
1058
+ field('left', $.expression),
1059
+ // @ts-ignore
1060
+ field('operator', operator),
1061
+ field('right', $.expression),
1062
+ ));
1063
+ }));
1064
+ },
1065
+
1066
+ update_expression: $ => {
1067
+ const argument = field('argument', $.expression);
1068
+ const operator = field('operator', choice('--', '++'));
1069
+ return prec.right(PREC.UNARY, choice(
1070
+ seq(operator, argument),
1071
+ seq(argument, operator),
1072
+ ));
1073
+ },
1074
+
1075
+ cast_expression: $ => prec(PREC.CAST, seq(
1076
+ '(',
1077
+ field('type', $.type_descriptor),
1078
+ ')',
1079
+ field('value', $.expression),
1080
+ )),
1081
+
1082
+ type_descriptor: $ => seq(
1083
+ repeat($.type_qualifier),
1084
+ field('type', $.type_specifier),
1085
+ repeat($.type_qualifier),
1086
+ field('declarator', optional($._abstract_declarator)),
1087
+ ),
1088
+
1089
+ sizeof_expression: $ => prec(PREC.SIZEOF, seq(
1090
+ 'sizeof',
1091
+ choice(
1092
+ field('value', $.expression),
1093
+ seq('(', field('type', $.type_descriptor), ')'),
1094
+ ),
1095
+ )),
1096
+
1097
+ alignof_expression: $ => prec(PREC.SIZEOF, seq(
1098
+ choice('__alignof__', '__alignof', '_alignof', 'alignof', '_Alignof'),
1099
+ seq('(', field('type', $.type_descriptor), ')'),
1100
+ )),
1101
+
1102
+ offsetof_expression: $ => prec(PREC.OFFSETOF, seq(
1103
+ 'offsetof',
1104
+ seq('(', field('type', $.type_descriptor), ',', field('member', $._field_identifier), ')'),
1105
+ )),
1106
+
1107
+ generic_expression: $ => prec(PREC.CALL, seq(
1108
+ '_Generic',
1109
+ '(',
1110
+ $.expression,
1111
+ ',',
1112
+ commaSep1(seq($.type_descriptor, ':', $.expression)),
1113
+ ')',
1114
+ )),
1115
+
1116
+ subscript_expression: $ => prec(PREC.SUBSCRIPT, seq(
1117
+ field('argument', $.expression),
1118
+ '[',
1119
+ field('index', $.expression),
1120
+ ']',
1121
+ )),
1122
+
1123
+ call_expression: $ => prec(PREC.CALL, seq(
1124
+ field('function', $.expression),
1125
+ field('arguments', $.argument_list),
1126
+ )),
1127
+
1128
+ gnu_asm_expression: $ => prec(PREC.CALL, seq(
1129
+ choice('asm', '__asm__', '__asm'),
1130
+ repeat($.gnu_asm_qualifier),
1131
+ '(',
1132
+ field('assembly_code', $._string),
1133
+ optional(seq(
1134
+ field('output_operands', $.gnu_asm_output_operand_list),
1135
+ optional(seq(
1136
+ field('input_operands', $.gnu_asm_input_operand_list),
1137
+ optional(seq(
1138
+ field('clobbers', $.gnu_asm_clobber_list),
1139
+ optional(field('goto_labels', $.gnu_asm_goto_list)),
1140
+ )),
1141
+ )),
1142
+ )),
1143
+ ')',
1144
+ )),
1145
+
1146
+ gnu_asm_qualifier: _ => choice(
1147
+ 'volatile',
1148
+ '__volatile__',
1149
+ 'inline',
1150
+ 'goto',
1151
+ ),
1152
+
1153
+ gnu_asm_output_operand_list: $ => seq(
1154
+ ':',
1155
+ commaSep(field('operand', $.gnu_asm_output_operand)),
1156
+ ),
1157
+
1158
+ gnu_asm_output_operand: $ => seq(
1159
+ optional(seq(
1160
+ '[',
1161
+ field('symbol', $.identifier),
1162
+ ']',
1163
+ )),
1164
+ field('constraint', $.string_literal),
1165
+ '(',
1166
+ field('value', $.expression),
1167
+ ')',
1168
+ ),
1169
+
1170
+ gnu_asm_input_operand_list: $ => seq(
1171
+ ':',
1172
+ commaSep(field('operand', $.gnu_asm_input_operand)),
1173
+ ),
1174
+
1175
+ gnu_asm_input_operand: $ => seq(
1176
+ optional(seq(
1177
+ '[',
1178
+ field('symbol', $.identifier),
1179
+ ']',
1180
+ )),
1181
+ field('constraint', $.string_literal),
1182
+ '(',
1183
+ field('value', $.expression),
1184
+ ')',
1185
+ ),
1186
+
1187
+ gnu_asm_clobber_list: $ => seq(
1188
+ ':',
1189
+ commaSep(field('register', $._string)),
1190
+ ),
1191
+
1192
+ gnu_asm_goto_list: $ => seq(
1193
+ ':',
1194
+ commaSep(field('label', $.identifier)),
1195
+ ),
1196
+
1197
+ extension_expression: $ => seq('__extension__', $.expression),
1198
+
1199
+ // The compound_statement is added to parse macros taking statements as arguments, e.g. MYFORLOOP(1, 10, i, { foo(i); bar(i); })
1200
+ argument_list: $ => seq('(', commaSep(choice($.expression, $.compound_statement)), ')'),
1201
+
1202
+ field_expression: $ => seq(
1203
+ prec(PREC.FIELD, seq(
1204
+ field('argument', $.expression),
1205
+ field('operator', choice('.', '->')),
1206
+ )),
1207
+ field('field', $._field_identifier),
1208
+ ),
1209
+
1210
+ compound_literal_expression: $ => seq(
1211
+ '(',
1212
+ field('type', $.type_descriptor),
1213
+ ')',
1214
+ field('value', $.initializer_list),
1215
+ ),
1216
+
1217
+ parenthesized_expression: $ => seq(
1218
+ '(',
1219
+ choice($.expression, $.comma_expression, $.compound_statement),
1220
+ ')',
1221
+ ),
1222
+
1223
+ initializer_list: $ => seq(
1224
+ '{',
1225
+ commaSep(choice(
1226
+ $.initializer_pair,
1227
+ $.expression,
1228
+ $.initializer_list,
1229
+ )),
1230
+ optional(','),
1231
+ '}',
1232
+ ),
1233
+
1234
+ initializer_pair: $ => choice(
1235
+ seq(
1236
+ field('designator', repeat1(choice(
1237
+ $.subscript_designator,
1238
+ $.field_designator,
1239
+ $.subscript_range_designator,
1240
+ ))),
1241
+ '=',
1242
+ field('value', choice($.expression, $.initializer_list)),
1243
+ ),
1244
+ seq(
1245
+ field('designator', $._field_identifier),
1246
+ ':',
1247
+ field('value', choice($.expression, $.initializer_list)),
1248
+ ),
1249
+ ),
1250
+
1251
+ subscript_designator: $ => seq('[', $.expression, ']'),
1252
+
1253
+ subscript_range_designator: $ => seq('[', field('start', $.expression), '...', field('end', $.expression), ']'),
1254
+
1255
+ field_designator: $ => seq('.', $._field_identifier),
1256
+
1257
+ number_literal: _ => {
1258
+ const separator = '\'';
1259
+ const hex = /[0-9a-fA-F]/;
1260
+ const decimal = /[0-9]/;
1261
+ const hexDigits = seq(repeat1(hex), repeat(seq(separator, repeat1(hex))));
1262
+ const decimalDigits = seq(repeat1(decimal), repeat(seq(separator, repeat1(decimal))));
1263
+ return token(seq(
1264
+ optional(/[-\+]/),
1265
+ optional(choice(/0[xX]/, /0[bB]/)),
1266
+ choice(
1267
+ seq(
1268
+ choice(
1269
+ decimalDigits,
1270
+ seq(/0[bB]/, decimalDigits),
1271
+ seq(/0[xX]/, hexDigits),
1272
+ ),
1273
+ optional(seq('.', optional(hexDigits))),
1274
+ ),
1275
+ seq('.', decimalDigits),
1276
+ ),
1277
+ optional(seq(
1278
+ /[eEpP]/,
1279
+ optional(seq(
1280
+ optional(/[-\+]/),
1281
+ hexDigits,
1282
+ )),
1283
+ )),
1284
+ /[uUlLwWfFbBdD]*/,
1285
+ ));
1286
+ },
1287
+
1288
+ char_literal: $ => seq(
1289
+ choice('L\'', 'u\'', 'U\'', 'u8\'', '\''),
1290
+ repeat1(choice(
1291
+ $.escape_sequence,
1292
+ alias(token.immediate(/[^\n']/), $.character),
1293
+ )),
1294
+ '\'',
1295
+ ),
1296
+
1297
+ // Must concatenate at least 2 nodes, one of which must be a string_literal.
1298
+ // Identifier is added to parse macros that are strings, like PRIu64.
1299
+ concatenated_string: $ => prec.right(seq(
1300
+ choice(
1301
+ seq($.identifier, $.string_literal),
1302
+ seq($.string_literal, $.string_literal),
1303
+ seq($.string_literal, $.identifier),
1304
+ ),
1305
+ repeat(choice($.string_literal, $.identifier)),
1306
+ )),
1307
+
1308
+ string_literal: $ => seq(
1309
+ choice('L"', 'u"', 'U"', 'u8"', '"'),
1310
+ repeat(choice(
1311
+ alias(token.immediate(prec(1, /[^\\"\n]+/)), $.string_content),
1312
+ $.escape_sequence,
1313
+ )),
1314
+ '"',
1315
+ ),
1316
+
1317
+ escape_sequence: _ => token(prec(1, seq(
1318
+ '\\',
1319
+ choice(
1320
+ /[^xuU]/,
1321
+ /\d{2,3}/,
1322
+ /x[0-9a-fA-F]{1,4}/,
1323
+ /u[0-9a-fA-F]{4}/,
1324
+ /U[0-9a-fA-F]{8}/,
1325
+ ),
1326
+ ))),
1327
+
1328
+ system_lib_string: _ => token(seq(
1329
+ '<',
1330
+ repeat(choice(/[^>\n]/, '\\>')),
1331
+ '>',
1332
+ )),
1333
+
1334
+ true: _ => token(choice('TRUE', 'true')),
1335
+ false: _ => token(choice('FALSE', 'false')),
1336
+ null: _ => choice('NULL', 'nullptr'),
1337
+
1338
+ identifier: _ =>
1339
+ /(\p{XID_Start}|\$|_|\\u[0-9A-Fa-f]{4}|\\U[0-9A-Fa-f]{8})(\p{XID_Continue}|\$|\\u[0-9A-Fa-f]{4}|\\U[0-9A-Fa-f]{8})*/,
1340
+
1341
+ _type_identifier: $ => alias(
1342
+ $.identifier,
1343
+ $.type_identifier,
1344
+ ),
1345
+ _field_identifier: $ => alias($.identifier, $.field_identifier),
1346
+ _statement_identifier: $ => alias($.identifier, $.statement_identifier),
1347
+
1348
+ _empty_declaration: $ => seq(
1349
+ $.type_specifier,
1350
+ ';',
1351
+ ),
1352
+
1353
+ macro_type_specifier: $ => prec.dynamic(-1, seq(
1354
+ field('name', $.identifier),
1355
+ '(',
1356
+ field('type', $.type_descriptor),
1357
+ ')',
1358
+ )),
1359
+
1360
+ // http://stackoverflow.com/questions/13014947/regex-to-match-a-c-style-multiline-comment/36328890#36328890
1361
+ comment: _ => token(choice(
1362
+ seq('//', /(\\+(.|\r?\n)|[^\\\n])*/),
1363
+ seq(
1364
+ '/*',
1365
+ /[^*]*\*+([^/*][^*]*\*+)*/,
1366
+ '/',
1367
+ ),
1368
+ )),
1369
+ },
1370
+ });
1371
+
1372
+ module.exports.PREC = PREC;
1373
+
1374
+ /**
1375
+ *
1376
+ * @param {string} suffix
1377
+ *
1378
+ * @param {RuleBuilder<string>} content
1379
+ *
1380
+ * @param {number} precedence
1381
+ *
1382
+ * @returns {RuleBuilders<string, string>}
1383
+ */
1384
+ function preprocIf(suffix, content, precedence = 0) {
1385
+ /**
1386
+ *
1387
+ * @param {GrammarSymbols<string>} $
1388
+ *
1389
+ * @returns {ChoiceRule}
1390
+ */
1391
+ function alternativeBlock($) {
1392
+ return choice(
1393
+ suffix ? alias($['preproc_else' + suffix], $.preproc_else) : $.preproc_else,
1394
+ suffix ? alias($['preproc_elif' + suffix], $.preproc_elif) : $.preproc_elif,
1395
+ suffix ? alias($['preproc_elifdef' + suffix], $.preproc_elifdef) : $.preproc_elifdef,
1396
+ );
1397
+ }
1398
+
1399
+ return {
1400
+ ['preproc_if' + suffix]: $ => prec(precedence, seq(
1401
+ preprocessor('if'),
1402
+ field('condition', $._preproc_expression),
1403
+ '\n',
1404
+ repeat(content($)),
1405
+ field('alternative', optional(alternativeBlock($))),
1406
+ preprocessor('endif'),
1407
+ )),
1408
+
1409
+ ['preproc_ifdef' + suffix]: $ => prec(precedence, seq(
1410
+ choice(preprocessor('ifdef'), preprocessor('ifndef')),
1411
+ field('name', $.identifier),
1412
+ repeat(content($)),
1413
+ field('alternative', optional(alternativeBlock($))),
1414
+ preprocessor('endif'),
1415
+ )),
1416
+
1417
+ ['preproc_else' + suffix]: $ => prec(precedence, seq(
1418
+ preprocessor('else'),
1419
+ repeat(content($)),
1420
+ )),
1421
+
1422
+ ['preproc_elif' + suffix]: $ => prec(precedence, seq(
1423
+ preprocessor('elif'),
1424
+ field('condition', $._preproc_expression),
1425
+ '\n',
1426
+ repeat(content($)),
1427
+ field('alternative', optional(alternativeBlock($))),
1428
+ )),
1429
+
1430
+ ['preproc_elifdef' + suffix]: $ => prec(precedence, seq(
1431
+ choice(preprocessor('elifdef'), preprocessor('elifndef')),
1432
+ field('name', $.identifier),
1433
+ repeat(content($)),
1434
+ field('alternative', optional(alternativeBlock($))),
1435
+ )),
1436
+ };
1437
+ }
1438
+
1439
+ /**
1440
+ * Creates a preprocessor regex rule
1441
+ *
1442
+ * @param {RegExp | Rule | string} command
1443
+ *
1444
+ * @returns {AliasRule}
1445
+ */
1446
+ function preprocessor(command) {
1447
+ return alias(new RegExp('#[ \t]*' + command), '#' + command);
1448
+ }
1449
+
1450
+ /**
1451
+ * Creates a rule to optionally match one or more of the rules separated by a comma
1452
+ *
1453
+ * @param {Rule} rule
1454
+ *
1455
+ * @returns {ChoiceRule}
1456
+ */
1457
+ function commaSep(rule) {
1458
+ return optional(commaSep1(rule));
1459
+ }
1460
+
1461
+ /**
1462
+ * Creates a rule to match one or more of the rules separated by a comma
1463
+ *
1464
+ * @param {Rule} rule
1465
+ *
1466
+ * @returns {SeqRule}
1467
+ */
1468
+ function commaSep1(rule) {
1469
+ return seq(rule, repeat(seq(',', rule)));
1470
+ }