code-parse.inc 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686
  1. /*
  2. Version: MPL 1.1
  3. The contents of this file are subject to the Mozilla Public License Version
  4. 1.1 (the "License"); you may not use this file except in compliance with
  5. the License. You may obtain a copy of the License at
  6. http://www.mozilla.org/MPL/
  7. Software distributed under the License is distributed on an "AS IS" basis,
  8. WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  9. for the specific language governing rights and limitations under the
  10. License.
  11. The Original Code is the code-parse.inc code analyser.
  12. The Initial Developer of the Original Code is Alex "Y_Less" Cole.
  13. Portions created by the Initial Developer are Copyright (C) 2016
  14. the Initial Developer. All Rights Reserved.
  15. */
  16. #if defined _INC_code_parse_inc
  17. #endinput
  18. #endif
  19. #define _INC_code_parse_inc
  20. // This include provides a handy set of macros for advanced compile-time code
  21. // analysis and generation. With this, one can do things like analyse the
  22. // parameter types for a function, auto-generate call specifiers, and otherwise
  23. // create code-dependent macros.
  24. // Remove this tag from any final output after all other parsing is done.
  25. #define string:
  26. #define void:
  27. // A very generic entry point. This can be used by any other system to put
  28. // arbitrary macros at the top level of the file without compiler errors.
  29. #define u@$ 0]);
  30. #define PARSER@FUNC:%0$ u@(u[_:%0 u@$
  31. // This is the "global" entry point. It takes a list of parser types, followed
  32. // by a custom macro name prefix for the user code, followed by the parameters
  33. // to parse. We always have "p@:" on the end to detect remaining parameters
  34. // (this will detect any type not covered by others).
  35. #define MAKE_PARSER(%0,%1)(%3(%4)) PARSE@%1(--,,,,,,p@:A@[])(%0)%3(%4,)
  36. #define FUNC_PARSER(%0,%1) MAKE_PARSER(%0,%1:FUNC)
  37. // Modifiers for parameter types. These detect optional extra bits such as
  38. // "const" and tags.
  39. // Detect "const".
  40. #define c@:%8(%0,%1,%9const%7\32;%2) T@:O@$%7$const$(%9){PARSER_CONST,PARSER_NOT_CONST}(%8)(%0,%1,%2)
  41. #define PARSER_CONST(%7)(%8)(%0,%1,%2) %8(%0%7 ,%1,%2)
  42. #define PARSER_NOT_CONST(%7)(%8)(%0,%1,%2) %8(%0,%1,%7 %2)
  43. // Detect the lack of space after a symbol, for example with `const%1\32;`.
  44. #define PARSER_ISOLATE(%9,%0,%1){%2,%3} _:T@:O@$%1$%0$(%9){%2,%3}
  45. #define T@:O@$$%0$(){%2,%3} %2(%0)
  46. #define O@$%1$%0$(%9){%2,%3} %3(%9%0%1)
  47. // Detect tags.
  48. #define t@:%5:A@[%7]%8(%0,%1,%9:%2) %7%8(%0,%1%9:,%2)
  49. // Duplicate normal tags if this is "GRP:" instead of "TAG:" so that we can keep
  50. // backwards-compatability while supporting the new syntax for both tags and tag
  51. // groups.
  52. #define PARSER_GRP:%8(%0,%1,%2) %8(%0,(%1,%1),%2)
  53. // Don't want group tags (just an ignored tag).
  54. #define PARSER_ID:
  55. // Want group tags, but none found (adjust the parameter shape)
  56. #define PARSER_WANT:%8(%0,%1,%2) %8(%0,(,),%2)
  57. #define F@: PARSER_NO:
  58. #define G@: PARSER_GRP:
  59. #define H@: PARSER_ID:
  60. #define L@: PARSER_WANT:
  61. // Detect groups of tags. Passed as two parameters WITHIN the `tag` parameter,
  62. // so this:
  63. //
  64. // #define GRP_EG:%0(%1) FUNC_PARSER(GRP_EG,VAR_GRP:)(%0(%1))
  65. // GRP_EG:Func({a, b, c}:v);
  66. //
  67. // Will call:
  68. //
  69. // GRP_EG_VAR(,(a:,{a, b, c}:),v)
  70. //
  71. // Thus passing the first tag as the first part of the second parameter, and the
  72. // whole tag as given in code as the second parameter. The first tag is passed
  73. // as special because you can't use `{a, b, c}:` as a tag override in code so
  74. // you have to use just one of the specified tags; and `tagof (v)` will usually
  75. // return the first tag from the group, so it is the most important one.
  76. #define x@:%8(%0,(%1{%7,%9}:,%9),%2) %8(%0,(%7:,%9),%2)
  77. // Detect defaults.
  78. #define d@:%8(%0,%1,%2=%9) %8_DEF(%0,%1,%2,%9)
  79. #define b@:%8(%0,%1,%2=%9,%4) %8_DEF(%0,%1,%2,%4,%9)
  80. // Detect recursive array sizes (multi-dimensional arrays).
  81. #define f@:%8(%0,%1,%2[%9]%6,%3) f@:%8_ARR(%0,%1,%2%6,%3,%9)
  82. // Remove specialisers after we are done with this parameter type.
  83. #define A@[%9]
  84. // Redistribute the new parsers to after the current parameter.
  85. #define LENGTH_REQUIRED{%9}%0(%1)%2(%3)%4(|||%6,%7) %0(%1)j@:q@:%9.%2(%3)%4(%6|||%7)
  86. #define E@{%0} LENGTH_REQUIRED{%0}
  87. // Detect "string:" (words). Done in two parts so "const string:" doesn't fail
  88. // because the "st" in "const" is detected but is not followed by "i".
  89. #define c@st:%0(%1,%2,%3st%4) %0(%1,%2,%4)
  90. #define w@:A@[%8]%9.%0(%5)%3(%6ring:%1[%2]%9|||%7) %8c@st:%5_STR(,,%6%1%9,%2)%0(%5)%3(|||%7)
  91. // Detect "[]".
  92. #define a@:A@[%8]%9.%0(%5)%3(%1[%2]%9|||%7) %8%5_ARR(,,%1%9,%2)%0(%5)%3(|||%7)
  93. // Detect "<>".
  94. #define o@:A@[%8]%9.%0(%5)%3(%1:%4<%2>%9|||%7) %8%5_SPC(,%1:,%4%9,%2)%0(%5)%3(|||%7)
  95. #define j@:%0(%5)%3(%1[%2]%9|||%7) LENGTH_REQUIRED()
  96. #define q@:%0(%5)%3(%1...%2|||%7) LENGTH_REQUIRED()
  97. // Detect "&".
  98. #define r@:A@[%8]%9.%0(%5)%3(%1&%2|||%7) %8%5_REF(,,%1%2)%0(%5)%3(|||%7)
  99. // Detect varargs.
  100. #define v@:A@[%8]%9.%0(%5)%3(%1...%2|||%7) %8%5_EXT(,,%1%2)%0(%5)%3(|||%7)
  101. // Detect others.
  102. #define p@:A@[%8]%9.%0(%5)%3(%1|||%7) %8%5_NUM(,,%1)%0(%5)%3(|||%7)
  103. // Detect none.
  104. #define z@:%0[%9]%0(%5)%3(|||,%7) %9%5_NUL(%3)n@DROP[%5]%7
  105. // Detect out of parameters.
  106. #define n@[%9]%0(%5)%3(%6|||%7) %9%5_END(%3)n@DROP[%5]%7
  107. #define n@DROP[%5]
  108. // Not none, thus many parameters. Used to recurse through multiple parameters.
  109. #define m@:n@[%9]%0(%5)%3(%6|||%7,%8) %0.m@:n@[%9]%0(%5)%3(%7|||%8)
  110. // Detect possible return types.
  111. #define g@:%9~~%5(%9void:%3) %5_VOD(%3)
  112. #define k@:%9~~%5(%9string:%3) %5_STR(%3)
  113. #define l@:%9~~%5(%9:%3) PARSE_WILL_BE(%9)%5_TAG<:,%3>
  114. #define PARSE_WILL_BE(%9)%5<%3> %5(%9%3)
  115. #define PP_LEFT_BRACKET<> (
  116. #define PP_RIGHT_BRACKET<> )
  117. #define PP_LEFT_BRACE<> {
  118. #define PP_RIGHT_BRACE<> }
  119. #define PP_LEFT_SQUARE_BRACKET<> [
  120. #define PP_RIGHT_SQUARE_BRACKET<> ]
  121. #define PP_LEFT_ANGLE_BRACKET<> <
  122. #define PP_RIGHT_ANGLE_BRACKET<> >
  123. #define PP_NULL<>
  124. // Detect possible function modifiers
  125. #define e@[%5]
  126. // Default PAWN keywords.
  127. #define statice@[%5] %5_static()
  128. #define stocke@[%5] %5_stock()
  129. #define publice@[%5] %5_public()
  130. #define conste@[%5] %5_const()
  131. #define forwarde@[%5] %5_forward()
  132. #define newe@[%5] %5_new()
  133. #define operatore@[%5] %5_state()
  134. #define nativee@[%5] %5_native()
  135. // YSI keywords.
  136. #define globale@[%5] %5_global()
  137. #define foreigne@[%5] %5_foreign()
  138. #define timere@[%5] %5_timer()
  139. #define ptaske@[%5] %5_ptask()
  140. #define taske@[%5] %5_task()
  141. #define remoterunce@[%5] %5_remoterunc()
  142. #define hooke@[%5] %5_hook()
  143. #define inlinee@[%5] %5_inline()
  144. #define group_hooke@[%5] %5_group_hook()
  145. #define master_hooke@[%5] %5_master_hook()
  146. #define master_taske@[%5] %5_master_task()
  147. #define master_ptaske@[%5] %5_master_ptask()
  148. #define master_funce@[%5] %5_master_func()
  149. #define @foreigne@[%5] %5_@foreign()
  150. #define @globale@[%5] %5_@global()
  151. #define timerfunce@[%5] %5_timerfunc()
  152. #define loadtexte@[%5] %5_loadtext()
  153. #define s@:h@:i@:%4(%0\32;[%5](%8)) %4%8(%0)
  154. #define h@:i@:%4(%0\32;%2[%5](%8)) %0e@[%5]h@:i@:%4(%2[%5](%8))
  155. #define i@:%4(%0[%5](%8)) %8(%0)
  156. #define y@:%8(%1)%2[%5] s@:h@:i@:%8(%1[%5](%8))%2[%5]
  157. // We need the macros in a very specific order, because some will match others
  158. // as well. For example, arrays will match strings but not vice-versa, so we
  159. // need to check for strings first. Additionally, requesting scans for arrays
  160. // with tags and arrays without tags (for example) makes no sense - just use the
  161. // former. For this reason we compress all the options by joining them in a
  162. // list first then expanding that list:
  163. //
  164. // %0 - String detection options. string:a[]
  165. // %1 - Array detection options. a[]
  166. // %2 - Reference detection options. &a
  167. // %3 - Vararg detection options. ...
  168. // %4 - Other detection options. a
  169. //
  170. // Obviously "other" comes last as it will match literally anything else. The
  171. // string and array options must be relatively ordered, but their order relative
  172. // to "&" and "..." is arbitrary. Once all the type options are collected, the
  173. // "PARSE@WHATEVER" macros will stop triggering and the "PARSE@()" macro will
  174. // trigger instead to combine all the tag macros.
  175. #define PARSE@:%8(%9-%2-,%0)(%5)%6(%7) PARSE_EXPAND@(%0)PARSER@%8:z@:m@:n@[%2%9~~](%5)%6(|||%7)$
  176. #define PARSE_EXPAND@(%0,%1,%2,%5,%3,%4)%6[%7] %6[%7]%0%1%2%5%3%4
  177. // Return types.
  178. #define PARSE@RET_VOD:%8(%9-%7-,%0,%1,%2,%5,%3,%4) PARSE@%8(g@:-%7-,%0,%1,%2,%5,%3,%4) // void:
  179. #define PARSE@RET_VOD_STR:%8(%9-%7-,%0,%1,%2,%5,%3,%4) PARSE@%8(g@:k@:-%7-,%0,%1,%2,%5,%3,%4) // void: string:
  180. #define PARSE@RET_STR_VOD PARSE@RET_VOD_STR
  181. #define PARSE@RET_VOD_TAG:%8(%9-%7-,%0,%1,%2,%5,%3,%4) PARSE@%8(g@:l@:-%7-,%0,%1,%2,%5,%3,%4) // void: ???:
  182. #define PARSE@RET_TAG_VOD PARSE@RET_VOD_TAG
  183. #define PARSE@RET_VOD_STR_TAG:%8(%9-%7-,%0,%1,%2,%5,%3,%4) PARSE@%8(g@:k@:l@:-%7-,%0,%1,%2,%5,%3,%4) // void: string: ???:
  184. #define PARSE@RET_STR_VOD_TAG PARSE@RET_VOD_STR_TAG
  185. #define PARSE@RET_VOD_TAG_STR PARSE@RET_VOD_STR_TAG
  186. #define PARSE@RET_STR_TAG_VOD PARSE@RET_VOD_STR_TAG
  187. #define PARSE@RET_TAG_VOD_STR PARSE@RET_VOD_STR_TAG
  188. #define PARSE@RET_TAG_STR_VOD PARSE@RET_VOD_STR_TAG
  189. #define PARSE@RET_TAG:%8(%9-%7-,%0,%1,%2,%5,%3,%4) PARSE@%8(l@:-%7-,%0,%1,%2,%5,%3,%4) // ???:
  190. #define PARSE@RET_STR:%8(%9-%7-,%0,%1,%2,%5,%3,%4) PARSE@%8(k@:-%7-,%0,%1,%2,%5,%3,%4) // string:
  191. #define PARSE@RET_STR_TAG:%8(%9-%7-,%0,%1,%2,%5,%3,%4) PARSE@%8(k@:l@:-%7-,%0,%1,%2,%5,%3,%4) // string: ???:
  192. #define PARSE@RET_TAG_STR PARSE@RET_STR_TAG
  193. #define PARSE@QAL:%8(%9-%7-,%0,%1,%2,%5,%3,%4) PARSE@%8(%9-y@:-,%0,%1,%2,%5,%3,%4) // stock, const, etc.
  194. #define PARSE@QUALIFIERS PARSE@QAL
  195. #define PARSE@RET_VOID PARSE@RET_VOD
  196. #define PARSE@RET_VOID_STRING PARSE@RET_VOD_STR
  197. #define PARSE@RET_STRING_VOID PARSE@RET_VOD_STR
  198. #define PARSE@RET_VOID_TAG PARSE@RET_VOD_TAG
  199. #define PARSE@RET_TAG_VOID PARSE@RET_VOD_TAG
  200. #define PARSE@RET_VOID_STRING_TAG PARSE@RET_VOD_STR_TAG
  201. #define PARSE@RET_STRING_VOID_TAG PARSE@RET_VOD_STR_TAG
  202. #define PARSE@RET_VOID_TAG_STRING PARSE@RET_VOD_STR_TAG
  203. #define PARSE@RET_STRING_TAG_VOID PARSE@RET_VOD_STR_TAG
  204. #define PARSE@RET_TAG_VOID_STRING PARSE@RET_VOD_STR_TAG
  205. #define PARSE@RET_TAG_STRING_VOID PARSE@RET_VOD_STR_TAG
  206. #define PARSE@RET_STRING PARSE@RET_STR
  207. #define PARSE@RET_STRING_TAG PARSE@RET_STR_TAG
  208. #define PARSE@RET_TAG_STRING PARSE@RET_STR_TAG
  209. // Enforce array lengths.
  210. #define PARSE@LEN:%8(%9,%0,a@:A@[%1],%2,%5,%3,%4) PARSE@%8(%9,%0,a@:A@[%1E@{%2%4}],%2,%5,%3,%4)
  211. #define PARSE@LENGTH PARSE@LEN
  212. // All the parameter types that can be detected (hopefully all). "tag" macros
  213. // will also match multi-tag types such as "{tag, _}:..."
  214. #define PARSE@NUM_TAG:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,%2,%5,%3,p@:A@[t@:F@:A@[]]) // tag:a
  215. #define PARSE@TAG_NUM PARSE@NUM_TAG
  216. #define PARSE@NUM_GRP:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,%2,%5,%3,p@:A@[t@:L@:A@[G@:x@:]]) // {tag1, tag2}:a
  217. #define PARSE@GRP_NUM PARSE@NUM_GRP
  218. #define PARSE@STR:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,w@:A@[],%1,%2,%5,%3,%4) // string:a[]
  219. #define PARSE@STR_DEF:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,w@:A@[b@:],%1,%2,%5,%3,%4) // string:a[] = "hi"
  220. #define PARSE@DEF_STR PARSE@STR_DEF
  221. #define PARSE@NUM:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,%2,%5,%3,p@:A@[]) // a
  222. #define PARSE@NUM_TAG_DEF:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,%2,%5,%3,p@:A@[t@:F@:A@[]d@:]) // tag:a = 5
  223. #define PARSE@NUM_DEF_TAG PARSE@NUM_TAG_DEF
  224. #define PARSE@TAG_NUM_DEF PARSE@NUM_TAG_DEF
  225. #define PARSE@DEF_NUM_TAG PARSE@NUM_TAG_DEF
  226. #define PARSE@TAG_DEF_NUM PARSE@NUM_TAG_DEF
  227. #define PARSE@DEF_TAG_NUM PARSE@NUM_TAG_DEF
  228. #define PARSE@NUM_GRP_DEF:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,%2,%5,%3,p@:A@[t@:L@:A@[G@:x@:]d@:]) // {tag1, tag2}:a = 5
  229. #define PARSE@NUM_DEF_GRP PARSE@NUM_GRP_DEF
  230. #define PARSE@GRP_NUM_DEF PARSE@NUM_GRP_DEF
  231. #define PARSE@DEF_NUM_GRP PARSE@NUM_GRP_DEF
  232. #define PARSE@GRP_DEF_NUM PARSE@NUM_GRP_DEF
  233. #define PARSE@DEF_GRP_NUM PARSE@NUM_GRP_DEF
  234. #define PARSE@NUM_DEF:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,%2,%5,%3,p@:A@[d@:]) // a = 5
  235. #define PARSE@DEF_NUM PARSE@NUM_DEF
  236. #define PARSE@REF:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,r@:A@[],%5,%3,%4) // &a
  237. #define PARSE@REF_TAG:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,r@:A@[t@:F@:A@[]],%5,%3,%4) // &tag:a
  238. #define PARSE@TAG_REF PARSE@REF_TAG
  239. #define PARSE@REF_GRP:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,r@:A@[t@:L@:A@[G@:x@:]],%5,%3,%4) // &{tag1, tag2}:a
  240. #define PARSE@GRP_REF PARSE@REF_GRP
  241. #define PARSE@REF_DEF:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,r@:A@[d@:],%5,%3,%4) // &a = 5
  242. #define PARSE@DEF_REF PARSE@REF_DEF
  243. #define PARSE@REF_TAG_DEF:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,r@:A@[t@:F@:A@[]d@:],%5,%3,%4) // &tag:a = 5
  244. #define PARSE@REF_DEF_TAG PARSE@REF_TAG_DEF
  245. #define PARSE@TAG_REF_DEF PARSE@REF_TAG_DEF
  246. #define PARSE@TAG_DEF_REF PARSE@REF_TAG_DEF
  247. #define PARSE@DEF_REF_TAG PARSE@REF_TAG_DEF
  248. #define PARSE@DEF_TAG_REF PARSE@REF_TAG_DEF
  249. #define PARSE@REF_GRP_DEF:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,r@:A@[t@:L@:A@[G@:x@:]d@:],%5,%3,%4) // &{tag1, tag2}:a = 5
  250. #define PARSE@REF_DEF_GRP PARSE@REF_GRP_DEF
  251. #define PARSE@GRP_REF_DEF PARSE@REF_GRP_DEF
  252. #define PARSE@GRP_DEF_REF PARSE@REF_GRP_DEF
  253. #define PARSE@DEF_REF_GRP PARSE@REF_GRP_DEF
  254. #define PARSE@DEF_GRP_REF PARSE@REF_GRP_DEF
  255. #define PARSE@EXT:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,%2,%5,v@:A@[],%4) // ...
  256. #define PARSE@EXT_TAG:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,%2,%5,v@:A@[t@:F@:A@[]],%4) // tag:...
  257. #define PARSE@TAG_EXT PARSE@EXT_TAG
  258. #define PARSE@NUM_CST_TAG:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,%2,%5,%3,p@:A@[c@:t@:F@:A@[]]) // const tag:a
  259. #define PARSE@NUM_TAG_CST PARSE@NUM_CST_TAG
  260. #define PARSE@TAG_NUM_CST PARSE@NUM_CST_TAG
  261. #define PARSE@TAG_CST_NUM PARSE@NUM_CST_TAG
  262. #define PARSE@CST_NUM_TAG PARSE@NUM_CST_TAG
  263. #define PARSE@CST_TAG_NUM PARSE@NUM_CST_TAG
  264. #define PARSE@EXT_GRP:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,%2,%5,v@:A@[t@:L@:A@[G@:x@:]],%4) // {tag1, tag2}:...
  265. #define PARSE@GRP_EXT PARSE@EXT_GRP
  266. #define PARSE@NUM_CST_GRP:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,%2,%5,%3,p@:A@[c@:t@:L@:A@[G@:x@:]]) // const {tag1, tag2}:a
  267. #define PARSE@NUM_GRP_CST PARSE@NUM_CST_GRP
  268. #define PARSE@GRP_NUM_CST PARSE@NUM_CST_GRP
  269. #define PARSE@GRP_CST_NUM PARSE@NUM_CST_GRP
  270. #define PARSE@CST_NUM_GRP PARSE@NUM_CST_GRP
  271. #define PARSE@CST_GRP_NUM PARSE@NUM_CST_GRP
  272. #define PARSE@STR_CST:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,w@:A@[c@:],%1,%2,%5,%3,%4) // const string:a[]
  273. #define PARSE@CST_STR PARSE@STR_CST
  274. #define PARSE@STR_CST_DEF:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,w@:A@[c@:b@:],%1,%2,%5,%3,%4) // const string:a[] = "hi"
  275. #define PARSE@CST_DEF_STR PARSE@STR_CST_DEF
  276. #define PARSE@CST_STR_DEF PARSE@STR_CST_DEF
  277. #define PARSE@DEF_CST_STR PARSE@STR_CST_DEF
  278. #define PARSE@DEF_STR_CST PARSE@STR_CST_DEF
  279. #define PARSE@STR_DEF_CST PARSE@STR_CST_DEF
  280. #define PARSE@NUM_CST:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,%2,%5,%3,p@:A@[c@:]) // const a
  281. #define PARSE@CST_NUM PARSE@NUM_CST
  282. #define PARSE@ARR:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,a@:A@[],%2,%5,%3,%4) // a[]
  283. #define PARSE@ARR_TAG:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,a@:A@[t@:F@:A@[]],%2,%5,%3,%4) // tag:a[]
  284. #define PARSE@TAG_ARR PARSE@ARR_TAG
  285. #define PARSE@ARR_GRP:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,a@:A@[t@:L@:A@[G@:x@:]],%2,%5,%3,%4) // {tag1, tag2}:a[]
  286. #define PARSE@GRP_ARR PARSE@ARR_GRP
  287. #define PARSE@ARR_CST:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,a@:A@[c@:],%2,%5,%3,%4) // const a[]
  288. #define PARSE@CST_ARR PARSE@ARR_CST
  289. #define PARSE@ARR_CST_TAG:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,a@:A@[c@:t@:F@:A@[]],%2,%5,%3,%4) // const tag:a[]
  290. #define PARSE@CST_TAG_ARR PARSE@ARR_CST_TAG
  291. #define PARSE@CST_ARR_TAG PARSE@ARR_CST_TAG
  292. #define PARSE@ARR_TAG_CST PARSE@ARR_CST_TAG
  293. #define PARSE@TAG_CST_ARR PARSE@ARR_CST_TAG
  294. #define PARSE@TAG_ARR_CST PARSE@ARR_CST_TAG
  295. #define PARSE@NUM_CST_TAG_DEF:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,%2,%5,%3,p@:A@[c@:t@:F@:A@[]d@:]) // const tag:a = 5
  296. #define PARSE@NUM_CST_DEF_TAG PARSE@NUM_CST_TAG_DEF
  297. #define PARSE@NUM_DEF_CST_TAG PARSE@NUM_CST_TAG_DEF
  298. #define PARSE@NUM_DEF_TAG_CST PARSE@NUM_CST_TAG_DEF
  299. #define PARSE@NUM_TAG_CST_DEF PARSE@NUM_CST_TAG_DEF
  300. #define PARSE@NUM_TAG_DEF_CST PARSE@NUM_CST_TAG_DEF
  301. #define PARSE@CST_NUM_TAG_DEF PARSE@NUM_CST_TAG_DEF
  302. #define PARSE@CST_NUM_DEF_TAG PARSE@NUM_CST_TAG_DEF
  303. #define PARSE@DEF_NUM_CST_TAG PARSE@NUM_CST_TAG_DEF
  304. #define PARSE@DEF_NUM_TAG_CST PARSE@NUM_CST_TAG_DEF
  305. #define PARSE@TAG_NUM_CST_DEF PARSE@NUM_CST_TAG_DEF
  306. #define PARSE@TAG_NUM_DEF_CST PARSE@NUM_CST_TAG_DEF
  307. #define PARSE@CST_TAG_NUM_DEF PARSE@NUM_CST_TAG_DEF
  308. #define PARSE@CST_DEF_NUM_TAG PARSE@NUM_CST_TAG_DEF
  309. #define PARSE@DEF_CST_NUM_TAG PARSE@NUM_CST_TAG_DEF
  310. #define PARSE@DEF_TAG_NUM_CST PARSE@NUM_CST_TAG_DEF
  311. #define PARSE@TAG_CST_NUM_DEF PARSE@NUM_CST_TAG_DEF
  312. #define PARSE@TAG_DEF_NUM_CST PARSE@NUM_CST_TAG_DEF
  313. #define PARSE@CST_TAG_DEF_NUM PARSE@NUM_CST_TAG_DEF
  314. #define PARSE@CST_DEF_TAG_NUM PARSE@NUM_CST_TAG_DEF
  315. #define PARSE@DEF_CST_TAG_NUM PARSE@NUM_CST_TAG_DEF
  316. #define PARSE@DEF_TAG_CST_NUM PARSE@NUM_CST_TAG_DEF
  317. #define PARSE@TAG_CST_DEF_NUM PARSE@NUM_CST_TAG_DEF
  318. #define PARSE@TAG_DEF_CST_NUM PARSE@NUM_CST_TAG_DEF
  319. #define PARSE@ARR_CST_GRP:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,a@:A@[c@:t@:L@:A@[G@:x@:]],%2,%5,%3,%4) // const {tag1, tag2}:a[]
  320. #define PARSE@CST_GRP_ARR PARSE@ARR_CST_GRP
  321. #define PARSE@CST_ARR_GRP PARSE@ARR_CST_GRP
  322. #define PARSE@ARR_GRP_CST PARSE@ARR_CST_GRP
  323. #define PARSE@GRP_CST_ARR PARSE@ARR_CST_GRP
  324. #define PARSE@GRP_ARR_CST PARSE@ARR_CST_GRP
  325. #define PARSE@NUM_CST_GRP_DEF:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,%2,%5,%3,p@:A@[c@:t@:L@:A@[G@:x@:]d@:]) // const {tag1, tag2}:a = 5
  326. #define PARSE@NUM_CST_DEF_GRP PARSE@NUM_CST_GRP_DEF
  327. #define PARSE@NUM_DEF_CST_GRP PARSE@NUM_CST_GRP_DEF
  328. #define PARSE@NUM_DEF_GRP_CST PARSE@NUM_CST_GRP_DEF
  329. #define PARSE@NUM_GRP_CST_DEF PARSE@NUM_CST_GRP_DEF
  330. #define PARSE@NUM_GRP_DEF_CST PARSE@NUM_CST_GRP_DEF
  331. #define PARSE@CST_NUM_GRP_DEF PARSE@NUM_CST_GRP_DEF
  332. #define PARSE@CST_NUM_DEF_GRP PARSE@NUM_CST_GRP_DEF
  333. #define PARSE@DEF_NUM_CST_GRP PARSE@NUM_CST_GRP_DEF
  334. #define PARSE@DEF_NUM_GRP_CST PARSE@NUM_CST_GRP_DEF
  335. #define PARSE@GRP_NUM_CST_DEF PARSE@NUM_CST_GRP_DEF
  336. #define PARSE@GRP_NUM_DEF_CST PARSE@NUM_CST_GRP_DEF
  337. #define PARSE@CST_GRP_NUM_DEF PARSE@NUM_CST_GRP_DEF
  338. #define PARSE@CST_DEF_NUM_GRP PARSE@NUM_CST_GRP_DEF
  339. #define PARSE@DEF_CST_NUM_GRP PARSE@NUM_CST_GRP_DEF
  340. #define PARSE@DEF_GRP_NUM_CST PARSE@NUM_CST_GRP_DEF
  341. #define PARSE@GRP_CST_NUM_DEF PARSE@NUM_CST_GRP_DEF
  342. #define PARSE@GRP_DEF_NUM_CST PARSE@NUM_CST_GRP_DEF
  343. #define PARSE@CST_GRP_DEF_NUM PARSE@NUM_CST_GRP_DEF
  344. #define PARSE@CST_DEF_GRP_NUM PARSE@NUM_CST_GRP_DEF
  345. #define PARSE@DEF_CST_GRP_NUM PARSE@NUM_CST_GRP_DEF
  346. #define PARSE@DEF_GRP_CST_NUM PARSE@NUM_CST_GRP_DEF
  347. #define PARSE@GRP_CST_DEF_NUM PARSE@NUM_CST_GRP_DEF
  348. #define PARSE@GRP_DEF_CST_NUM PARSE@NUM_CST_GRP_DEF
  349. #define PARSE@NUM_CST_DEF:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,%2,%5,%3,p@:A@[c@:d@:]) // const a = 5
  350. #define PARSE@CST_NUM_DEF PARSE@NUM_CST_DEF
  351. #define PARSE@CST_DEF_NUM PARSE@NUM_CST_DEF
  352. #define PARSE@DEF_CST_NUM PARSE@NUM_CST_DEF
  353. #define PARSE@DEF_NUM_CST PARSE@NUM_CST_DEF
  354. #define PARSE@NUM_DEF_CST PARSE@NUM_CST_DEF
  355. #define PARSE@SPC:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,%2,o@:A@[],%3,%4) // special:a<>
  356. #define PARSE@SPC_CST:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,%1,%2,o@:A@[c@:],%3,%4) // const special:a<>
  357. #define PARSE@CST_SPC PARSE@SPC_CST
  358. // Less short names of macros.
  359. #define PARSE@ARRAY PARSE@ARR
  360. #define PARSE@NUMBER_TAG PARSE@NUM_TAG
  361. #define PARSE@TAG_NUMBER PARSE@NUM_TAG
  362. #define PARSE@NUMBER_TAGGROUP PARSE@NUM_GRP
  363. #define PARSE@TAGGROUP_NUMBER PARSE@NUM_GRP
  364. #define PARSE@STRING PARSE@STR
  365. #define PARSE@DEFAULT_STRING PARSE@STR_DEF
  366. #define PARSE@STRING_DEFAULT PARSE@STR_DEF
  367. #define PARSE@NUMBER PARSE@NUM
  368. #define PARSE@TAG_ARRAY PARSE@ARR_TAG
  369. #define PARSE@ARRAY_TAG PARSE@ARR_TAG
  370. #define PARSE@NUMBER_TAG_DEFAULT PARSE@NUM_TAG_DEF
  371. #define PARSE@NUMBER_DEFAULT_TAG PARSE@NUM_TAG_DEF
  372. #define PARSE@TAG_NUMBER_DEFAULT PARSE@NUM_TAG_DEF
  373. #define PARSE@DEFAULT_NUMBER_TAG PARSE@NUM_TAG_DEF
  374. #define PARSE@TAG_DEFAULT_NUMBER PARSE@NUM_TAG_DEF
  375. #define PARSE@DEFAULT_TAG_NUMBER PARSE@NUM_TAG_DEF
  376. #define PARSE@TAGGROUP_ARRAY PARSE@ARR_GRP
  377. #define PARSE@ARRAY_TAGGROUP PARSE@ARR_GRP
  378. #define PARSE@NUMBER_TAGGROUP_DEFAULT PARSE@NUM_GRP_DEF
  379. #define PARSE@NUMBER_DEFAULT_TAGGROUP PARSE@NUM_GRP_DEF
  380. #define PARSE@TAGGROUP_NUMBER_DEFAULT PARSE@NUM_GRP_DEF
  381. #define PARSE@DEFAULT_NUMBER_TAGGROUP PARSE@NUM_GRP_DEF
  382. #define PARSE@TAGGROUP_DEFAULT_NUMBER PARSE@NUM_GRP_DEF
  383. #define PARSE@DEFAULT_TAGGROUP_NUMBER PARSE@NUM_GRP_DEF
  384. #define PARSE@NUMBER_DEFAULT PARSE@NUM_DEF
  385. #define PARSE@DEFAULT_NUMBER PARSE@NUM_DEF
  386. #define PARSE@REFERENCE PARSE@REF
  387. #define PARSE@TAG_REFERENCE PARSE@REF_TAG
  388. #define PARSE@REFERENCE_TAG PARSE@REF_TAG
  389. #define PARSE@TAGGROUP_REFERENCE PARSE@REF_GRP
  390. #define PARSE@REFERENCE_TAGGROUP PARSE@REF_GRP
  391. #define PARSE@DEFAULT_REFERENCE PARSE@REF_DEF
  392. #define PARSE@REFERENCE_DEFAULT PARSE@REF_DEF
  393. #define PARSE@TAG_REFERENCE_DEFAULT PARSE@REF_TAG_DEF
  394. #define PARSE@TAG_DEFAULT_REFERENCE PARSE@REF_TAG_DEF
  395. #define PARSE@REFERENCE_TAG_DEFAULT PARSE@REF_TAG_DEF
  396. #define PARSE@REFERENCE_DEFAULT_TAG PARSE@REF_TAG_DEF
  397. #define PARSE@DEFAULT_REFERENCE_TAG PARSE@REF_TAG_DEF
  398. #define PARSE@DEFAULT_TAG_REFERENCE PARSE@REF_TAG_DEF
  399. #define PARSE@TAGGROUP_REFERENCE_DEFAULT PARSE@REF_GRP_DEF
  400. #define PARSE@TAGGROUP_DEFAULT_REFERENCE PARSE@REF_GRP_DEF
  401. #define PARSE@REFERENCE_TAGGROUP_DEFAULT PARSE@REF_GRP_DEF
  402. #define PARSE@REFERENCE_DEFAULT_TAGGROUP PARSE@REF_GRP_DEF
  403. #define PARSE@DEFAULT_REFERENCE_TAGGROUP PARSE@REF_GRP_DEF
  404. #define PARSE@DEFAULT_TAGGROUP_REFERENCE PARSE@REF_GRP_DEF
  405. #define PARSE@VARARG PARSE@EXT
  406. #define PARSE@VARARG_TAG PARSE@EXT_TAG
  407. #define PARSE@TAG_VARARG PARSE@EXT_TAG
  408. #define PARSE@VARARG_TAGGROUP PARSE@EXT_GRP
  409. #define PARSE@TAGGROUP_VARARG PARSE@EXT_GRP
  410. #define PARSE@CONST_ARRAY PARSE@ARR_CST
  411. #define PARSE@ARRAY_CONST PARSE@ARR_CST
  412. #define PARSE@NUMBER_CONST_TAG PARSE@NUM_CST_TAG
  413. #define PARSE@NUMBER_TAG_CONST PARSE@NUM_CST_TAG
  414. #define PARSE@CONST_NUMBER_TAG PARSE@NUM_CST_TAG
  415. #define PARSE@TAG_NUMBER_CONST PARSE@NUM_CST_TAG
  416. #define PARSE@CONST_TAG_NUMBER PARSE@NUM_CST_TAG
  417. #define PARSE@TAG_CONST_NUMBER PARSE@NUM_CST_TAG
  418. #define PARSE@NUMBER_CONST_TAGGROUP PARSE@NUM_CST_GRP
  419. #define PARSE@NUMBER_TAGGROUP_CONST PARSE@NUM_CST_GRP
  420. #define PARSE@CONST_NUMBER_TAGGROUP PARSE@NUM_CST_GRP
  421. #define PARSE@TAGGROUP_NUMBER_CONST PARSE@NUM_CST_GRP
  422. #define PARSE@CONST_TAGGROUP_NUMBER PARSE@NUM_CST_GRP
  423. #define PARSE@TAGGROUP_CONST_NUMBER PARSE@NUM_CST_GRP
  424. #define PARSE@CONST_STRING PARSE@STR_CST
  425. #define PARSE@STRING_CONST PARSE@STR_CST
  426. #define PARSE@CONST_DEFAULT_STRING PARSE@STR_CST_DEF
  427. #define PARSE@CONST_STRING_DEFAULT PARSE@STR_CST_DEF
  428. #define PARSE@DEFAULT_CONST_STRING PARSE@STR_CST_DEF
  429. #define PARSE@DEFAULT_STRING_CONST PARSE@STR_CST_DEF
  430. #define PARSE@STRING_CONST_DEFAULT PARSE@STR_CST_DEF
  431. #define PARSE@STRING_DEFAULT_CONST PARSE@STR_CST_DEF
  432. #define PARSE@CONST_NUMBER PARSE@NUM_CST
  433. #define PARSE@NUMBER_CONST PARSE@NUM_CST
  434. #define PARSE@CONST_TAG_ARRAY PARSE@ARR_CST_TAG
  435. #define PARSE@CONST_ARRAY_TAG PARSE@ARR_CST_TAG
  436. #define PARSE@ARRAY_CONST_TAG PARSE@ARR_CST_TAG
  437. #define PARSE@ARRAY_TAG_CONST PARSE@ARR_CST_TAG
  438. #define PARSE@TAG_CONST_ARRAY PARSE@ARR_CST_TAG
  439. #define PARSE@TAG_ARRAY_CONST PARSE@ARR_CST_TAG
  440. #define PARSE@NUMBER_CONST_TAG_DEFAULT PARSE@NUM_CST_TAG_DEF
  441. #define PARSE@NUMBER_CONST_DEFAULT_TAG PARSE@NUM_CST_TAG_DEF
  442. #define PARSE@NUMBER_DEFAULT_CONST_TAG PARSE@NUM_CST_TAG_DEF
  443. #define PARSE@NUMBER_DEFAULT_TAG_CONST PARSE@NUM_CST_TAG_DEF
  444. #define PARSE@NUMBER_TAG_CONST_DEFAULT PARSE@NUM_CST_TAG_DEF
  445. #define PARSE@NUMBER_TAG_DEFAULT_CONST PARSE@NUM_CST_TAG_DEF
  446. #define PARSE@CONST_NUMBER_TAG_DEFAULT PARSE@NUM_CST_TAG_DEF
  447. #define PARSE@CONST_NUMBER_DEFAULT_TAG PARSE@NUM_CST_TAG_DEF
  448. #define PARSE@DEFAULT_NUMBER_CONST_TAG PARSE@NUM_CST_TAG_DEF
  449. #define PARSE@DEFAULT_NUMBER_TAG_CONST PARSE@NUM_CST_TAG_DEF
  450. #define PARSE@TAG_NUMBER_CONST_DEFAULT PARSE@NUM_CST_TAG_DEF
  451. #define PARSE@TAG_NUMBER_DEFAULT_CONST PARSE@NUM_CST_TAG_DEF
  452. #define PARSE@CONST_TAG_NUMBER_DEFAULT PARSE@NUM_CST_TAG_DEF
  453. #define PARSE@CONST_DEFAULT_NUMBER_TAG PARSE@NUM_CST_TAG_DEF
  454. #define PARSE@DEFAULT_CONST_NUMBER_TAG PARSE@NUM_CST_TAG_DEF
  455. #define PARSE@DEFAULT_TAG_NUMBER_CONST PARSE@NUM_CST_TAG_DEF
  456. #define PARSE@TAG_CONST_NUMBER_DEFAULT PARSE@NUM_CST_TAG_DEF
  457. #define PARSE@TAG_DEFAULT_NUMBER_CONST PARSE@NUM_CST_TAG_DEF
  458. #define PARSE@CONST_TAG_DEFAULT_NUMBER PARSE@NUM_CST_TAG_DEF
  459. #define PARSE@CONST_DEFAULT_TAG_NUMBER PARSE@NUM_CST_TAG_DEF
  460. #define PARSE@DEFAULT_CONST_TAG_NUMBER PARSE@NUM_CST_TAG_DEF
  461. #define PARSE@DEFAULT_TAG_CONST_NUMBER PARSE@NUM_CST_TAG_DEF
  462. #define PARSE@TAG_CONST_DEFAULT_NUMBER PARSE@NUM_CST_TAG_DEF
  463. #define PARSE@TAG_DEFAULT_CONST_NUMBER PARSE@NUM_CST_TAG_DEF
  464. #define PARSE@CONST_TAGGROUP_ARRAY PARSE@ARR_CST_GRP
  465. #define PARSE@CONST_ARRAY_TAGGROUP PARSE@ARR_CST_GRP
  466. #define PARSE@ARRAY_CONST_TAGGROUP PARSE@ARR_CST_GRP
  467. #define PARSE@ARRAY_TAGGROUP_CONST PARSE@ARR_CST_GRP
  468. #define PARSE@TAGGROUP_CONST_ARRAY PARSE@ARR_CST_GRP
  469. #define PARSE@TAGGROUP_ARRAY_CONST PARSE@ARR_CST_GRP
  470. #define PARSE@NUMBER_CONST_TAGGROUP_DEFAULT PARSE@NUM_CST_GRP_DEF
  471. #define PARSE@NUMBER_CONST_DEFAULT_TAGGROUP PARSE@NUM_CST_GRP_DEF
  472. #define PARSE@NUMBER_DEFAULT_CONST_TAGGROUP PARSE@NUM_CST_GRP_DEF
  473. #define PARSE@NUMBER_DEFAULT_TAGGROUP_CONST PARSE@NUM_CST_GRP_DEF
  474. #define PARSE@NUMBER_TAGGROUP_CONST_DEFAULT PARSE@NUM_CST_GRP_DEF
  475. #define PARSE@NUMBER_TAGGROUP_DEFAULT_CONST PARSE@NUM_CST_GRP_DEF
  476. #define PARSE@CONST_NUMBER_TAGGROUP_DEFAULT PARSE@NUM_CST_GRP_DEF
  477. #define PARSE@CONST_NUMBER_DEFAULT_TAGGROUP PARSE@NUM_CST_GRP_DEF
  478. #define PARSE@DEFAULT_NUMBER_CONST_TAGGROUP PARSE@NUM_CST_GRP_DEF
  479. #define PARSE@DEFAULT_NUMBER_TAGGROUP_CONST PARSE@NUM_CST_GRP_DEF
  480. #define PARSE@TAGGROUP_NUMBER_CONST_DEFAULT PARSE@NUM_CST_GRP_DEF
  481. #define PARSE@TAGGROUP_NUMBER_DEFAULT_CONST PARSE@NUM_CST_GRP_DEF
  482. #define PARSE@CONST_TAGGROUP_NUMBER_DEFAULT PARSE@NUM_CST_GRP_DEF
  483. #define PARSE@CONST_DEFAULT_NUMBER_TAGGROUP PARSE@NUM_CST_GRP_DEF
  484. #define PARSE@DEFAULT_CONST_NUMBER_TAGGROUP PARSE@NUM_CST_GRP_DEF
  485. #define PARSE@DEFAULT_TAGGROUP_NUMBER_CONST PARSE@NUM_CST_GRP_DEF
  486. #define PARSE@TAGGROUP_CONST_NUMBER_DEFAULT PARSE@NUM_CST_GRP_DEF
  487. #define PARSE@TAGGROUP_DEFAULT_NUMBER_CONST PARSE@NUM_CST_GRP_DEF
  488. #define PARSE@CONST_TAGGROUP_DEFAULT_NUMBER PARSE@NUM_CST_GRP_DEF
  489. #define PARSE@CONST_DEFAULT_TAGGROUP_NUMBER PARSE@NUM_CST_GRP_DEF
  490. #define PARSE@DEFAULT_CONST_TAGGROUP_NUMBER PARSE@NUM_CST_GRP_DEF
  491. #define PARSE@DEFAULT_TAGGROUP_CONST_NUMBER PARSE@NUM_CST_GRP_DEF
  492. #define PARSE@TAGGROUP_CONST_DEFAULT_NUMBER PARSE@NUM_CST_GRP_DEF
  493. #define PARSE@TAGGROUP_DEFAULT_CONST_NUMBER PARSE@NUM_CST_GRP_DEF
  494. #define PARSE@CONST_NUMBER_DEFAULT PARSE@NUM_CST_DEF
  495. #define PARSE@CONST_DEFAULT_NUMBER PARSE@NUM_CST_DEF
  496. #define PARSE@DEFAULT_CONST_NUMBER PARSE@NUM_CST_DEF
  497. #define PARSE@DEFAULT_NUMBER_CONST PARSE@NUM_CST_DEF
  498. #define PARSE@NUMBER_CONST_DEFAULT PARSE@NUM_CST_DEF
  499. #define PARSE@NUMBER_DEFAULT_CONST PARSE@NUM_CST_DEF
  500. #define PARSE@SPECIAL PARSE@SPC
  501. #define PARSE@SPECIAL_CONST PARSE@SPC_CST
  502. #define PARSE@CONST_SPECIAL PARSE@SPC_CST
  503. // Multi-dimensional arrays.
  504. #define PARSE@ARR_MUL:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,a@:A@[f@:],%2,%5,%3,%4) // a[][]
  505. #define PARSE@MUL_ARR PARSE@ARR_MUL
  506. #define PARSE@ARR_TAG_MUL:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,a@:A@[f@:t@:F@:A@[]],%2,%5,%3,%4) // tag:a[][]
  507. #define PARSE@TAG_MUL_ARR PARSE@ARR_TAG_MUL
  508. #define PARSE@TAG_ARR_MUL PARSE@ARR_TAG_MUL
  509. #define PARSE@ARR_MUL_TAG PARSE@ARR_TAG_MUL
  510. #define PARSE@MUL_ARR_TAG PARSE@ARR_TAG_MUL
  511. #define PARSE@MUL_TAG_ARR PARSE@ARR_TAG_MUL
  512. #define PARSE@ARR_GRP_MUL:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,a@:A@[f@:t@:L@:A@[G@:x@:]],%2,%5,%3,%4) // {tag1, tag2}:a[][]
  513. #define PARSE@GRP_MUL_ARR PARSE@ARR_GRP_MUL
  514. #define PARSE@GRP_ARR_MUL PARSE@ARR_GRP_MUL
  515. #define PARSE@ARR_MUL_GRP PARSE@ARR_GRP_MUL
  516. #define PARSE@MUL_ARR_GRP PARSE@ARR_GRP_MUL
  517. #define PARSE@MUL_GRP_ARR PARSE@ARR_GRP_MUL
  518. #define PARSE@ARR_CST_MUL:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,a@:A@[f@:c@:],%2,%5,%3,%4) // const a[][]
  519. #define PARSE@CST_MUL_ARR PARSE@ARR_CST_MUL
  520. #define PARSE@CST_ARR_MUL PARSE@ARR_CST_MUL
  521. #define PARSE@ARR_MUL_CST PARSE@ARR_CST_MUL
  522. #define PARSE@MUL_CST_ARR PARSE@ARR_CST_MUL
  523. #define PARSE@MUL_ARR_CST PARSE@ARR_CST_MUL
  524. #define PARSE@ARR_CST_TAG_MUL:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,a@:A@[f@:c@:t@:F@:A@[]],%2,%5,%3,%4) // const tag:a[][]
  525. #define PARSE@CST_TAG_ARR_MUL PARSE@ARR_CST_TAG_MUL
  526. #define PARSE@CST_TAG_MUL_ARR PARSE@ARR_CST_TAG_MUL
  527. #define PARSE@CST_ARR_TAG_MUL PARSE@ARR_CST_TAG_MUL
  528. #define PARSE@CST_ARR_MUL_TAG PARSE@ARR_CST_TAG_MUL
  529. #define PARSE@CST_MUL_ARR_TAG PARSE@ARR_CST_TAG_MUL
  530. #define PARSE@CST_MUL_TAG_ARR PARSE@ARR_CST_TAG_MUL
  531. #define PARSE@TAG_CST_ARR_MUL PARSE@ARR_CST_TAG_MUL
  532. #define PARSE@TAG_CST_MUL_ARR PARSE@ARR_CST_TAG_MUL
  533. #define PARSE@ARR_CST_MUL_TAG PARSE@ARR_CST_TAG_MUL
  534. #define PARSE@MUL_CST_ARR_TAG PARSE@ARR_CST_TAG_MUL
  535. #define PARSE@MUL_CST_TAG_ARR PARSE@ARR_CST_TAG_MUL
  536. #define PARSE@TAG_ARR_CST_MUL PARSE@ARR_CST_TAG_MUL
  537. #define PARSE@TAG_MUL_CST_ARR PARSE@ARR_CST_TAG_MUL
  538. #define PARSE@ARR_TAG_CST_MUL PARSE@ARR_CST_TAG_MUL
  539. #define PARSE@ARR_MUL_CST_TAG PARSE@ARR_CST_TAG_MUL
  540. #define PARSE@MUL_ARR_CST_TAG PARSE@ARR_CST_TAG_MUL
  541. #define PARSE@MUL_TAG_CST_ARR PARSE@ARR_CST_TAG_MUL
  542. #define PARSE@TAG_ARR_MUL_CST PARSE@ARR_CST_TAG_MUL
  543. #define PARSE@TAG_MUL_ARR_CST PARSE@ARR_CST_TAG_MUL
  544. #define PARSE@ARR_TAG_MUL_CST PARSE@ARR_CST_TAG_MUL
  545. #define PARSE@ARR_MUL_TAG_CST PARSE@ARR_CST_TAG_MUL
  546. #define PARSE@MUL_ARR_TAG_CST PARSE@ARR_CST_TAG_MUL
  547. #define PARSE@MUL_TAG_ARR_CST PARSE@ARR_CST_TAG_MUL
  548. #define PARSE@ARR_CST_GRP_MUL:%8(%9,%0,%1,%2,%5,%3,%4) PARSE@%8(%9,%0,a@:A@[f@:c@:t@:L@:A@[G@:x@:]],%2,%5,%3,%4) // const {tag1, tag2}:a[][]
  549. #define PARSE@CST_GRP_ARR_MUL PARSE@ARR_CST_GRP_MUL
  550. #define PARSE@CST_GRP_MUL_ARR PARSE@ARR_CST_GRP_MUL
  551. #define PARSE@CST_ARR_GRP_MUL PARSE@ARR_CST_GRP_MUL
  552. #define PARSE@CST_ARR_MUL_GRP PARSE@ARR_CST_GRP_MUL
  553. #define PARSE@CST_MUL_ARR_GRP PARSE@ARR_CST_GRP_MUL
  554. #define PARSE@CST_MUL_GRP_ARR PARSE@ARR_CST_GRP_MUL
  555. #define PARSE@GRP_CST_ARR_MUL PARSE@ARR_CST_GRP_MUL
  556. #define PARSE@GRP_CST_MUL_ARR PARSE@ARR_CST_GRP_MUL
  557. #define PARSE@ARR_CST_MUL_GRP PARSE@ARR_CST_GRP_MUL
  558. #define PARSE@MUL_CST_ARR_GRP PARSE@ARR_CST_GRP_MUL
  559. #define PARSE@MUL_CST_GRP_ARR PARSE@ARR_CST_GRP_MUL
  560. #define PARSE@GRP_ARR_CST_MUL PARSE@ARR_CST_GRP_MUL
  561. #define PARSE@GRP_MUL_CST_ARR PARSE@ARR_CST_GRP_MUL
  562. #define PARSE@ARR_GRP_CST_MUL PARSE@ARR_CST_GRP_MUL
  563. #define PARSE@ARR_MUL_CST_GRP PARSE@ARR_CST_GRP_MUL
  564. #define PARSE@MUL_ARR_CST_GRP PARSE@ARR_CST_GRP_MUL
  565. #define PARSE@MUL_GRP_CST_ARR PARSE@ARR_CST_GRP_MUL
  566. #define PARSE@GRP_ARR_MUL_CST PARSE@ARR_CST_GRP_MUL
  567. #define PARSE@GRP_MUL_ARR_CST PARSE@ARR_CST_GRP_MUL
  568. #define PARSE@ARR_GRP_MUL_CST PARSE@ARR_CST_GRP_MUL
  569. #define PARSE@ARR_MUL_GRP_CST PARSE@ARR_CST_GRP_MUL
  570. #define PARSE@MUL_ARR_GRP_CST PARSE@ARR_CST_GRP_MUL
  571. #define PARSE@MUL_GRP_ARR_CST PARSE@ARR_CST_GRP_MUL
  572. #define PARSE@ARRAY_MULTI PARSE@ARR_MUL
  573. #define PARSE@MULTI_ARRAY PARSE@ARR_MUL
  574. #define PARSE@TAG_ARRAY_MULTI PARSE@ARR_TAG_MUL
  575. #define PARSE@TAG_MULTI_ARRAY PARSE@ARR_TAG_MUL
  576. #define PARSE@ARRAY_TAG_MULTI PARSE@ARR_TAG_MUL
  577. #define PARSE@ARRAY_MULTI_TAG PARSE@ARR_TAG_MUL
  578. #define PARSE@MULTI_ARRAY_TAG PARSE@ARR_TAG_MUL
  579. #define PARSE@MULTI_TAG_ARRAY PARSE@ARR_TAG_MUL
  580. #define PARSE@TAGGROUP_ARRAY_MULTI PARSE@ARR_GRP_MUL
  581. #define PARSE@TAGGROUP_MULTI_ARRAY PARSE@ARR_GRP_MUL
  582. #define PARSE@ARRAY_TAGGROUP_MULTI PARSE@ARR_GRP_MUL
  583. #define PARSE@ARRAY_MULTI_TAGGROUP PARSE@ARR_GRP_MUL
  584. #define PARSE@MULTI_ARRAY_TAGGROUP PARSE@ARR_GRP_MUL
  585. #define PARSE@MULTI_TAGGROUP_ARRAY PARSE@ARR_GRP_MUL
  586. #define PARSE@CONST_MULTI_ARRAY PARSE@ARR_CST_MUL
  587. #define PARSE@CONST_ARRAY_MULTI PARSE@ARR_CST_MUL
  588. #define PARSE@ARRAY_CONST_MULTI PARSE@ARR_CST_MUL
  589. #define PARSE@ARRAY_MULTI_CONST PARSE@ARR_CST_MUL
  590. #define PARSE@MULTI_CONST_ARRAY PARSE@ARR_CST_MUL
  591. #define PARSE@MULTI_ARRAY_CONST PARSE@ARR_CST_MUL
  592. #define PARSE@CONST_TAG_ARRAY_MULTI PARSE@ARR_CST_TAG_MUL
  593. #define PARSE@CONST_TAG_MULTI_ARRAY PARSE@ARR_CST_TAG_MUL
  594. #define PARSE@CONST_ARRAY_TAG_MULTI PARSE@ARR_CST_TAG_MUL
  595. #define PARSE@CONST_ARRAY_MULTI_TAG PARSE@ARR_CST_TAG_MUL
  596. #define PARSE@CONST_MULTI_ARRAY_TAG PARSE@ARR_CST_TAG_MUL
  597. #define PARSE@CONST_MULTI_TAG_ARRAY PARSE@ARR_CST_TAG_MUL
  598. #define PARSE@TAG_CONST_ARRAY_MULTI PARSE@ARR_CST_TAG_MUL
  599. #define PARSE@TAG_CONST_MULTI_ARRAY PARSE@ARR_CST_TAG_MUL
  600. #define PARSE@ARRAY_CONST_TAG_MULTI PARSE@ARR_CST_TAG_MUL
  601. #define PARSE@ARRAY_CONST_MULTI_TAG PARSE@ARR_CST_TAG_MUL
  602. #define PARSE@MULTI_CONST_ARRAY_TAG PARSE@ARR_CST_TAG_MUL
  603. #define PARSE@MULTI_CONST_TAG_ARRAY PARSE@ARR_CST_TAG_MUL
  604. #define PARSE@TAG_ARRAY_CONST_MULTI PARSE@ARR_CST_TAG_MUL
  605. #define PARSE@TAG_MULTI_CONST_ARRAY PARSE@ARR_CST_TAG_MUL
  606. #define PARSE@ARRAY_TAG_CONST_MULTI PARSE@ARR_CST_TAG_MUL
  607. #define PARSE@ARRAY_MULTI_CONST_TAG PARSE@ARR_CST_TAG_MUL
  608. #define PARSE@MULTI_ARRAY_CONST_TAG PARSE@ARR_CST_TAG_MUL
  609. #define PARSE@MULTI_TAG_CONST_ARRAY PARSE@ARR_CST_TAG_MUL
  610. #define PARSE@TAG_ARRAY_MULTI_CONST PARSE@ARR_CST_TAG_MUL
  611. #define PARSE@TAG_MULTI_ARRAY_CONST PARSE@ARR_CST_TAG_MUL
  612. #define PARSE@ARRAY_TAG_MULTI_CONST PARSE@ARR_CST_TAG_MUL
  613. #define PARSE@ARRAY_MULTI_TAG_CONST PARSE@ARR_CST_TAG_MUL
  614. #define PARSE@MULTI_ARRAY_TAG_CONST PARSE@ARR_CST_TAG_MUL
  615. #define PARSE@MULTI_TAG_ARRAY_CONST PARSE@ARR_CST_TAG_MUL
  616. #define PARSE@CONST_TAGGROUP_ARRAY_MULTI PARSE@ARR_CST_GRP_MUL
  617. #define PARSE@CONST_TAGGROUP_MULTI_ARRAY PARSE@ARR_CST_GRP_MUL
  618. #define PARSE@CONST_ARRAY_TAGGROUP_MULTI PARSE@ARR_CST_GRP_MUL
  619. #define PARSE@CONST_ARRAY_MULTI_TAGGROUP PARSE@ARR_CST_GRP_MUL
  620. #define PARSE@CONST_MULTI_ARRAY_TAGGROUP PARSE@ARR_CST_GRP_MUL
  621. #define PARSE@CONST_MULTI_TAGGROUP_ARRAY PARSE@ARR_CST_GRP_MUL
  622. #define PARSE@TAGGROUP_CONST_ARRAY_MULTI PARSE@ARR_CST_GRP_MUL
  623. #define PARSE@TAGGROUP_CONST_MULTI_ARRAY PARSE@ARR_CST_GRP_MUL
  624. #define PARSE@ARRAY_CONST_TAGGROUP_MULTI PARSE@ARR_CST_GRP_MUL
  625. #define PARSE@ARRAY_CONST_MULTI_TAGGROUP PARSE@ARR_CST_GRP_MUL
  626. #define PARSE@MULTI_CONST_ARRAY_TAGGROUP PARSE@ARR_CST_GRP_MUL
  627. #define PARSE@MULTI_CONST_TAGGROUP_ARRAY PARSE@ARR_CST_GRP_MUL
  628. #define PARSE@TAGGROUP_ARRAY_CONST_MULTI PARSE@ARR_CST_GRP_MUL
  629. #define PARSE@TAGGROUP_MULTI_CONST_ARRAY PARSE@ARR_CST_GRP_MUL
  630. #define PARSE@ARRAY_TAGGROUP_CONST_MULTI PARSE@ARR_CST_GRP_MUL
  631. #define PARSE@ARRAY_MULTI_CONST_TAGGROUP PARSE@ARR_CST_GRP_MUL
  632. #define PARSE@MULTI_ARRAY_CONST_TAGGROUP PARSE@ARR_CST_GRP_MUL
  633. #define PARSE@MULTI_TAGGROUP_CONST_ARRAY PARSE@ARR_CST_GRP_MUL
  634. #define PARSE@TAGGROUP_ARRAY_MULTI_CONST PARSE@ARR_CST_GRP_MUL
  635. #define PARSE@TAGGROUP_MULTI_ARRAY_CONST PARSE@ARR_CST_GRP_MUL
  636. #define PARSE@ARRAY_TAGGROUP_MULTI_CONST PARSE@ARR_CST_GRP_MUL
  637. #define PARSE@ARRAY_MULTI_TAGGROUP_CONST PARSE@ARR_CST_GRP_MUL
  638. #define PARSE@MULTI_ARRAY_TAGGROUP_CONST PARSE@ARR_CST_GRP_MUL
  639. #define PARSE@MULTI_TAGGROUP_ARRAY_CONST PARSE@ARR_CST_GRP_MUL