Mapping

March 21, 2026 ยท View on GitHub

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.

CRubyprism
NODE_SCOPE
NODE_BLOCK
NODE_IFPM_IF_NODE
NODE_UNLESSPM_UNLESS_NODE
NODE_CASEPM_CASE_NODE
NODE_CASE2PM_CASE_NODE (with a null predicate)
NODE_CASE3
NODE_WHENPM_WHEN_NODE
NODE_INPM_IN_NODE
NODE_WHILEPM_WHILE_NODE
NODE_UNTILPM_UNTIL_NODE
NODE_ITERPM_CALL_NODE (with a non-null block)
NODE_FORPM_FOR_NODE
NODE_FOR_MASGNPM_FOR_NODE (with a multi-write node as the index)
NODE_BREAKPM_BREAK_NODE
NODE_NEXTPM_NEXT_NODE
NODE_REDOPM_REDO_NODE
NODE_RETRYPM_RETRY_NODE
NODE_BEGINPM_BEGIN_NODE
NODE_RESCUEPM_RESCUE_NODE
NODE_RESBODY
NODE_ENSUREPM_ENSURE_NODE
NODE_ANDPM_AND_NODE
NODE_ORPM_OR_NODE
NODE_MASGNPM_MULTI_WRITE_NODE
NODE_LASGNPM_LOCAL_VARIABLE_WRITE_NODE
NODE_DASGNPM_LOCAL_VARIABLE_WRITE_NODE
NODE_GASGNPM_GLOBAL_VARIABLE_WRITE_NODE
NODE_IASGNPM_INSTANCE_VARIABLE_WRITE_NODE
NODE_CDECLPM_CONSTANT_PATH_WRITE_NODE
NODE_CVASGNPM_CLASS_VARIABLE_WRITE_NODE
NODE_OP_ASGN1
NODE_OP_ASGN2
NODE_OP_ASGN_ANDPM_OPERATOR_AND_ASSIGNMENT_NODE
NODE_OP_ASGN_ORPM_OPERATOR_OR_ASSIGNMENT_NODE
NODE_OP_CDECL
NODE_CALLPM_CALL_NODE
NODE_OPCALLPM_CALL_NODE (with an operator as the method)
NODE_FCALLPM_CALL_NODE (with a null receiver and parentheses)
NODE_VCALLPM_CALL_NODE (with a null receiver and parentheses or arguments)
NODE_QCALLPM_CALL_NODE (with a &. operator)
NODE_SUPERPM_SUPER_NODE
NODE_ZSUPERPM_FORWARDING_SUPER_NODE
NODE_LISTPM_ARRAY_NODE
NODE_ZLISTPM_ARRAY_NODE (with no child elements)
NODE_VALUESPM_ARGUMENTS_NODE
NODE_HASHPM_HASH_NODE
NODE_RETURNPM_RETURN_NODE
NODE_YIELDPM_YIELD_NODE
NODE_LVARPM_LOCAL_VARIABLE_READ_NODE
NODE_DVARPM_LOCAL_VARIABLE_READ_NODE
NODE_GVARPM_GLOBAL_VARIABLE_READ_NODE
NODE_IVARPM_INSTANCE_VARIABLE_READ_NODE
NODE_CONSTPM_CONSTANT_PATH_READ_NODE
NODE_CVARPM_CLASS_VARIABLE_READ_NODE
NODE_NTH_REFPM_NUMBERED_REFERENCE_READ_NODE
NODE_BACK_REFPM_BACK_REFERENCE_READ_NODE
NODE_MATCH
NODE_MATCH2PM_CALL_NODE (with regular expression as receiver)
NODE_MATCH3PM_CALL_NODE (with regular expression as only argument)
NODE_LIT
NODE_STRPM_STRING_NODE
NODE_DSTRPM_INTERPOLATED_STRING_NODE
NODE_XSTRPM_X_STRING_NODE
NODE_DXSTRPM_INTERPOLATED_X_STRING_NODE
NODE_EVSTRPM_STRING_INTERPOLATED_NODE
NODE_DREGXPM_INTERPOLATED_REGULAR_EXPRESSION_NODE
NODE_ONCE
NODE_ARGSPM_PARAMETERS_NODE
NODE_ARGS_AUX
NODE_OPT_ARGPM_OPTIONAL_PARAMETER_NODE
NODE_KW_ARGPM_KEYWORD_PARAMETER_NODE
NODE_POSTARGPM_REQUIRED_PARAMETER_NODE
NODE_ARGSCAT
NODE_ARGSPUSH
NODE_SPLATPM_SPLAT_NODE
NODE_BLOCK_PASSPM_BLOCK_ARGUMENT_NODE
NODE_DEFNPM_DEF_NODE (with a null receiver)
NODE_DEFSPM_DEF_NODE (with a non-null receiver)
NODE_ALIASPM_ALIAS_NODE
NODE_VALIASPM_ALIAS_NODE (with a global variable first argument)
NODE_UNDEFPM_UNDEF_NODE
NODE_CLASSPM_CLASS_NODE
NODE_MODULEPM_MODULE_NODE
NODE_SCLASSPM_S_CLASS_NODE
NODE_COLON2PM_CONSTANT_PATH_NODE
NODE_COLON3PM_CONSTANT_PATH_NODE (with a null receiver)
NODE_DOT2PM_RANGE_NODE (with a .. operator)
NODE_DOT3PM_RANGE_NODE (with a ... operator)
NODE_FLIP2PM_RANGE_NODE (with a .. operator)
NODE_FLIP3PM_RANGE_NODE (with a ... operator)
NODE_SELFPM_SELF_NODE
NODE_NILPM_NIL_NODE
NODE_TRUEPM_TRUE_NODE
NODE_FALSEPM_FALSE_NODE
NODE_ERRINFO
NODE_DEFINEDPM_DEFINED_NODE
NODE_POSTEXEPM_POST_EXECUTION_NODE
NODE_DSYMPM_INTERPOLATED_SYMBOL_NODE
NODE_ATTRASGNPM_CALL_NODE (with a message that ends with =)
NODE_LAMBDAPM_LAMBDA_NODE
NODE_ARYPTNPM_ARRAY_PATTERN_NODE
NODE_HSHPTNPM_HASH_PATTERN_NODE
NODE_FNDPTNPM_FIND_PATTERN_NODE
NODE_ERRORPM_ERROR_RECOVERY_NODE
NODE_LAST