ast.odin 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014
  1. package odin_ast
  2. import "core:odin/tokenizer"
  3. Proc_Tag :: enum {
  4. Bounds_Check,
  5. No_Bounds_Check,
  6. Optional_Ok,
  7. Optional_Allocator_Error,
  8. }
  9. Proc_Tags :: distinct bit_set[Proc_Tag; u32]
  10. Proc_Inlining :: enum u32 {
  11. None = 0,
  12. Inline = 1,
  13. No_Inline = 2,
  14. }
  15. Proc_Calling_Convention_Extra :: enum i32 {
  16. Foreign_Block_Default,
  17. }
  18. Proc_Calling_Convention :: union {
  19. string,
  20. Proc_Calling_Convention_Extra,
  21. }
  22. Node_State_Flag :: enum {
  23. Bounds_Check,
  24. No_Bounds_Check,
  25. }
  26. Node_State_Flags :: distinct bit_set[Node_State_Flag]
  27. Node :: struct {
  28. pos: tokenizer.Pos,
  29. end: tokenizer.Pos,
  30. state_flags: Node_State_Flags,
  31. derived: Any_Node,
  32. }
  33. Comment_Group :: struct {
  34. using node: Node,
  35. list: []tokenizer.Token,
  36. }
  37. Package_Kind :: enum {
  38. Normal,
  39. Runtime,
  40. Init,
  41. }
  42. Package :: struct {
  43. using node: Node,
  44. kind: Package_Kind,
  45. id: int,
  46. name: string,
  47. fullpath: string,
  48. files: map[string]^File,
  49. user_data: rawptr,
  50. }
  51. File :: struct {
  52. using node: Node,
  53. id: int,
  54. pkg: ^Package,
  55. fullpath: string,
  56. src: string,
  57. docs: ^Comment_Group,
  58. pkg_decl: ^Package_Decl,
  59. pkg_token: tokenizer.Token,
  60. pkg_name: string,
  61. decls: [dynamic]^Stmt,
  62. imports: [dynamic]^Import_Decl,
  63. directive_count: int,
  64. comments: [dynamic]^Comment_Group,
  65. syntax_warning_count: int,
  66. syntax_error_count: int,
  67. }
  68. // Base Types
  69. Expr :: struct {
  70. using expr_base: Node,
  71. derived_expr: Any_Expr,
  72. }
  73. Stmt :: struct {
  74. using stmt_base: Node,
  75. derived_stmt: Any_Stmt,
  76. }
  77. Decl :: struct {
  78. using decl_base: Stmt,
  79. }
  80. // Expressions
  81. Bad_Expr :: struct {
  82. using node: Expr,
  83. }
  84. Ident :: struct {
  85. using node: Expr,
  86. name: string,
  87. }
  88. Implicit :: struct {
  89. using node: Expr,
  90. tok: tokenizer.Token,
  91. }
  92. Undef :: struct {
  93. using node: Expr,
  94. tok: tokenizer.Token_Kind,
  95. }
  96. Basic_Lit :: struct {
  97. using node: Expr,
  98. tok: tokenizer.Token,
  99. }
  100. Basic_Directive :: struct {
  101. using node: Expr,
  102. tok: tokenizer.Token,
  103. name: string,
  104. }
  105. Ellipsis :: struct {
  106. using node: Expr,
  107. tok: tokenizer.Token_Kind,
  108. expr: ^Expr,
  109. }
  110. Proc_Lit :: struct {
  111. using node: Expr,
  112. type: ^Proc_Type,
  113. body: ^Stmt,
  114. tags: Proc_Tags,
  115. inlining: Proc_Inlining,
  116. where_token: tokenizer.Token,
  117. where_clauses: []^Expr,
  118. }
  119. Comp_Lit :: struct {
  120. using node: Expr,
  121. type: ^Expr,
  122. open: tokenizer.Pos,
  123. elems: []^Expr,
  124. close: tokenizer.Pos,
  125. tag: ^Expr,
  126. }
  127. Tag_Expr :: struct {
  128. using node: Expr,
  129. op: tokenizer.Token,
  130. name: string,
  131. expr: ^Expr,
  132. }
  133. Unary_Expr :: struct {
  134. using node: Expr,
  135. op: tokenizer.Token,
  136. expr: ^Expr,
  137. }
  138. Binary_Expr :: struct {
  139. using node: Expr,
  140. left: ^Expr,
  141. op: tokenizer.Token,
  142. right: ^Expr,
  143. }
  144. Paren_Expr :: struct {
  145. using node: Expr,
  146. open: tokenizer.Pos,
  147. expr: ^Expr,
  148. close: tokenizer.Pos,
  149. }
  150. Selector_Expr :: struct {
  151. using node: Expr,
  152. expr: ^Expr,
  153. op: tokenizer.Token,
  154. field: ^Ident,
  155. }
  156. Implicit_Selector_Expr :: struct {
  157. using node: Expr,
  158. field: ^Ident,
  159. }
  160. Selector_Call_Expr :: struct {
  161. using node: Expr,
  162. expr: ^Expr,
  163. call: ^Call_Expr,
  164. modified_call: bool,
  165. }
  166. Index_Expr :: struct {
  167. using node: Expr,
  168. expr: ^Expr,
  169. open: tokenizer.Pos,
  170. index: ^Expr,
  171. close: tokenizer.Pos,
  172. }
  173. Deref_Expr :: struct {
  174. using node: Expr,
  175. expr: ^Expr,
  176. op: tokenizer.Token,
  177. }
  178. Slice_Expr :: struct {
  179. using node: Expr,
  180. expr: ^Expr,
  181. open: tokenizer.Pos,
  182. low: ^Expr,
  183. interval: tokenizer.Token,
  184. high: ^Expr,
  185. close: tokenizer.Pos,
  186. }
  187. Matrix_Index_Expr :: struct {
  188. using node: Expr,
  189. expr: ^Expr,
  190. open: tokenizer.Pos,
  191. row_index: ^Expr,
  192. column_index: ^Expr,
  193. close: tokenizer.Pos,
  194. }
  195. Call_Expr :: struct {
  196. using node: Expr,
  197. inlining: Proc_Inlining,
  198. expr: ^Expr,
  199. open: tokenizer.Pos,
  200. args: []^Expr,
  201. ellipsis: tokenizer.Token,
  202. close: tokenizer.Pos,
  203. }
  204. Field_Value :: struct {
  205. using node: Expr,
  206. field: ^Expr,
  207. sep: tokenizer.Pos,
  208. value: ^Expr,
  209. }
  210. Ternary_If_Expr :: struct {
  211. using node: Expr,
  212. x: ^Expr,
  213. op1: tokenizer.Token,
  214. cond: ^Expr,
  215. op2: tokenizer.Token,
  216. y: ^Expr,
  217. }
  218. Ternary_When_Expr :: struct {
  219. using node: Expr,
  220. x: ^Expr,
  221. op1: tokenizer.Token,
  222. cond: ^Expr,
  223. op2: tokenizer.Token,
  224. y: ^Expr,
  225. }
  226. Or_Else_Expr :: struct {
  227. using node: Expr,
  228. x: ^Expr,
  229. token: tokenizer.Token,
  230. y: ^Expr,
  231. }
  232. Or_Return_Expr :: struct {
  233. using node: Expr,
  234. expr: ^Expr,
  235. token: tokenizer.Token,
  236. }
  237. Or_Branch_Expr :: struct {
  238. using node: Expr,
  239. expr: ^Expr,
  240. token: tokenizer.Token,
  241. label: ^Expr,
  242. }
  243. Type_Assertion :: struct {
  244. using node: Expr,
  245. expr: ^Expr,
  246. dot: tokenizer.Pos,
  247. open: tokenizer.Pos,
  248. type: ^Expr,
  249. close: tokenizer.Pos,
  250. }
  251. Type_Cast :: struct {
  252. using node: Expr,
  253. tok: tokenizer.Token,
  254. open: tokenizer.Pos,
  255. type: ^Expr,
  256. close: tokenizer.Pos,
  257. expr: ^Expr,
  258. }
  259. Auto_Cast :: struct {
  260. using node: Expr,
  261. op: tokenizer.Token,
  262. expr: ^Expr,
  263. }
  264. Inline_Asm_Dialect :: enum u8 {
  265. Default = 0,
  266. ATT = 1,
  267. Intel = 2,
  268. }
  269. Inline_Asm_Expr :: struct {
  270. using node: Expr,
  271. tok: tokenizer.Token,
  272. param_types: []^Expr,
  273. return_type: ^Expr,
  274. has_side_effects: bool,
  275. is_align_stack: bool,
  276. dialect: Inline_Asm_Dialect,
  277. open: tokenizer.Pos,
  278. constraints_string: ^Expr,
  279. asm_string: ^Expr,
  280. close: tokenizer.Pos,
  281. }
  282. // Statements
  283. Bad_Stmt :: struct {
  284. using node: Stmt,
  285. }
  286. Empty_Stmt :: struct {
  287. using node: Stmt,
  288. semicolon: tokenizer.Pos, // Position of the following ';'
  289. }
  290. Expr_Stmt :: struct {
  291. using node: Stmt,
  292. expr: ^Expr,
  293. }
  294. Tag_Stmt :: struct {
  295. using node: Stmt,
  296. op: tokenizer.Token,
  297. name: string,
  298. stmt: ^Stmt,
  299. }
  300. Assign_Stmt :: struct {
  301. using node: Stmt,
  302. lhs: []^Expr,
  303. op: tokenizer.Token,
  304. rhs: []^Expr,
  305. }
  306. Block_Stmt :: struct {
  307. using node: Stmt,
  308. label: ^Expr,
  309. open: tokenizer.Pos,
  310. stmts: []^Stmt,
  311. close: tokenizer.Pos,
  312. uses_do: bool,
  313. }
  314. If_Stmt :: struct {
  315. using node: Stmt,
  316. label: ^Expr,
  317. if_pos: tokenizer.Pos,
  318. init: ^Stmt,
  319. cond: ^Expr,
  320. body: ^Stmt,
  321. else_pos: tokenizer.Pos,
  322. else_stmt: ^Stmt,
  323. }
  324. When_Stmt :: struct {
  325. using node: Stmt,
  326. when_pos: tokenizer.Pos,
  327. cond: ^Expr,
  328. body: ^Stmt,
  329. else_stmt: ^Stmt,
  330. }
  331. Return_Stmt :: struct {
  332. using node: Stmt,
  333. results: []^Expr,
  334. }
  335. Defer_Stmt :: struct {
  336. using node: Stmt,
  337. stmt: ^Stmt,
  338. }
  339. For_Stmt :: struct {
  340. using node: Stmt,
  341. label: ^Expr,
  342. for_pos: tokenizer.Pos,
  343. init: ^Stmt,
  344. cond: ^Expr,
  345. post: ^Stmt,
  346. body: ^Stmt,
  347. }
  348. Range_Stmt :: struct {
  349. using node: Stmt,
  350. label: ^Expr,
  351. for_pos: tokenizer.Pos,
  352. vals: []^Expr,
  353. in_pos: tokenizer.Pos,
  354. expr: ^Expr,
  355. body: ^Stmt,
  356. reverse: bool,
  357. }
  358. Inline_Range_Stmt :: struct {
  359. using node: Stmt,
  360. label: ^Expr,
  361. inline_pos: tokenizer.Pos,
  362. for_pos: tokenizer.Pos,
  363. val0: ^Expr,
  364. val1: ^Expr,
  365. in_pos: tokenizer.Pos,
  366. expr: ^Expr,
  367. body: ^Stmt,
  368. }
  369. Case_Clause :: struct {
  370. using node: Stmt,
  371. case_pos: tokenizer.Pos,
  372. list: []^Expr,
  373. terminator: tokenizer.Token,
  374. body: []^Stmt,
  375. }
  376. Switch_Stmt :: struct {
  377. using node: Stmt,
  378. label: ^Expr,
  379. switch_pos: tokenizer.Pos,
  380. init: ^Stmt,
  381. cond: ^Expr,
  382. body: ^Stmt,
  383. partial: bool,
  384. }
  385. Type_Switch_Stmt :: struct {
  386. using node: Stmt,
  387. label: ^Expr,
  388. switch_pos: tokenizer.Pos,
  389. tag: ^Stmt,
  390. expr: ^Expr,
  391. body: ^Stmt,
  392. partial: bool,
  393. }
  394. Branch_Stmt :: struct {
  395. using node: Stmt,
  396. tok: tokenizer.Token,
  397. label: ^Ident,
  398. }
  399. Using_Stmt :: struct {
  400. using node: Stmt,
  401. list: []^Expr,
  402. }
  403. // Declarations
  404. Bad_Decl :: struct {
  405. using node: Decl,
  406. }
  407. Value_Decl :: struct {
  408. using node: Decl,
  409. docs: ^Comment_Group,
  410. attributes: [dynamic]^Attribute, // dynamic as parsing will add to them lazily
  411. names: []^Expr,
  412. type: ^Expr,
  413. values: []^Expr,
  414. comment: ^Comment_Group,
  415. is_using: bool,
  416. is_mutable: bool,
  417. }
  418. Package_Decl :: struct {
  419. using node: Decl,
  420. docs: ^Comment_Group,
  421. token: tokenizer.Token,
  422. name: string,
  423. comment: ^Comment_Group,
  424. }
  425. Import_Decl :: struct {
  426. using node: Decl,
  427. docs: ^Comment_Group,
  428. is_using: bool,
  429. import_tok: tokenizer.Token,
  430. name: tokenizer.Token,
  431. relpath: tokenizer.Token,
  432. fullpath: string,
  433. comment: ^Comment_Group,
  434. }
  435. Foreign_Block_Decl :: struct {
  436. using node: Decl,
  437. docs: ^Comment_Group,
  438. attributes: [dynamic]^Attribute, // dynamic as parsing will add to them lazily
  439. tok: tokenizer.Token,
  440. foreign_library: ^Expr,
  441. body: ^Stmt,
  442. }
  443. Foreign_Import_Decl :: struct {
  444. using node: Decl,
  445. docs: ^Comment_Group,
  446. attributes: [dynamic]^Attribute, // dynamic as parsing will add to them lazily
  447. foreign_tok: tokenizer.Token,
  448. import_tok: tokenizer.Token,
  449. name: ^Ident,
  450. collection_name: string,
  451. fullpaths: []string,
  452. comment: ^Comment_Group,
  453. }
  454. // Other things
  455. unparen_expr :: proc(expr: ^Expr) -> (val: ^Expr) {
  456. val = expr
  457. if expr == nil {
  458. return
  459. }
  460. for {
  461. e := val.derived.(^Paren_Expr) or_break
  462. if e.expr == nil {
  463. break
  464. }
  465. val = e.expr
  466. }
  467. return
  468. }
  469. strip_or_return_expr :: proc(expr: ^Expr) -> (val: ^Expr) {
  470. val = expr
  471. if expr == nil {
  472. return
  473. }
  474. for {
  475. inner: ^Expr
  476. #partial switch e in val.derived {
  477. case ^Or_Return_Expr:
  478. inner = e.expr
  479. case ^Or_Branch_Expr:
  480. inner = e.expr
  481. case ^Paren_Expr:
  482. inner = e.expr
  483. }
  484. if inner == nil {
  485. break
  486. }
  487. val = inner
  488. }
  489. return
  490. }
  491. Field_Flags :: distinct bit_set[Field_Flag]
  492. Field_Flag :: enum {
  493. Invalid,
  494. Unknown,
  495. Ellipsis,
  496. Using,
  497. No_Alias,
  498. C_Vararg,
  499. Const,
  500. Any_Int,
  501. Subtype,
  502. By_Ptr,
  503. No_Broadcast,
  504. Results,
  505. Tags,
  506. Default_Parameters,
  507. Typeid_Token,
  508. }
  509. field_flag_strings := [Field_Flag]string{
  510. .Invalid = "",
  511. .Unknown = "",
  512. .Ellipsis = "..",
  513. .Using = "using",
  514. .No_Alias = "#no_alias",
  515. .C_Vararg = "#c_vararg",
  516. .Const = "#const",
  517. .Any_Int = "#any_int",
  518. .Subtype = "#subtype",
  519. .By_Ptr = "#by_ptr",
  520. .No_Broadcast ="#no_broadcast",
  521. .Results = "results",
  522. .Tags = "field tag",
  523. .Default_Parameters = "default parameters",
  524. .Typeid_Token = "typeid",
  525. }
  526. field_hash_flag_strings := []struct{key: string, flag: Field_Flag}{
  527. {"no_alias", .No_Alias},
  528. {"c_vararg", .C_Vararg},
  529. {"const", .Const},
  530. {"any_int", .Any_Int},
  531. {"subtype", .Subtype},
  532. {"by_ptr", .By_Ptr},
  533. {"no_broadcast", .No_Broadcast},
  534. }
  535. Field_Flags_Struct :: Field_Flags{
  536. .Using,
  537. .Tags,
  538. .Subtype,
  539. }
  540. Field_Flags_Record_Poly_Params :: Field_Flags{
  541. .Typeid_Token,
  542. .Default_Parameters,
  543. }
  544. Field_Flags_Signature :: Field_Flags{
  545. .Ellipsis,
  546. .Using,
  547. .No_Alias,
  548. .C_Vararg,
  549. .Const,
  550. .Any_Int,
  551. .By_Ptr,
  552. .No_Broadcast,
  553. .Default_Parameters,
  554. }
  555. Field_Flags_Signature_Params :: Field_Flags_Signature | {Field_Flag.Typeid_Token}
  556. Field_Flags_Signature_Results :: Field_Flags_Signature
  557. Proc_Group :: struct {
  558. using node: Expr,
  559. tok: tokenizer.Token,
  560. open: tokenizer.Pos,
  561. args: []^Expr,
  562. close: tokenizer.Pos,
  563. }
  564. Attribute :: struct {
  565. using node: Node,
  566. tok: tokenizer.Token_Kind,
  567. open: tokenizer.Pos,
  568. elems: []^Expr,
  569. close: tokenizer.Pos,
  570. }
  571. Field :: struct {
  572. using node: Node,
  573. docs: ^Comment_Group,
  574. names: []^Expr, // Could be polymorphic
  575. type: ^Expr,
  576. default_value: ^Expr,
  577. tag: tokenizer.Token,
  578. flags: Field_Flags,
  579. comment: ^Comment_Group,
  580. }
  581. Field_List :: struct {
  582. using node: Node,
  583. open: tokenizer.Pos,
  584. list: []^Field,
  585. close: tokenizer.Pos,
  586. }
  587. // Types
  588. Typeid_Type :: struct {
  589. using node: Expr,
  590. tok: tokenizer.Token_Kind,
  591. specialization: ^Expr,
  592. }
  593. Helper_Type :: struct {
  594. using node: Expr,
  595. tok: tokenizer.Token_Kind,
  596. type: ^Expr,
  597. }
  598. Distinct_Type :: struct {
  599. using node: Expr,
  600. tok: tokenizer.Token_Kind,
  601. type: ^Expr,
  602. }
  603. Poly_Type :: struct {
  604. using node: Expr,
  605. dollar: tokenizer.Pos,
  606. type: ^Ident,
  607. specialization: ^Expr,
  608. }
  609. Proc_Type :: struct {
  610. using node: Expr,
  611. tok: tokenizer.Token,
  612. calling_convention: Proc_Calling_Convention,
  613. params: ^Field_List,
  614. arrow: tokenizer.Pos,
  615. results: ^Field_List,
  616. tags: Proc_Tags,
  617. generic: bool,
  618. diverging: bool,
  619. }
  620. Pointer_Type :: struct {
  621. using node: Expr,
  622. tag: ^Expr,
  623. pointer: tokenizer.Pos,
  624. elem: ^Expr,
  625. }
  626. Multi_Pointer_Type :: struct {
  627. using node: Expr,
  628. open: tokenizer.Pos,
  629. pointer: tokenizer.Pos,
  630. close: tokenizer.Pos,
  631. elem: ^Expr,
  632. }
  633. Array_Type :: struct {
  634. using node: Expr,
  635. open: tokenizer.Pos,
  636. tag: ^Expr,
  637. len: ^Expr, // Ellipsis node for [?]T arrray types, nil for slice types
  638. close: tokenizer.Pos,
  639. elem: ^Expr,
  640. }
  641. Dynamic_Array_Type :: struct {
  642. using node: Expr,
  643. tag: ^Expr,
  644. open: tokenizer.Pos,
  645. dynamic_pos: tokenizer.Pos,
  646. close: tokenizer.Pos,
  647. elem: ^Expr,
  648. }
  649. Struct_Type :: struct {
  650. using node: Expr,
  651. tok_pos: tokenizer.Pos,
  652. poly_params: ^Field_List,
  653. align: ^Expr,
  654. field_align: ^Expr,
  655. where_token: tokenizer.Token,
  656. where_clauses: []^Expr,
  657. is_packed: bool,
  658. is_raw_union: bool,
  659. is_no_copy: bool,
  660. fields: ^Field_List,
  661. name_count: int,
  662. }
  663. Union_Type_Kind :: enum u8 {
  664. Normal,
  665. maybe,
  666. no_nil,
  667. shared_nil,
  668. }
  669. Union_Type :: struct {
  670. using node: Expr,
  671. tok_pos: tokenizer.Pos,
  672. poly_params: ^Field_List,
  673. align: ^Expr,
  674. kind: Union_Type_Kind,
  675. where_token: tokenizer.Token,
  676. where_clauses: []^Expr,
  677. variants: []^Expr,
  678. }
  679. Enum_Type :: struct {
  680. using node: Expr,
  681. tok_pos: tokenizer.Pos,
  682. base_type: ^Expr,
  683. open: tokenizer.Pos,
  684. fields: []^Expr,
  685. close: tokenizer.Pos,
  686. is_using: bool,
  687. }
  688. Bit_Set_Type :: struct {
  689. using node: Expr,
  690. tok_pos: tokenizer.Pos,
  691. open: tokenizer.Pos,
  692. elem: ^Expr,
  693. underlying: ^Expr,
  694. close: tokenizer.Pos,
  695. }
  696. Map_Type :: struct {
  697. using node: Expr,
  698. tok_pos: tokenizer.Pos,
  699. key: ^Expr,
  700. value: ^Expr,
  701. }
  702. Relative_Type :: struct {
  703. using node: Expr,
  704. tag: ^Expr,
  705. type: ^Expr,
  706. }
  707. Matrix_Type :: struct {
  708. using node: Expr,
  709. tok_pos: tokenizer.Pos,
  710. row_count: ^Expr,
  711. column_count: ^Expr,
  712. elem: ^Expr,
  713. }
  714. Any_Node :: union {
  715. ^Package,
  716. ^File,
  717. ^Comment_Group,
  718. ^Bad_Expr,
  719. ^Ident,
  720. ^Implicit,
  721. ^Undef,
  722. ^Basic_Lit,
  723. ^Basic_Directive,
  724. ^Ellipsis,
  725. ^Proc_Lit,
  726. ^Comp_Lit,
  727. ^Tag_Expr,
  728. ^Unary_Expr,
  729. ^Binary_Expr,
  730. ^Paren_Expr,
  731. ^Selector_Expr,
  732. ^Implicit_Selector_Expr,
  733. ^Selector_Call_Expr,
  734. ^Index_Expr,
  735. ^Deref_Expr,
  736. ^Slice_Expr,
  737. ^Matrix_Index_Expr,
  738. ^Call_Expr,
  739. ^Field_Value,
  740. ^Ternary_If_Expr,
  741. ^Ternary_When_Expr,
  742. ^Or_Else_Expr,
  743. ^Or_Return_Expr,
  744. ^Or_Branch_Expr,
  745. ^Type_Assertion,
  746. ^Type_Cast,
  747. ^Auto_Cast,
  748. ^Inline_Asm_Expr,
  749. ^Proc_Group,
  750. ^Typeid_Type,
  751. ^Helper_Type,
  752. ^Distinct_Type,
  753. ^Poly_Type,
  754. ^Proc_Type,
  755. ^Pointer_Type,
  756. ^Multi_Pointer_Type,
  757. ^Array_Type,
  758. ^Dynamic_Array_Type,
  759. ^Struct_Type,
  760. ^Union_Type,
  761. ^Enum_Type,
  762. ^Bit_Set_Type,
  763. ^Map_Type,
  764. ^Relative_Type,
  765. ^Matrix_Type,
  766. ^Bad_Stmt,
  767. ^Empty_Stmt,
  768. ^Expr_Stmt,
  769. ^Tag_Stmt,
  770. ^Assign_Stmt,
  771. ^Block_Stmt,
  772. ^If_Stmt,
  773. ^When_Stmt,
  774. ^Return_Stmt,
  775. ^Defer_Stmt,
  776. ^For_Stmt,
  777. ^Range_Stmt,
  778. ^Inline_Range_Stmt,
  779. ^Case_Clause,
  780. ^Switch_Stmt,
  781. ^Type_Switch_Stmt,
  782. ^Branch_Stmt,
  783. ^Using_Stmt,
  784. ^Bad_Decl,
  785. ^Value_Decl,
  786. ^Package_Decl,
  787. ^Import_Decl,
  788. ^Foreign_Block_Decl,
  789. ^Foreign_Import_Decl,
  790. ^Attribute,
  791. ^Field,
  792. ^Field_List,
  793. }
  794. Any_Expr :: union {
  795. ^Bad_Expr,
  796. ^Ident,
  797. ^Implicit,
  798. ^Undef,
  799. ^Basic_Lit,
  800. ^Basic_Directive,
  801. ^Ellipsis,
  802. ^Proc_Lit,
  803. ^Comp_Lit,
  804. ^Tag_Expr,
  805. ^Unary_Expr,
  806. ^Binary_Expr,
  807. ^Paren_Expr,
  808. ^Selector_Expr,
  809. ^Implicit_Selector_Expr,
  810. ^Selector_Call_Expr,
  811. ^Index_Expr,
  812. ^Deref_Expr,
  813. ^Slice_Expr,
  814. ^Matrix_Index_Expr,
  815. ^Call_Expr,
  816. ^Field_Value,
  817. ^Ternary_If_Expr,
  818. ^Ternary_When_Expr,
  819. ^Or_Else_Expr,
  820. ^Or_Return_Expr,
  821. ^Or_Branch_Expr,
  822. ^Type_Assertion,
  823. ^Type_Cast,
  824. ^Auto_Cast,
  825. ^Inline_Asm_Expr,
  826. ^Proc_Group,
  827. ^Typeid_Type,
  828. ^Helper_Type,
  829. ^Distinct_Type,
  830. ^Poly_Type,
  831. ^Proc_Type,
  832. ^Pointer_Type,
  833. ^Multi_Pointer_Type,
  834. ^Array_Type,
  835. ^Dynamic_Array_Type,
  836. ^Struct_Type,
  837. ^Union_Type,
  838. ^Enum_Type,
  839. ^Bit_Set_Type,
  840. ^Map_Type,
  841. ^Relative_Type,
  842. ^Matrix_Type,
  843. }
  844. Any_Stmt :: union {
  845. ^Bad_Stmt,
  846. ^Empty_Stmt,
  847. ^Expr_Stmt,
  848. ^Tag_Stmt,
  849. ^Assign_Stmt,
  850. ^Block_Stmt,
  851. ^If_Stmt,
  852. ^When_Stmt,
  853. ^Return_Stmt,
  854. ^Defer_Stmt,
  855. ^For_Stmt,
  856. ^Range_Stmt,
  857. ^Inline_Range_Stmt,
  858. ^Case_Clause,
  859. ^Switch_Stmt,
  860. ^Type_Switch_Stmt,
  861. ^Branch_Stmt,
  862. ^Using_Stmt,
  863. ^Bad_Decl,
  864. ^Value_Decl,
  865. ^Package_Decl,
  866. ^Import_Decl,
  867. ^Foreign_Block_Decl,
  868. ^Foreign_Import_Decl,
  869. }