# Mapping When considering the previous CRuby parser versus prism, this document should be helpful to understand how various concepts are mapped. ## Nodes The following table shows how the various CRuby nodes are mapped to prism nodes. | CRuby | prism | | --- | --- | | `NODE_SCOPE` | | | `NODE_BLOCK` | | | `NODE_IF` | `PM_IF_NODE` | | `NODE_UNLESS` | `PM_UNLESS_NODE` | | `NODE_CASE` | `PM_CASE_NODE` | | `NODE_CASE2` | `PM_CASE_NODE` (with a null predicate) | | `NODE_CASE3` | | | `NODE_WHEN` | `PM_WHEN_NODE` | | `NODE_IN` | `PM_IN_NODE` | | `NODE_WHILE` | `PM_WHILE_NODE` | | `NODE_UNTIL` | `PM_UNTIL_NODE` | | `NODE_ITER` | `PM_CALL_NODE` (with a non-null block) | | `NODE_FOR` | `PM_FOR_NODE` | | `NODE_FOR_MASGN` | `PM_FOR_NODE` (with a multi-write node as the index) | | `NODE_BREAK` | `PM_BREAK_NODE` | | `NODE_NEXT` | `PM_NEXT_NODE` | | `NODE_REDO` | `PM_REDO_NODE` | | `NODE_RETRY` | `PM_RETRY_NODE` | | `NODE_BEGIN` | `PM_BEGIN_NODE` | | `NODE_RESCUE` | `PM_RESCUE_NODE` | | `NODE_RESBODY` | | | `NODE_ENSURE` | `PM_ENSURE_NODE` | | `NODE_AND` | `PM_AND_NODE` | | `NODE_OR` | `PM_OR_NODE` | | `NODE_MASGN` | `PM_MULTI_WRITE_NODE` | | `NODE_LASGN` | `PM_LOCAL_VARIABLE_WRITE_NODE` | | `NODE_DASGN` | `PM_LOCAL_VARIABLE_WRITE_NODE` | | `NODE_GASGN` | `PM_GLOBAL_VARIABLE_WRITE_NODE` | | `NODE_IASGN` | `PM_INSTANCE_VARIABLE_WRITE_NODE` | | `NODE_CDECL` | `PM_CONSTANT_PATH_WRITE_NODE` | | `NODE_CVASGN` | `PM_CLASS_VARIABLE_WRITE_NODE` | | `NODE_OP_ASGN1` | | | `NODE_OP_ASGN2` | | | `NODE_OP_ASGN_AND` | `PM_OPERATOR_AND_ASSIGNMENT_NODE` | | `NODE_OP_ASGN_OR` | `PM_OPERATOR_OR_ASSIGNMENT_NODE` | | `NODE_OP_CDECL` | | | `NODE_CALL` | `PM_CALL_NODE` | | `NODE_OPCALL` | `PM_CALL_NODE` (with an operator as the method) | | `NODE_FCALL` | `PM_CALL_NODE` (with a null receiver and parentheses) | | `NODE_VCALL` | `PM_CALL_NODE` (with a null receiver and parentheses or arguments) | | `NODE_QCALL` | `PM_CALL_NODE` (with a &. operator) | | `NODE_SUPER` | `PM_SUPER_NODE` | | `NODE_ZSUPER` | `PM_FORWARDING_SUPER_NODE` | | `NODE_LIST` | `PM_ARRAY_NODE` | | `NODE_ZLIST` | `PM_ARRAY_NODE` (with no child elements) | | `NODE_VALUES` | `PM_ARGUMENTS_NODE` | | `NODE_HASH` | `PM_HASH_NODE` | | `NODE_RETURN` | `PM_RETURN_NODE` | | `NODE_YIELD` | `PM_YIELD_NODE` | | `NODE_LVAR` | `PM_LOCAL_VARIABLE_READ_NODE` | | `NODE_DVAR` | `PM_LOCAL_VARIABLE_READ_NODE` | | `NODE_GVAR` | `PM_GLOBAL_VARIABLE_READ_NODE` | | `NODE_IVAR` | `PM_INSTANCE_VARIABLE_READ_NODE` | | `NODE_CONST` | `PM_CONSTANT_PATH_READ_NODE` | | `NODE_CVAR` | `PM_CLASS_VARIABLE_READ_NODE` | | `NODE_NTH_REF` | `PM_NUMBERED_REFERENCE_READ_NODE` | | `NODE_BACK_REF` | `PM_BACK_REFERENCE_READ_NODE` | | `NODE_MATCH` | | | `NODE_MATCH2` | `PM_CALL_NODE` (with regular expression as receiver) | | `NODE_MATCH3` | `PM_CALL_NODE` (with regular expression as only argument) | | `NODE_LIT` | | | `NODE_STR` | `PM_STRING_NODE` | | `NODE_DSTR` | `PM_INTERPOLATED_STRING_NODE` | | `NODE_XSTR` | `PM_X_STRING_NODE` | | `NODE_DXSTR` | `PM_INTERPOLATED_X_STRING_NODE` | | `NODE_EVSTR` | `PM_STRING_INTERPOLATED_NODE` | | `NODE_DREGX` | `PM_INTERPOLATED_REGULAR_EXPRESSION_NODE` | | `NODE_ONCE` | | | `NODE_ARGS` | `PM_PARAMETERS_NODE` | | `NODE_ARGS_AUX` | | | `NODE_OPT_ARG` | `PM_OPTIONAL_PARAMETER_NODE` | | `NODE_KW_ARG` | `PM_KEYWORD_PARAMETER_NODE` | | `NODE_POSTARG` | `PM_REQUIRED_PARAMETER_NODE` | | `NODE_ARGSCAT` | | | `NODE_ARGSPUSH` | | | `NODE_SPLAT` | `PM_SPLAT_NODE` | | `NODE_BLOCK_PASS` | `PM_BLOCK_ARGUMENT_NODE` | | `NODE_DEFN` | `PM_DEF_NODE` (with a null receiver) | | `NODE_DEFS` | `PM_DEF_NODE` (with a non-null receiver) | | `NODE_ALIAS` | `PM_ALIAS_NODE` | | `NODE_VALIAS` | `PM_ALIAS_NODE` (with a global variable first argument) | | `NODE_UNDEF` | `PM_UNDEF_NODE` | | `NODE_CLASS` | `PM_CLASS_NODE` | | `NODE_MODULE` | `PM_MODULE_NODE` | | `NODE_SCLASS` | `PM_S_CLASS_NODE` | | `NODE_COLON2` | `PM_CONSTANT_PATH_NODE` | | `NODE_COLON3` | `PM_CONSTANT_PATH_NODE` (with a null receiver) | | `NODE_DOT2` | `PM_RANGE_NODE` (with a .. operator) | | `NODE_DOT3` | `PM_RANGE_NODE` (with a ... operator) | | `NODE_FLIP2` | `PM_RANGE_NODE` (with a .. operator) | | `NODE_FLIP3` | `PM_RANGE_NODE` (with a ... operator) | | `NODE_SELF` | `PM_SELF_NODE` | | `NODE_NIL` | `PM_NIL_NODE` | | `NODE_TRUE` | `PM_TRUE_NODE` | | `NODE_FALSE` | `PM_FALSE_NODE` | | `NODE_ERRINFO` | | | `NODE_DEFINED` | `PM_DEFINED_NODE` | | `NODE_POSTEXE` | `PM_POST_EXECUTION_NODE` | | `NODE_DSYM` | `PM_INTERPOLATED_SYMBOL_NODE` | | `NODE_ATTRASGN` | `PM_CALL_NODE` (with a message that ends with =) | | `NODE_LAMBDA` | `PM_LAMBDA_NODE` | | `NODE_ARYPTN` | `PM_ARRAY_PATTERN_NODE` | | `NODE_HSHPTN` | `PM_HASH_PATTERN_NODE` | | `NODE_FNDPTN` | `PM_FIND_PATTERN_NODE` | | `NODE_ERROR` | `PM_MISSING_NODE` | | `NODE_LAST` | | ```