summaryrefslogtreecommitdiff
path: root/mrbgems/mruby-compiler/core/node.h
diff options
Diffstat (limited to 'mrbgems/mruby-compiler/core/node.h')
-rw-r--r--mrbgems/mruby-compiler/core/node.h723
1 files changed, 702 insertions, 21 deletions
diff --git a/mrbgems/mruby-compiler/core/node.h b/mrbgems/mruby-compiler/core/node.h
index a57b7bd..beb507b 100644
--- a/mrbgems/mruby-compiler/core/node.h
+++ b/mrbgems/mruby-compiler/core/node.h
@@ -8,20 +8,20 @@
#define MRUBY_COMPILER_NODE_H
enum node_type {
- NODE_METHOD,
NODE_SCOPE,
NODE_BLOCK,
NODE_IF,
NODE_CASE,
- NODE_WHEN,
NODE_WHILE,
NODE_UNTIL,
- NODE_ITER,
+ NODE_WHILE_MOD,
+ NODE_UNTIL_MOD,
NODE_FOR,
NODE_BREAK,
NODE_NEXT,
NODE_REDO,
NODE_RETRY,
+ NODE_STMTS,
NODE_BEGIN,
NODE_RESCUE,
NODE_ENSURE,
@@ -29,20 +29,15 @@ enum node_type {
NODE_OR,
NODE_NOT,
NODE_MASGN,
+ NODE_MARG,
NODE_ASGN,
- NODE_CDECL,
- NODE_CVASGN,
- NODE_CVDECL,
NODE_OP_ASGN,
NODE_CALL,
- NODE_SCALL,
- NODE_FCALL,
NODE_SUPER,
NODE_ZSUPER,
NODE_ARRAY,
NODE_ZARRAY,
NODE_HASH,
- NODE_KW_HASH,
NODE_RETURN,
NODE_YIELD,
NODE_LVAR,
@@ -54,26 +49,16 @@ enum node_type {
NODE_NVAR,
NODE_NTH_REF,
NODE_BACK_REF,
- NODE_MATCH,
NODE_INT,
+ NODE_BIGINT,
NODE_FLOAT,
NODE_NEGATE,
NODE_LAMBDA,
NODE_SYM,
NODE_STR,
- NODE_DSTR,
NODE_XSTR,
- NODE_DXSTR,
NODE_REGX,
- NODE_DREGX,
- NODE_DREGX_ONCE,
- NODE_ARG,
- NODE_ARGS_TAIL,
- NODE_KW_ARG,
- NODE_KW_REST_ARGS,
NODE_SPLAT,
- NODE_TO_ARY,
- NODE_SVALUE,
NODE_BLOCK_ARG,
NODE_DEF,
NODE_SDEF,
@@ -94,10 +79,706 @@ enum node_type {
NODE_POSTEXE,
NODE_DSYM,
NODE_HEREDOC,
- NODE_LITERAL_DELIM,
NODE_WORDS,
NODE_SYMBOLS,
+ /* Pattern matching nodes */
+ NODE_CASE_MATCH, /* case/in pattern matching expression */
+ NODE_IN, /* in-clause node */
+ NODE_PAT_VALUE, /* value pattern (literal, constant) */
+ NODE_PAT_VAR, /* variable pattern */
+ NODE_PAT_PIN, /* pin operator ^var */
+ NODE_PAT_AS, /* as pattern (pattern => var) */
+ NODE_PAT_ALT, /* alternative pattern (pat1 | pat2) */
+ NODE_PAT_ARRAY, /* array pattern [a, b, *rest] */
+ NODE_PAT_FIND, /* find pattern [*pre, elem, *post] */
+ NODE_PAT_HASH, /* hash pattern {a:, b: x} */
+ NODE_MATCH_PAT, /* one-line pattern matching (expr in pat / expr => pat) */
NODE_LAST
};
+#define STR_FUNC_PARSING 0x01
+#define STR_FUNC_EXPAND 0x02
+#define STR_FUNC_REGEXP 0x04
+#define STR_FUNC_WORD 0x08
+#define STR_FUNC_SYMBOL 0x10
+#define STR_FUNC_ARRAY 0x20
+#define STR_FUNC_HEREDOC 0x40
+#define STR_FUNC_XQUOTE 0x80
+
+enum mrb_string_type {
+ str_not_parsing = (0),
+ str_squote = (STR_FUNC_PARSING),
+ str_dquote = (STR_FUNC_PARSING|STR_FUNC_EXPAND),
+ str_regexp = (STR_FUNC_PARSING|STR_FUNC_REGEXP|STR_FUNC_EXPAND),
+ str_sword = (STR_FUNC_PARSING|STR_FUNC_WORD|STR_FUNC_ARRAY),
+ str_dword = (STR_FUNC_PARSING|STR_FUNC_WORD|STR_FUNC_ARRAY|STR_FUNC_EXPAND),
+ str_ssym = (STR_FUNC_PARSING|STR_FUNC_SYMBOL),
+ str_ssymbols = (STR_FUNC_PARSING|STR_FUNC_SYMBOL|STR_FUNC_ARRAY),
+ str_dsymbols = (STR_FUNC_PARSING|STR_FUNC_SYMBOL|STR_FUNC_ARRAY|STR_FUNC_EXPAND),
+ str_heredoc = (STR_FUNC_PARSING|STR_FUNC_HEREDOC),
+ str_xquote = (STR_FUNC_PARSING|STR_FUNC_XQUOTE|STR_FUNC_EXPAND),
+};
+
+/* heredoc structure */
+struct mrb_parser_heredoc_info {
+ mrb_bool allow_indent:1;
+ mrb_bool remove_indent:1;
+ mrb_bool line_head:1;
+ size_t indent;
+ mrb_ast_node *indented;
+ enum mrb_string_type type;
+ const char *term;
+ int term_len;
+ mrb_ast_node *doc;
+};
+
+/* AST node structures - Head-only location optimization */
+
+/* Structure nodes - only car/cdr, ignores location fields */
+struct mrb_ast_node {
+ struct mrb_ast_node *car, *cdr;
+ /* No location fields - saves 4 bytes per structure node */
+};
+
+/* Variable-sized AST nodes */
+
+/* Variable node header - common to all variable-sized nodes */
+struct mrb_ast_var_header {
+ uint16_t lineno; /* Line number information */
+ uint16_t filename_index; /* File index information */
+ uint8_t node_type; /* NODE_INT, NODE_SYM, NODE_STR, etc. */
+ /* Total: 6 bytes header for all variable nodes */
+};
+
+/* Literal value nodes */
+
+/* Variable-sized symbol node */
+struct mrb_ast_sym_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ mrb_sym symbol; /* Direct symbol reference */
+ /* Total: 12-16 bytes vs previous 20+ bytes + indirection */
+};
+
+/* Variable-sized string node with cons list */
+struct mrb_ast_str_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *list;
+};
+
+/* Variable-sized integer node */
+struct mrb_ast_int_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ int32_t value; /* Direct 32-bit integer storage */
+};
+
+/* Variable-sized big integer node */
+struct mrb_ast_bigint_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ char *string; /* String representation of big number */
+ int base; /* Number base (8, 10, 16) */
+};
+
+/* Variable-sized node for variables (lvar, ivar, etc.) */
+struct mrb_ast_var_node {
+ struct mrb_ast_var_header header;
+ mrb_sym symbol;
+};
+
+/* Expression and operation nodes */
+
+/* Variable-sized call node with inline argument storage */
+struct mrb_ast_call_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *receiver; /* Receiver object */
+ mrb_sym method_name; /* Method name symbol */
+ uint8_t safe_call:1; /* Safe navigation (&.) */
+ struct mrb_ast_node *args; /* Arguments Information */
+};
+
+/* Variable-sized array node */
+struct mrb_ast_array_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *elements; /* Elements list (cons list) */
+};
+
+/* Variable-sized hash node */
+struct mrb_ast_hash_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *pairs; /* Key-value pairs (cons list) */
+};
+
+/* Control flow and definition nodes */
+
+/* Variable-sized method definition node */
+struct mrb_ast_def_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ mrb_sym name; /* Method name */
+ struct mrb_ast_args *args; /* Method arguments */
+ struct mrb_ast_node *body; /* Method body */
+ struct mrb_ast_node *locals; /* Local Variables */
+} ;
+
+/* Variable-sized singleton method definition node */
+struct mrb_ast_sdef_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ mrb_sym name; /* Method name */
+ struct mrb_ast_args *args; /* Method arguments */
+ struct mrb_ast_node *body; /* Method body */
+ struct mrb_ast_node *locals; /* Local Variables */
+ struct mrb_ast_node *obj; /* receiver */
+};
+
+/* variable-sized class definition node */
+struct mrb_ast_class_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *name; /* Class name (NODE_CONST or NODE_COLON2) */
+ struct mrb_ast_node *superclass; /* Superclass (can be NULL) */
+ struct mrb_ast_node *body; /* Class body */
+};
+
+/* Variable-sized module definition node */
+struct mrb_ast_module_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *name; /* Module name (NODE_CONST or NODE_COLON2) */
+ struct mrb_ast_node *body; /* Module body */
+};
+
+/* Variable-sized singleton class definition node */
+struct mrb_ast_sclass_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *obj; /* Object for singleton class */
+ struct mrb_ast_node *body; /* Singleton class body */
+};
+
+/* Variable-sized if node */
+struct mrb_ast_if_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *condition; /* Condition expression */
+ struct mrb_ast_node *then_body; /* Then branch */
+ struct mrb_ast_node *else_body; /* Else branch (can be NULL) */
+};
+
+/* Variable-sized while node */
+struct mrb_ast_while_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *condition; /* Loop condition */
+ struct mrb_ast_node *body; /* Loop body */
+};
+
+/* Variable-sized until node */
+struct mrb_ast_until_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *condition; /* Loop condition */
+ struct mrb_ast_node *body; /* Loop body */
+};
+
+/* Variable-sized case node */
+struct mrb_ast_case_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *value; /* Case value expression */
+ struct mrb_ast_node *body; /* When/else clauses (cons list) */
+};
+
+/* Pattern matching case node (case/in) */
+struct mrb_ast_case_match_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *value; /* Case value expression */
+ struct mrb_ast_node *in_clauses; /* In clause list (cons list) */
+};
+
+/* In clause node */
+struct mrb_ast_in_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *pattern; /* Pattern to match */
+ struct mrb_ast_node *guard; /* Guard expression (optional) */
+ struct mrb_ast_node *body; /* Body to execute on match */
+ mrb_bool guard_is_unless; /* TRUE if 'unless', FALSE if 'if' */
+};
+
+/* Value pattern node (literal, constant) */
+struct mrb_ast_pat_value_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *value; /* Literal or constant node */
+};
+
+/* Variable pattern node */
+struct mrb_ast_pat_var_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ mrb_sym name; /* Variable name (0 for wildcard _) */
+};
+
+/* Pin pattern node (^var) */
+struct mrb_ast_pat_pin_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ mrb_sym name; /* Variable name to pin */
+};
+
+/* As pattern node (pattern => var) */
+struct mrb_ast_pat_as_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *pattern; /* Pattern to match */
+ mrb_sym name; /* Variable to bind */
+};
+
+/* Alternative pattern node (pat1 | pat2) */
+struct mrb_ast_pat_alt_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *left; /* Left pattern */
+ struct mrb_ast_node *right; /* Right pattern */
+};
+
+/* Array pattern node [a, b, *rest] */
+struct mrb_ast_pat_array_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *pre; /* Pre-rest patterns (cons list) */
+ struct mrb_ast_node *rest; /* Rest pattern (NULL if none, -1 if anonymous) */
+ struct mrb_ast_node *post; /* Post-rest patterns (cons list) */
+};
+
+/* Find pattern node [*pre, elem, *post] - searches for elem anywhere in array */
+struct mrb_ast_pat_find_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *pre; /* Pre rest pattern (NULL or -1 if anonymous) */
+ struct mrb_ast_node *elems; /* Middle patterns to find (cons list) */
+ struct mrb_ast_node *post; /* Post rest pattern (NULL or -1 if anonymous) */
+};
+
+/* Hash pattern node {a:, b: x} */
+struct mrb_ast_pat_hash_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *pairs; /* Key-pattern pairs (cons list) */
+ struct mrb_ast_node *rest; /* Rest pattern (NULL if none, -1 if **nil) */
+};
+
+/* One-line pattern matching: expr in pattern / expr => pattern */
+struct mrb_ast_match_pat_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *value; /* Expression to match */
+ struct mrb_ast_node *pattern; /* Pattern */
+ mrb_bool raise_on_fail; /* TRUE for =>, FALSE for in */
+};
+
+/* Variable-sized for node */
+struct mrb_ast_for_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *var; /* Loop variable */
+ struct mrb_ast_node *iterable; /* Object to iterate over */
+ struct mrb_ast_node *body; /* Loop body */
+};
+
+/* Assignment Node Structures */
+
+/* Variable-sized assignment node */
+struct mrb_ast_asgn_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *lhs; /* Left-hand side (target) */
+ struct mrb_ast_node *rhs; /* Right-hand side (value) */
+};
+
+/* Variable-sized multiple assignment node */
+struct mrb_ast_masgn_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *pre; /* Pre-splat variables (cons list) */
+ struct mrb_ast_node *rest; /* Splat variable (single node or -1) */
+ struct mrb_ast_node *post; /* Post-splat variables (cons list) */
+ struct mrb_ast_node *rhs; /* Right-hand side (values) */
+};
+
+/* Variable-sized operator assignment node */
+struct mrb_ast_op_asgn_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *lhs; /* Left-hand side (target) */
+ mrb_sym op; /* Assignment operator (e.g., +=, -=, etc.) */
+ struct mrb_ast_node *rhs; /* Right-hand side (value) */
+};
+
+/* Expression Node Structures */
+
+/* Variable-sized AND node */
+struct mrb_ast_and_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *left; /* Left operand */
+ struct mrb_ast_node *right; /* Right operand */
+};
+
+/* Variable-sized OR node */
+struct mrb_ast_or_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *left; /* Left operand */
+ struct mrb_ast_node *right; /* Right operand */
+};
+
+/* Variable-sized RETURN node */
+struct mrb_ast_return_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *args; /* Return arguments (can be NULL) */
+};
+
+/* Variable-sized YIELD node */
+struct mrb_ast_yield_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *args; /* Yield arguments (can be NULL) */
+};
+
+/* Variable-sized SUPER node */
+struct mrb_ast_super_node {
+ struct mrb_ast_var_header header; /* 8 bytes */
+ struct mrb_ast_node *args; /* Super arguments (can be NULL) */
+};
+
+#define NODE_TYPE(n) ((enum node_type)(((struct mrb_ast_var_header*)(n))->node_type))
+
+/* Type-safe casting macros */
+#define var_header(n) ((struct mrb_ast_var_header*)(n))
+
+/* Common type casting macros used by parser and codegen */
+#define node_to_sym(x) ((mrb_sym)(intptr_t)(x))
+#define sym_to_node(x) ((node*)(intptr_t)(x))
+#define int_to_node(x) ((node*)(intptr_t)(x))
+#define node_to_int(x) ((int)(intptr_t)(x))
+#define node_to_type(x) ((enum node_type)(intptr_t)(x))
+#define node_to_char(x) ((char)(intptr_t)(x))
+
+/* Literal value node casting macros */
+#define sym_node(n) ((struct mrb_ast_sym_node*)(n))
+#define str_node(n) ((struct mrb_ast_str_node*)(n))
+#define int_node(n) ((struct mrb_ast_int_node*)(n))
+#define bigint_node(n) ((struct mrb_ast_bigint_node*)(n))
+#define var_node(n) ((struct mrb_ast_var_node*)(n))
+
+/* Expression and operation node casting macros */
+#define call_node(n) ((struct mrb_ast_call_node*)(n))
+#define array_node(n) ((struct mrb_ast_array_node*)(n))
+#define hash_node(n) ((struct mrb_ast_hash_node*)(n))
+
+/* Control flow and definition node casting macros */
+#define def_node(n) ((struct mrb_ast_def_node*)(n))
+#define class_node(n) ((struct mrb_ast_class_node*)(n))
+#define module_node(n) ((struct mrb_ast_module_node*)(n))
+#define sclass_node(n) ((struct mrb_ast_sclass_node*)(n))
+#define if_node(n) ((struct mrb_ast_if_node*)(n))
+#define while_node(n) ((struct mrb_ast_while_node*)(n))
+#define until_node(n) ((struct mrb_ast_until_node*)(n))
+#define case_node(n) ((struct mrb_ast_case_node*)(n))
+#define case_match_node(n) ((struct mrb_ast_case_match_node*)(n))
+#define in_node(n) ((struct mrb_ast_in_node*)(n))
+#define pat_value_node(n) ((struct mrb_ast_pat_value_node*)(n))
+#define pat_var_node(n) ((struct mrb_ast_pat_var_node*)(n))
+#define pat_pin_node(n) ((struct mrb_ast_pat_pin_node*)(n))
+#define pat_as_node(n) ((struct mrb_ast_pat_as_node*)(n))
+#define pat_alt_node(n) ((struct mrb_ast_pat_alt_node*)(n))
+#define pat_array_node(n) ((struct mrb_ast_pat_array_node*)(n))
+#define pat_find_node(n) ((struct mrb_ast_pat_find_node*)(n))
+#define pat_hash_node(n) ((struct mrb_ast_pat_hash_node*)(n))
+#define match_pat_node(n) ((struct mrb_ast_match_pat_node*)(n))
+#define for_node(n) ((struct mrb_ast_for_node*)(n))
+#define asgn_node(n) ((struct mrb_ast_asgn_node*)(n))
+#define masgn_node(n) ((struct mrb_ast_masgn_node*)(n))
+#define op_asgn_node(n) ((struct mrb_ast_op_asgn_node*)(n))
+#define and_node(n) ((struct mrb_ast_and_node*)(n))
+#define or_node(n) ((struct mrb_ast_or_node*)(n))
+#define return_node(n) ((struct mrb_ast_return_node*)(n))
+#define yield_node(n) ((struct mrb_ast_yield_node*)(n))
+#define super_node(n) ((struct mrb_ast_super_node*)(n))
+
+/* Variable-sized literal node structures */
+
+struct mrb_ast_dot2_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *left;
+ struct mrb_ast_node *right;
+};
+
+struct mrb_ast_dot3_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *left;
+ struct mrb_ast_node *right;
+};
+
+struct mrb_ast_float_node {
+ struct mrb_ast_var_header header;
+ const char *value;
+};
+
+/* Literal node casting macros */
+#define dot2_node(n) ((struct mrb_ast_dot2_node*)(n))
+#define dot3_node(n) ((struct mrb_ast_dot3_node*)(n))
+#define float_node(n) ((struct mrb_ast_float_node*)(n))
+
+/* Variable-sized simple node structures */
+struct mrb_ast_self_node {
+ struct mrb_ast_var_header header;
+};
+
+struct mrb_ast_nil_node {
+ struct mrb_ast_var_header header;
+};
+
+struct mrb_ast_true_node {
+ struct mrb_ast_var_header header;
+};
+
+struct mrb_ast_false_node {
+ struct mrb_ast_var_header header;
+};
+
+struct mrb_ast_const_node {
+ struct mrb_ast_var_header header;
+ mrb_sym symbol;
+};
+
+/* Simple node casting macros */
+#define self_node(n) ((struct mrb_ast_self_node*)(n))
+#define nil_node(n) ((struct mrb_ast_nil_node*)(n))
+#define true_node(n) ((struct mrb_ast_true_node*)(n))
+#define false_node(n) ((struct mrb_ast_false_node*)(n))
+#define const_node(n) ((struct mrb_ast_const_node*)(n))
+
+/* Variable-sized advanced node structures */
+struct mrb_ast_rescue_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *body;
+ struct mrb_ast_node *rescue_clauses;
+ struct mrb_ast_node *else_clause;
+};
+
+struct mrb_ast_block_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *locals;
+ struct mrb_ast_args *args;
+ struct mrb_ast_node *body;
+};
+
+/* Unified argument structure - eliminates args_tail_node allocation */
+struct mrb_ast_args {
+ /* Core argument lists (parser builds these naturally) */
+ struct mrb_ast_node *mandatory_args; /* Cons list of mandatory arguments */
+ struct mrb_ast_node *optional_args; /* Cons list of optional arguments */
+ struct mrb_ast_node *post_mandatory_args; /* Cons list of post-mandatory arguments */
+ struct mrb_ast_node *keyword_args; /* Cons list of keyword arguments */
+
+ /* Special arguments (directly embedded) */
+ mrb_sym rest_arg; /* Rest argument symbol (0 = none) */
+ mrb_sym kwrest_arg; /* Keyword rest argument (0 = none) */
+ mrb_sym block_arg; /* Block argument symbol (0 = none) */
+};
+
+/* Call arguments structure - replaces cons-based new_callargs */
+struct mrb_ast_callargs {
+ struct mrb_ast_node *regular_args; /* Cons list of regular arguments (preserves splat compatibility) */
+ struct mrb_ast_node *keyword_args; /* Keyword arguments hash node */
+ struct mrb_ast_node *block_arg; /* Block argument node */
+};
+
+/* Advanced node casting macros */
+#define rescue_node(n) ((struct mrb_ast_rescue_node*)(n))
+#define block_node(n) ((struct mrb_ast_block_node*)(n))
+#define callargs_node(n) ((struct mrb_ast_callargs*)(n))
+
+/* Control flow statement nodes */
+struct mrb_ast_break_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *value;
+};
+
+struct mrb_ast_next_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *value;
+};
+
+struct mrb_ast_redo_node {
+ struct mrb_ast_var_header header;
+};
+
+struct mrb_ast_retry_node {
+ struct mrb_ast_var_header header;
+};
+
+#define break_node(n) ((struct mrb_ast_break_node*)(n))
+#define next_node(n) ((struct mrb_ast_next_node*)(n))
+#define redo_node(n) ((struct mrb_ast_redo_node*)(n))
+#define retry_node(n) ((struct mrb_ast_retry_node*)(n))
+
+/* String and regex variant nodes */
+struct mrb_ast_xstr_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *list;
+};
+
+struct mrb_ast_regx_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *list;
+ const char *flags;
+ const char *encoding;
+};
+
+struct mrb_ast_heredoc_node {
+ struct mrb_ast_var_header header;
+ struct mrb_parser_heredoc_info info;
+};
+
+#define xstr_node(n) ((struct mrb_ast_xstr_node*)(n))
+#define regx_node(n) ((struct mrb_ast_regx_node*)(n))
+#define heredoc_node(n) ((struct mrb_ast_heredoc_node*)(n))
+#define dsym_node(n) ((struct mrb_ast_str_node*)(n))
+
+/* Reference and special variable nodes */
+struct mrb_ast_nth_ref_node {
+ struct mrb_ast_var_header header;
+ int nth;
+};
+
+struct mrb_ast_back_ref_node {
+ struct mrb_ast_var_header header;
+ int type;
+};
+
+struct mrb_ast_nvar_node {
+ struct mrb_ast_var_header header;
+ int num;
+};
+
+struct mrb_ast_dvar_node {
+ struct mrb_ast_var_header header;
+ mrb_sym name;
+};
+
+#define nth_ref_node(n) ((struct mrb_ast_nth_ref_node*)(n))
+#define back_ref_node(n) ((struct mrb_ast_back_ref_node*)(n))
+#define nvar_node(n) ((struct mrb_ast_nvar_node*)(n))
+#define dvar_node(n) ((struct mrb_ast_dvar_node*)(n))
+
+/* Unary operator and scope resolution nodes */
+struct mrb_ast_not_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *operand;
+};
+
+struct mrb_ast_negate_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *operand;
+};
+
+struct mrb_ast_colon2_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *base;
+ mrb_sym name;
+};
+
+struct mrb_ast_colon3_node {
+ struct mrb_ast_var_header header;
+ mrb_sym name;
+};
+
+struct mrb_ast_defined_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *expr;
+};
+
+#define not_node(n) ((struct mrb_ast_not_node*)(n))
+#define negate_node(n) ((struct mrb_ast_negate_node*)(n))
+#define colon2_node(n) ((struct mrb_ast_colon2_node*)(n))
+#define colon3_node(n) ((struct mrb_ast_colon3_node*)(n))
+#define defined_node(n) ((struct mrb_ast_defined_node*)(n))
+
+/* Lambda nodes */
+struct mrb_ast_lambda_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *locals;
+ struct mrb_ast_args *args;
+ struct mrb_ast_node *body;
+};
+
+/* Array literal variant nodes */
+struct mrb_ast_zarray_node {
+ struct mrb_ast_var_header header;
+};
+
+struct mrb_ast_words_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *args;
+};
+
+struct mrb_ast_symbols_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *args;
+};
+
+/* Argument and parameter nodes */
+
+struct mrb_ast_splat_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *value;
+};
+
+struct mrb_ast_block_arg_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *value;
+};
+
+/* Structural and block nodes */
+
+struct mrb_ast_scope_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *locals;
+ struct mrb_ast_node *body;
+};
+
+struct mrb_ast_begin_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *body;
+};
+
+struct mrb_ast_ensure_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *body;
+ struct mrb_ast_node *ensure_clause;
+};
+
+struct mrb_ast_stmts_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *stmts; /* Cons-list of statements */
+};
+
+struct mrb_ast_iter_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *vars;
+ struct mrb_ast_node *body;
+};
+
+/* Declaration nodes */
+
+struct mrb_ast_alias_node {
+ struct mrb_ast_var_header header;
+ mrb_sym new_name;
+ mrb_sym old_name;
+};
+
+struct mrb_ast_undef_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *syms;
+};
+
+struct mrb_ast_postexe_node {
+ struct mrb_ast_var_header header;
+ struct mrb_ast_node *body;
+};
+
+#define zsuper_node(n) ((struct mrb_ast_super_node*)(n))
+#define lambda_node(n) ((struct mrb_ast_lambda_node*)(n))
+#define zarray_node(n) ((struct mrb_ast_zarray_node*)(n))
+#define words_node(n) ((struct mrb_ast_words_node*)(n))
+#define symbols_node(n) ((struct mrb_ast_symbols_node*)(n))
+#define splat_node(n) ((struct mrb_ast_splat_node*)(n))
+#define block_arg_node(n) ((struct mrb_ast_block_arg_node*)(n))
+#define scope_node(n) ((struct mrb_ast_scope_node*)(n))
+#define begin_node(n) ((struct mrb_ast_begin_node*)(n))
+#define ensure_node(n) ((struct mrb_ast_ensure_node*)(n))
+#define stmts_node(n) ((struct mrb_ast_stmts_node*)(n))
+#define iter_node(n) ((struct mrb_ast_iter_node*)(n))
+#define alias_node(n) ((struct mrb_ast_alias_node*)(n))
+#define undef_node(n) ((struct mrb_ast_undef_node*)(n))
+#define postexe_node(n) ((struct mrb_ast_postexe_node*)(n))
+#define sdef_node(n) ((struct mrb_ast_sdef_node*)(n))
+
#endif /* MRUBY_COMPILER_NODE_H */