Grammar

  1. Root <- skip container_doc_comment? ContainerMembers eof
  2. # *** Top level ***
  3. ContainerMembers <- ContainerDeclarations (ContainerField COMMA)* (ContainerField / ContainerDeclarations)
  4. ContainerDeclarations
  5. <- TestDecl ContainerDeclarations
  6. / TopLevelComptime ContainerDeclarations
  7. / doc_comment? KEYWORD_pub? TopLevelDecl ContainerDeclarations
  8. /
  9. TestDecl <- doc_comment? KEYWORD_test STRINGLITERALSINGLE? Block
  10. TopLevelComptime <- doc_comment? KEYWORD_comptime BlockExpr
  11. TopLevelDecl
  12. <- (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE? / (KEYWORD_inline / KEYWORD_noinline))? FnProto (SEMICOLON / Block)
  13. / (KEYWORD_export / KEYWORD_extern STRINGLITERALSINGLE?)? KEYWORD_threadlocal? VarDecl
  14. / KEYWORD_usingnamespace Expr SEMICOLON
  15. FnProto <- KEYWORD_fn IDENTIFIER? LPAREN ParamDeclList RPAREN ByteAlign? LinkSection? CallConv? EXCLAMATIONMARK? TypeExpr
  16. VarDecl <- (KEYWORD_const / KEYWORD_var) IDENTIFIER (COLON TypeExpr)? ByteAlign? LinkSection? (EQUAL Expr)? SEMICOLON
  17. ContainerField <- doc_comment? KEYWORD_comptime? IDENTIFIER (COLON (KEYWORD_anytype / TypeExpr) ByteAlign?)? (EQUAL Expr)?
  18. # *** Block Level ***
  19. Statement
  20. <- KEYWORD_comptime? VarDecl
  21. / KEYWORD_comptime BlockExprStatement
  22. / KEYWORD_nosuspend BlockExprStatement
  23. / KEYWORD_suspend BlockExprStatement
  24. / KEYWORD_defer BlockExprStatement
  25. / KEYWORD_errdefer Payload? BlockExprStatement
  26. / IfStatement
  27. / LabeledStatement
  28. / SwitchExpr
  29. / AssignExpr SEMICOLON
  30. IfStatement
  31. <- IfPrefix BlockExpr ( KEYWORD_else Payload? Statement )?
  32. / IfPrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement )
  33. LabeledStatement <- BlockLabel? (Block / LoopStatement)
  34. LoopStatement <- KEYWORD_inline? (ForStatement / WhileStatement)
  35. ForStatement
  36. <- ForPrefix BlockExpr ( KEYWORD_else Statement )?
  37. / ForPrefix AssignExpr ( SEMICOLON / KEYWORD_else Statement )
  38. WhileStatement
  39. <- WhilePrefix BlockExpr ( KEYWORD_else Payload? Statement )?
  40. / WhilePrefix AssignExpr ( SEMICOLON / KEYWORD_else Payload? Statement )
  41. BlockExprStatement
  42. <- BlockExpr
  43. / AssignExpr SEMICOLON
  44. BlockExpr <- BlockLabel? Block
  45. # *** Expression Level ***
  46. AssignExpr <- Expr (AssignOp Expr)?
  47. Expr <- BoolOrExpr
  48. BoolOrExpr <- BoolAndExpr (KEYWORD_or BoolAndExpr)*
  49. BoolAndExpr <- CompareExpr (KEYWORD_and CompareExpr)*
  50. CompareExpr <- BitwiseExpr (CompareOp BitwiseExpr)?
  51. BitwiseExpr <- BitShiftExpr (BitwiseOp BitShiftExpr)*
  52. BitShiftExpr <- AdditionExpr (BitShiftOp AdditionExpr)*
  53. AdditionExpr <- MultiplyExpr (AdditionOp MultiplyExpr)*
  54. MultiplyExpr <- PrefixExpr (MultiplyOp PrefixExpr)*
  55. PrefixExpr <- PrefixOp* PrimaryExpr
  56. PrimaryExpr
  57. <- AsmExpr
  58. / IfExpr
  59. / KEYWORD_break BreakLabel? Expr?
  60. / KEYWORD_comptime Expr
  61. / KEYWORD_nosuspend Expr
  62. / KEYWORD_continue BreakLabel?
  63. / KEYWORD_resume Expr
  64. / KEYWORD_return Expr?
  65. / BlockLabel? LoopExpr
  66. / Block
  67. / CurlySuffixExpr
  68. IfExpr <- IfPrefix Expr (KEYWORD_else Payload? Expr)?
  69. Block <- LBRACE Statement* RBRACE
  70. LoopExpr <- KEYWORD_inline? (ForExpr / WhileExpr)
  71. ForExpr <- ForPrefix Expr (KEYWORD_else Expr)?
  72. WhileExpr <- WhilePrefix Expr (KEYWORD_else Payload? Expr)?
  73. CurlySuffixExpr <- TypeExpr InitList?
  74. InitList
  75. <- LBRACE FieldInit (COMMA FieldInit)* COMMA? RBRACE
  76. / LBRACE Expr (COMMA Expr)* COMMA? RBRACE
  77. / LBRACE RBRACE
  78. TypeExpr <- PrefixTypeOp* ErrorUnionExpr
  79. ErrorUnionExpr <- SuffixExpr (EXCLAMATIONMARK TypeExpr)?
  80. SuffixExpr
  81. <- KEYWORD_async PrimaryTypeExpr SuffixOp* FnCallArguments
  82. / PrimaryTypeExpr (SuffixOp / FnCallArguments)*
  83. PrimaryTypeExpr
  84. <- BUILTINIDENTIFIER FnCallArguments
  85. / CHAR_LITERAL
  86. / ContainerDecl
  87. / DOT IDENTIFIER
  88. / DOT InitList
  89. / ErrorSetDecl
  90. / FLOAT
  91. / FnProto
  92. / GroupedExpr
  93. / LabeledTypeExpr
  94. / IDENTIFIER
  95. / IfTypeExpr
  96. / INTEGER
  97. / KEYWORD_comptime TypeExpr
  98. / KEYWORD_error DOT IDENTIFIER
  99. / KEYWORD_false
  100. / KEYWORD_null
  101. / KEYWORD_anyframe
  102. / KEYWORD_true
  103. / KEYWORD_undefined
  104. / KEYWORD_unreachable
  105. / STRINGLITERAL
  106. / SwitchExpr
  107. ContainerDecl <- (KEYWORD_extern / KEYWORD_packed)? ContainerDeclAuto
  108. ErrorSetDecl <- KEYWORD_error LBRACE IdentifierList RBRACE
  109. GroupedExpr <- LPAREN Expr RPAREN
  110. IfTypeExpr <- IfPrefix TypeExpr (KEYWORD_else Payload? TypeExpr)?
  111. LabeledTypeExpr
  112. <- BlockLabel Block
  113. / BlockLabel? LoopTypeExpr
  114. LoopTypeExpr <- KEYWORD_inline? (ForTypeExpr / WhileTypeExpr)
  115. ForTypeExpr <- ForPrefix TypeExpr (KEYWORD_else TypeExpr)?
  116. WhileTypeExpr <- WhilePrefix TypeExpr (KEYWORD_else Payload? TypeExpr)?
  117. SwitchExpr <- KEYWORD_switch LPAREN Expr RPAREN LBRACE SwitchProngList RBRACE
  118. # *** Assembly ***
  119. AsmExpr <- KEYWORD_asm KEYWORD_volatile? LPAREN Expr AsmOutput? RPAREN
  120. AsmOutput <- COLON AsmOutputList AsmInput?
  121. AsmOutputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN (MINUSRARROW TypeExpr / IDENTIFIER) RPAREN
  122. AsmInput <- COLON AsmInputList AsmClobbers?
  123. AsmInputItem <- LBRACKET IDENTIFIER RBRACKET STRINGLITERAL LPAREN Expr RPAREN
  124. AsmClobbers <- COLON StringList
  125. # *** Helper grammar ***
  126. BreakLabel <- COLON IDENTIFIER
  127. BlockLabel <- IDENTIFIER COLON
  128. FieldInit <- DOT IDENTIFIER EQUAL Expr
  129. WhileContinueExpr <- COLON LPAREN AssignExpr RPAREN
  130. LinkSection <- KEYWORD_linksection LPAREN Expr RPAREN
  131. # Fn specific
  132. CallConv <- KEYWORD_callconv LPAREN Expr RPAREN
  133. ParamDecl
  134. <- doc_comment? (KEYWORD_noalias / KEYWORD_comptime)? (IDENTIFIER COLON)? ParamType
  135. / DOT3
  136. ParamType
  137. <- KEYWORD_anytype
  138. / TypeExpr
  139. # Control flow prefixes
  140. IfPrefix <- KEYWORD_if LPAREN Expr RPAREN PtrPayload?
  141. WhilePrefix <- KEYWORD_while LPAREN Expr RPAREN PtrPayload? WhileContinueExpr?
  142. ForPrefix <- KEYWORD_for LPAREN Expr RPAREN PtrIndexPayload
  143. # Payloads
  144. Payload <- PIPE IDENTIFIER PIPE
  145. PtrPayload <- PIPE ASTERISK? IDENTIFIER PIPE
  146. PtrIndexPayload <- PIPE ASTERISK? IDENTIFIER (COMMA IDENTIFIER)? PIPE
  147. # Switch specific
  148. SwitchProng <- SwitchCase EQUALRARROW PtrPayload? AssignExpr
  149. SwitchCase
  150. <- SwitchItem (COMMA SwitchItem)* COMMA?
  151. / KEYWORD_else
  152. SwitchItem <- Expr (DOT3 Expr)?
  153. # Operators
  154. AssignOp
  155. <- ASTERISKEQUAL
  156. / SLASHEQUAL
  157. / PERCENTEQUAL
  158. / PLUSEQUAL
  159. / MINUSEQUAL
  160. / LARROW2EQUAL
  161. / RARROW2EQUAL
  162. / AMPERSANDEQUAL
  163. / CARETEQUAL
  164. / PIPEEQUAL
  165. / ASTERISKPERCENTEQUAL
  166. / PLUSPERCENTEQUAL
  167. / MINUSPERCENTEQUAL
  168. / EQUAL
  169. CompareOp
  170. <- EQUALEQUAL
  171. / EXCLAMATIONMARKEQUAL
  172. / LARROW
  173. / RARROW
  174. / LARROWEQUAL
  175. / RARROWEQUAL
  176. BitwiseOp
  177. <- AMPERSAND
  178. / CARET
  179. / PIPE
  180. / KEYWORD_orelse
  181. / KEYWORD_catch Payload?
  182. BitShiftOp
  183. <- LARROW2
  184. / RARROW2
  185. AdditionOp
  186. <- PLUS
  187. / MINUS
  188. / PLUS2
  189. / PLUSPERCENT
  190. / MINUSPERCENT
  191. MultiplyOp
  192. <- PIPE2
  193. / ASTERISK
  194. / SLASH
  195. / PERCENT
  196. / ASTERISK2
  197. / ASTERISKPERCENT
  198. PrefixOp
  199. <- EXCLAMATIONMARK
  200. / MINUS
  201. / TILDE
  202. / MINUSPERCENT
  203. / AMPERSAND
  204. / KEYWORD_try
  205. / KEYWORD_await
  206. PrefixTypeOp
  207. <- QUESTIONMARK
  208. / KEYWORD_anyframe MINUSRARROW
  209. / SliceTypeStart (ByteAlign / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*
  210. / PtrTypeStart (KEYWORD_align LPAREN Expr (COLON INTEGER COLON INTEGER)? RPAREN / KEYWORD_const / KEYWORD_volatile / KEYWORD_allowzero)*
  211. / ArrayTypeStart
  212. SuffixOp
  213. <- LBRACKET Expr (DOT2 (Expr? (COLON Expr)?)?)? RBRACKET
  214. / DOT IDENTIFIER
  215. / DOTASTERISK
  216. / DOTQUESTIONMARK
  217. FnCallArguments <- LPAREN ExprList RPAREN
  218. # Ptr specific
  219. SliceTypeStart <- LBRACKET (COLON Expr)? RBRACKET
  220. PtrTypeStart
  221. <- ASTERISK
  222. / ASTERISK2
  223. / LBRACKET ASTERISK (LETTERC / COLON Expr)? RBRACKET
  224. ArrayTypeStart <- LBRACKET Expr (COLON Expr)? RBRACKET
  225. # ContainerDecl specific
  226. ContainerDeclAuto <- ContainerDeclType LBRACE container_doc_comment? ContainerMembers RBRACE
  227. ContainerDeclType
  228. <- KEYWORD_struct
  229. / KEYWORD_opaque
  230. / KEYWORD_enum (LPAREN Expr RPAREN)?
  231. / KEYWORD_union (LPAREN (KEYWORD_enum (LPAREN Expr RPAREN)? / Expr) RPAREN)?
  232. # Alignment
  233. ByteAlign <- KEYWORD_align LPAREN Expr RPAREN
  234. # Lists
  235. IdentifierList <- (doc_comment? IDENTIFIER COMMA)* (doc_comment? IDENTIFIER)?
  236. SwitchProngList <- (SwitchProng COMMA)* SwitchProng?
  237. AsmOutputList <- (AsmOutputItem COMMA)* AsmOutputItem?
  238. AsmInputList <- (AsmInputItem COMMA)* AsmInputItem?
  239. StringList <- (STRINGLITERAL COMMA)* STRINGLITERAL?
  240. ParamDeclList <- (ParamDecl COMMA)* ParamDecl?
  241. ExprList <- (Expr COMMA)* Expr?
  242. # *** Tokens ***
  243. eof <- !.
  244. bin <- [01]
  245. bin_ <- '_'? bin
  246. oct <- [0-7]
  247. oct_ <- '_'? oct
  248. hex <- [0-9a-fA-F]
  249. hex_ <- '_'? hex
  250. dec <- [0-9]
  251. dec_ <- '_'? dec
  252. bin_int <- bin bin_*
  253. oct_int <- oct oct_*
  254. dec_int <- dec dec_*
  255. hex_int <- hex hex_*
  256. ox80_oxBF <- [\200-\277]
  257. oxF4 <- '\364'
  258. ox80_ox8F <- [\200-\217]
  259. oxF1_oxF3 <- [\361-\363]
  260. oxF0 <- '\360'
  261. ox90_0xBF <- [\220-\277]
  262. oxEE_oxEF <- [\356-\357]
  263. oxED <- '\355'
  264. ox80_ox9F <- [\200-\237]
  265. oxE1_oxEC <- [\341-\354]
  266. oxE0 <- '\340'
  267. oxA0_oxBF <- [\240-\277]
  268. oxC2_oxDF <- [\302-\337]
  269. # From https://lemire.me/blog/2018/05/09/how-quickly-can-you-check-that-a-string-is-valid-unicode-utf-8/
  270. # First Byte Second Byte Third Byte Fourth Byte
  271. # [0x00,0x7F]
  272. # [0xC2,0xDF] [0x80,0xBF]
  273. # 0xE0 [0xA0,0xBF] [0x80,0xBF]
  274. # [0xE1,0xEC] [0x80,0xBF] [0x80,0xBF]
  275. # 0xED [0x80,0x9F] [0x80,0xBF]
  276. # [0xEE,0xEF] [0x80,0xBF] [0x80,0xBF]
  277. # 0xF0 [0x90,0xBF] [0x80,0xBF] [0x80,0xBF]
  278. # [0xF1,0xF3] [0x80,0xBF] [0x80,0xBF] [0x80,0xBF]
  279. # 0xF4 [0x80,0x8F] [0x80,0xBF] [0x80,0xBF]
  280. mb_utf8_literal <-
  281. oxF4 ox80_ox8F ox80_oxBF ox80_oxBF
  282. / oxF1_oxF3 ox80_oxBF ox80_oxBF ox80_oxBF
  283. / oxF0 ox90_0xBF ox80_oxBF ox80_oxBF
  284. / oxEE_oxEF ox80_oxBF ox80_oxBF
  285. / oxED ox80_ox9F ox80_oxBF
  286. / oxE1_oxEC ox80_oxBF ox80_oxBF
  287. / oxE0 oxA0_oxBF ox80_oxBF
  288. / oxC2_oxDF ox80_oxBF
  289. ascii_char_not_nl_slash_squote <- [\000-\011\013-\046-\050-\133\135-\177]
  290. char_escape
  291. <- "\\x" hex hex
  292. / "\\u{" hex+ "}"
  293. / "\\" [nr\\t'"]
  294. char_char
  295. <- mb_utf8_literal
  296. / char_escape
  297. / ascii_char_not_nl_slash_squote
  298. string_char
  299. <- char_escape
  300. / [^\\"\n]
  301. container_doc_comment <- ('//!' [^\n]* [ \n]*)+
  302. doc_comment <- ('///' [^\n]* [ \n]*)+
  303. line_comment <- '//' ![!/][^\n]* / '////' [^\n]*
  304. line_string <- ("\\\\" [^\n]* [ \n]*)+
  305. skip <- ([ \n] / line_comment)*
  306. CHAR_LITERAL <- "'" char_char "'" skip
  307. FLOAT
  308. <- "0x" hex_int "." hex_int ([pP] [-+]? dec_int)? skip
  309. / dec_int "." dec_int ([eE] [-+]? dec_int)? skip
  310. / "0x" hex_int "."? [pP] [-+]? dec_int skip
  311. / dec_int "."? [eE] [-+]? dec_int skip
  312. INTEGER
  313. <- "0b" bin_int skip
  314. / "0o" oct_int skip
  315. / "0x" hex_int skip
  316. / dec_int skip
  317. STRINGLITERALSINGLE <- "\"" string_char* "\"" skip
  318. STRINGLITERAL
  319. <- STRINGLITERALSINGLE
  320. / (line_string skip)+
  321. IDENTIFIER
  322. <- !keyword [A-Za-z_] [A-Za-z0-9_]* skip
  323. / "@\"" string_char* "\"" skip
  324. BUILTINIDENTIFIER <- "@"[A-Za-z_][A-Za-z0-9_]* skip
  325. AMPERSAND <- '&' ![=] skip
  326. AMPERSANDEQUAL <- '&=' skip
  327. ASTERISK <- '*' ![*%=] skip
  328. ASTERISK2 <- '**' skip
  329. ASTERISKEQUAL <- '*=' skip
  330. ASTERISKPERCENT <- '*%' ![=] skip
  331. ASTERISKPERCENTEQUAL <- '*%=' skip
  332. CARET <- '^' ![=] skip
  333. CARETEQUAL <- '^=' skip
  334. COLON <- ':' skip
  335. COMMA <- ',' skip
  336. DOT <- '.' ![*.?] skip
  337. DOT2 <- '..' ![.] skip
  338. DOT3 <- '...' skip
  339. DOTASTERISK <- '.*' skip
  340. DOTQUESTIONMARK <- '.?' skip
  341. EQUAL <- '=' ![>=] skip
  342. EQUALEQUAL <- '==' skip
  343. EQUALRARROW <- '=>' skip
  344. EXCLAMATIONMARK <- '!' ![=] skip
  345. EXCLAMATIONMARKEQUAL <- '!=' skip
  346. LARROW <- '<' ![<=] skip
  347. LARROW2 <- '<<' ![=] skip
  348. LARROW2EQUAL <- '<<=' skip
  349. LARROWEQUAL <- '<=' skip
  350. LBRACE <- '{' skip
  351. LBRACKET <- '[' skip
  352. LPAREN <- '(' skip
  353. MINUS <- '-' ![%=>] skip
  354. MINUSEQUAL <- '-=' skip
  355. MINUSPERCENT <- '-%' ![=] skip
  356. MINUSPERCENTEQUAL <- '-%=' skip
  357. MINUSRARROW <- '->' skip
  358. PERCENT <- '%' ![=] skip
  359. PERCENTEQUAL <- '%=' skip
  360. PIPE <- '|' ![|=] skip
  361. PIPE2 <- '||' skip
  362. PIPEEQUAL <- '|=' skip
  363. PLUS <- '+' ![%+=] skip
  364. PLUS2 <- '++' skip
  365. PLUSEQUAL <- '+=' skip
  366. PLUSPERCENT <- '+%' ![=] skip
  367. PLUSPERCENTEQUAL <- '+%=' skip
  368. LETTERC <- 'c' skip
  369. QUESTIONMARK <- '?' skip
  370. RARROW <- '>' ![>=] skip
  371. RARROW2 <- '>>' ![=] skip
  372. RARROW2EQUAL <- '>>=' skip
  373. RARROWEQUAL <- '>=' skip
  374. RBRACE <- '}' skip
  375. RBRACKET <- ']' skip
  376. RPAREN <- ')' skip
  377. SEMICOLON <- ';' skip
  378. SLASH <- '/' ![=] skip
  379. SLASHEQUAL <- '/=' skip
  380. TILDE <- '~' skip
  381. end_of_word <- ![a-zA-Z0-9_] skip
  382. KEYWORD_align <- 'align' end_of_word
  383. KEYWORD_allowzero <- 'allowzero' end_of_word
  384. KEYWORD_and <- 'and' end_of_word
  385. KEYWORD_anyframe <- 'anyframe' end_of_word
  386. KEYWORD_anytype <- 'anytype' end_of_word
  387. KEYWORD_asm <- 'asm' end_of_word
  388. KEYWORD_async <- 'async' end_of_word
  389. KEYWORD_await <- 'await' end_of_word
  390. KEYWORD_break <- 'break' end_of_word
  391. KEYWORD_callconv <- 'callconv' end_of_word
  392. KEYWORD_catch <- 'catch' end_of_word
  393. KEYWORD_comptime <- 'comptime' end_of_word
  394. KEYWORD_const <- 'const' end_of_word
  395. KEYWORD_continue <- 'continue' end_of_word
  396. KEYWORD_defer <- 'defer' end_of_word
  397. KEYWORD_else <- 'else' end_of_word
  398. KEYWORD_enum <- 'enum' end_of_word
  399. KEYWORD_errdefer <- 'errdefer' end_of_word
  400. KEYWORD_error <- 'error' end_of_word
  401. KEYWORD_export <- 'export' end_of_word
  402. KEYWORD_extern <- 'extern' end_of_word
  403. KEYWORD_false <- 'false' end_of_word
  404. KEYWORD_fn <- 'fn' end_of_word
  405. KEYWORD_for <- 'for' end_of_word
  406. KEYWORD_if <- 'if' end_of_word
  407. KEYWORD_inline <- 'inline' end_of_word
  408. KEYWORD_noalias <- 'noalias' end_of_word
  409. KEYWORD_nosuspend <- 'nosuspend' end_of_word
  410. KEYWORD_noinline <- 'noinline' end_of_word
  411. KEYWORD_null <- 'null' end_of_word
  412. KEYWORD_opaque <- 'opaque' end_of_word
  413. KEYWORD_or <- 'or' end_of_word
  414. KEYWORD_orelse <- 'orelse' end_of_word
  415. KEYWORD_packed <- 'packed' end_of_word
  416. KEYWORD_pub <- 'pub' end_of_word
  417. KEYWORD_resume <- 'resume' end_of_word
  418. KEYWORD_return <- 'return' end_of_word
  419. KEYWORD_linksection <- 'linksection' end_of_word
  420. KEYWORD_struct <- 'struct' end_of_word
  421. KEYWORD_suspend <- 'suspend' end_of_word
  422. KEYWORD_switch <- 'switch' end_of_word
  423. KEYWORD_test <- 'test' end_of_word
  424. KEYWORD_threadlocal <- 'threadlocal' end_of_word
  425. KEYWORD_true <- 'true' end_of_word
  426. KEYWORD_try <- 'try' end_of_word
  427. KEYWORD_undefined <- 'undefined' end_of_word
  428. KEYWORD_union <- 'union' end_of_word
  429. KEYWORD_unreachable <- 'unreachable' end_of_word
  430. KEYWORD_usingnamespace <- 'usingnamespace' end_of_word
  431. KEYWORD_var <- 'var' end_of_word
  432. KEYWORD_volatile <- 'volatile' end_of_word
  433. KEYWORD_while <- 'while' end_of_word
  434. keyword <- KEYWORD_align / KEYWORD_allowzero / KEYWORD_and / KEYWORD_anyframe
  435. / KEYWORD_anytype / KEYWORD_asm / KEYWORD_async / KEYWORD_await
  436. / KEYWORD_break / KEYWORD_callconv / KEYWORD_catch / KEYWORD_comptime
  437. / KEYWORD_const / KEYWORD_continue / KEYWORD_defer / KEYWORD_else
  438. / KEYWORD_enum / KEYWORD_errdefer / KEYWORD_error / KEYWORD_export
  439. / KEYWORD_extern / KEYWORD_false / KEYWORD_fn / KEYWORD_for / KEYWORD_if
  440. / KEYWORD_inline / KEYWORD_noalias / KEYWORD_nosuspend / KEYWORD_noinline
  441. / KEYWORD_null / KEYWORD_opaque / KEYWORD_or / KEYWORD_orelse / KEYWORD_packed
  442. / KEYWORD_pub / KEYWORD_resume / KEYWORD_return / KEYWORD_linksection
  443. / KEYWORD_struct / KEYWORD_suspend / KEYWORD_switch
  444. / KEYWORD_test / KEYWORD_threadlocal / KEYWORD_true / KEYWORD_try
  445. / KEYWORD_undefined / KEYWORD_union / KEYWORD_unreachable
  446. / KEYWORD_usingnamespace / KEYWORD_var / KEYWORD_volatile / KEYWORD_while