#ifndef RUBY_RUBYPARSER_H #define RUBY_RUBYPARSER_H 1 /* * This is a header file for librubyparser interface */ #include /* for va_list */ #ifdef UNIVERSAL_PARSER #define rb_encoding void #define OnigCodePoint unsigned int #include "parser_st.h" #ifndef RUBY_RUBY_H #include "parser_value.h" #endif #else #include "ruby/encoding.h" #endif /* * AST Node */ enum node_type { NODE_SCOPE, NODE_BLOCK, NODE_IF, NODE_UNLESS, NODE_CASE, NODE_CASE2, NODE_CASE3, NODE_WHEN, NODE_IN, NODE_WHILE, NODE_UNTIL, NODE_ITER, NODE_FOR, NODE_FOR_MASGN, NODE_BREAK, NODE_NEXT, NODE_REDO, NODE_RETRY, NODE_BEGIN, NODE_RESCUE, NODE_RESBODY, NODE_ENSURE, NODE_AND, NODE_OR, NODE_MASGN, NODE_LASGN, NODE_DASGN, NODE_GASGN, NODE_IASGN, NODE_CDECL, NODE_CVASGN, NODE_OP_ASGN1, NODE_OP_ASGN2, NODE_OP_ASGN_AND, NODE_OP_ASGN_OR, NODE_OP_CDECL, NODE_CALL, NODE_OPCALL, NODE_FCALL, NODE_VCALL, NODE_QCALL, NODE_SUPER, NODE_ZSUPER, NODE_LIST, NODE_ZLIST, NODE_VALUES, NODE_HASH, NODE_RETURN, NODE_YIELD, NODE_LVAR, NODE_DVAR, NODE_GVAR, NODE_IVAR, NODE_CONST, NODE_CVAR, NODE_NTH_REF, NODE_BACK_REF, NODE_MATCH, NODE_MATCH2, NODE_MATCH3, NODE_LIT, NODE_STR, NODE_DSTR, NODE_XSTR, NODE_DXSTR, NODE_EVSTR, NODE_DREGX, NODE_ONCE, NODE_ARGS, NODE_ARGS_AUX, NODE_OPT_ARG, NODE_KW_ARG, NODE_POSTARG, NODE_ARGSCAT, NODE_ARGSPUSH, NODE_SPLAT, NODE_BLOCK_PASS, NODE_DEFN, NODE_DEFS, NODE_ALIAS, NODE_VALIAS, NODE_UNDEF, NODE_CLASS, NODE_MODULE, NODE_SCLASS, NODE_COLON2, NODE_COLON3, NODE_DOT2, NODE_DOT3, NODE_FLIP2, NODE_FLIP3, NODE_SELF, NODE_NIL, NODE_TRUE, NODE_FALSE, NODE_ERRINFO, NODE_DEFINED, NODE_POSTEXE, NODE_DSYM, NODE_ATTRASGN, NODE_LAMBDA, NODE_ARYPTN, NODE_HSHPTN, NODE_FNDPTN, NODE_ERROR, NODE_LAST }; #define nd_head u1.node #define nd_alen u2.argc #define nd_next u3.node #define nd_cond u1.node #define nd_body u2.node #define nd_else u3.node #define nd_resq u2.node #define nd_ensr u3.node #define nd_1st u1.node #define nd_2nd u2.node #define nd_stts u1.node #define nd_vid u1.id #define nd_var u1.node #define nd_iter u3.node #define nd_value u2.node #define nd_aid u3.id #define nd_lit u1.value #define nd_recv u1.node #define nd_mid u2.id #define nd_args u3.node #define nd_ainfo u3.args #define nd_defn u3.node #define nd_cpath u1.node #define nd_super u3.node #define nd_beg u1.node #define nd_end u2.node #define nd_state u3.state #define nd_nth u2.argc #define nd_alias u1.id #define nd_orig u2.id #define nd_undef u2.node #define nd_brace u2.argc #define nd_pconst u1.node #define nd_pkwargs u2.node #define nd_pkwrestarg u3.node #define nd_apinfo u3.apinfo #define nd_fpinfo u3.fpinfo // for NODE_SCOPE #define nd_tbl u1.tbl // for NODE_ARGS_AUX #define nd_pid u1.id #define nd_plen u2.argc #define nd_cflag u2.id // for ripper #define nd_cval u3.value #define nd_rval u2.value #define nd_tag u1.id #ifndef FLEX_ARY_LEN /* From internal/compilers.h */ /* A macro for defining a flexible array, like: VALUE ary[FLEX_ARY_LEN]; */ #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) # define FLEX_ARY_LEN /* VALUE ary[]; */ #elif defined(__GNUC__) && !defined(__STRICT_ANSI__) # define FLEX_ARY_LEN 0 /* VALUE ary[0]; */ #else # define FLEX_ARY_LEN 1 /* VALUE ary[1]; */ #endif #endif typedef struct rb_ast_id_table { int size; ID ids[FLEX_ARY_LEN]; } rb_ast_id_table_t; typedef struct rb_code_position_struct { int lineno; int column; } rb_code_position_t; typedef struct rb_code_location_struct { rb_code_position_t beg_pos; rb_code_position_t end_pos; } rb_code_location_t; typedef struct RNode { VALUE flags; union { struct RNode *node; ID id; VALUE value; rb_ast_id_table_t *tbl; } u1; union { struct RNode *node; ID id; long argc; VALUE value; } u2; union { struct RNode *node; ID id; long state; struct rb_args_info *args; struct rb_ary_pattern_info *apinfo; struct rb_fnd_pattern_info *fpinfo; VALUE value; } u3; rb_code_location_t nd_loc; int node_id; } NODE; /* FL : 0..4: T_TYPES, 5: KEEP_WB, 6: PROMOTED, 7: FINALIZE, 8: UNUSED, 9: UNUSED, 10: EXIVAR, 11: FREEZE */ /* NODE_FL: 0..4: T_TYPES, 5: KEEP_WB, 6: PROMOTED, 7: NODE_FL_NEWLINE, * 8..14: nd_type, * 15..: nd_line */ #define NODE_FL_NEWLINE (((VALUE)1)<<7) #define NODE_TYPESHIFT 8 #define NODE_TYPEMASK (((VALUE)0x7f)<flags & NODE_TYPEMASK)>>NODE_TYPESHIFT)) #define nd_set_type(n,t) \ rb_node_set_type(n, t) #define nd_init_type(n,t) \ (n)->flags=(((n)->flags&~NODE_TYPEMASK)|((((unsigned long)(t))<