digraph { /* Key: * * blue edges indicate consuming a token * green edges indicate non-consuming catchall transitions * * 3dbox nodes indicate a reduction step * red edges indicate non-consuming GOTO transitions * * filled nodes indicate pushing a state transition to the stack * magenta edges represent popping a state from the stack and transitioning to it */ graph [rankdir=LR]; node [shape=rectangle]; edge [color=blue]; arg_val [style=filled]; expr_stmt [style=filled]; expr_rvalue [style=filled]; slash [style=filled]; initial [shape="circle"]; accept [shape="doublecircle"]; initial -> import [label="discard\n\"import\""]; initial -> let [label="discard\n\"let\""]; initial -> expr_stmt [label="*" color=green]; import -> import_end [label="shift\nIDENTIFIER"]; import_end -> reduce_import [label="discard\n\";\""]; let -> assign [label="shift\nIDENTIFIER"]; assign -> expr_rvalue [label="discard\n\"=\""]; reduce_import -> reduce_stmt [color=red]; reduce_import [label="reduce\nimport" shape=box3d]; // ref ref_component -> reduce_module [label="discard\n\"::\""]; ref_component -> reduce_object [label="discard\n\".\""]; ref_component -> reduce_ref_call [label="discard\n\"(\""]; ref_component -> reduce_ref_naked [label="*" color=green]; reduce_object -> ref_object [color=red]; reduce_object [label="reduce\nobject" shape=box3d]; reduce_ref_call -> expr_arg [color=red]; reduce_ref_call [label="reduce\nref\nnew arglist" shape=box3d]; reduce_module -> ref_module [color=red]; reduce_module [label="reduce\nmodule" shape=box3d]; ref_module -> ref_component [label="shift\nIDENTIFIER"]; ref_object -> ref_obj_end [label="shift\nIDENTIFIER"]; ref_obj_end -> reduce_object [label="shift\n\".\""]; ref_obj_end -> reduce_ref_call [label="shift\n\"(\""]; ref_obj_end -> reduce_ref_naked [label="*" color=green]; arg_next -> expr_arg [label="discard\n\",\""]; arg_next -> reduce_call [label="discard\n\")\""]; expr_arg -> arg_name [label="shift\nIDENTIFIER"]; expr_arg -> arg_val [label="*" color=green]; arg_name -> arg_val [label="discard\n\":\""]; arg_name -> ref_component [label="*" color=green]; arg_val -> reduce_literal_expr [label="shift\nSTRING"]; arg_val -> reduce_literal_expr [label="shift\nINTEGER"]; arg_val -> reduce_literal_expr [label="shift\nBOOL"]; arg_val -> ipv4 [label="shift\nIPV4"]; arg_val -> ref_component [label="shift\nPathBuilder\nIDENTIFIER"]; arg_val -> reduce_call [label="discard\n\")\""]; expr_stmt -> expr [color=red]; expr_rvalue -> expr [color=red]; expr -> reduce_literal_expr [label="shift\nSTRING"]; expr -> reduce_literal_expr [label="shift\nINTEGER"]; expr -> reduce_literal_expr [label="shift\nBOOL"]; expr -> ipv4 [label="shift\nIPV4"]; expr -> ref_component [label="shift\nPathBuilder\nIDENTIFIER"]; reduce_arg -> arg_next [color=red]; reduce_arg [label="reduce\narg" shape=box3d]; reduce_bop -> reduce_expr [color=red]; reduce_bop [label="reduce\nbop" shape=box3d]; reduce_literal_expr -> slash [color=red]; reduce_literal_expr [label="reduce\nliteral_expr" shape=box3d]; reduce_ref_naked -> reduce_ref_expr [color=red]; reduce_ref_naked [label="reduce\nref" shape=box3d]; reduce_ref_expr -> slash [color=red]; reduce_ref_expr [label="reduce\nref_expr" shape=box3d]; reduce_call_expr -> slash [color=red]; reduce_call_expr [label="reduce\ncall_expr" shape=box3d]; slash -> expr [label="shift\n\"/\""]; slash -> reduce_expr [label="*" color=green]; reduce_expr -> reduce_arg [color=magenta]; reduce_expr -> reduce_bop [color=magenta]; reduce_expr -> expr_stmt_end [color=magenta]; reduce_expr -> assign_stmt_end [color=magenta]; reduce_expr [label="reduce\nexpr" shape=box3d]; ipv4 -> ipv4_colon [label="discard\n\":\""]; ipv4 -> reduce_literal_expr [label="*" color=green]; ipv4_colon -> reduce_sockaddr [label="shift\nINTEGER"]; reduce_sockaddr -> reduce_literal_expr [color=red]; reduce_sockaddr [label="reduce\nsockaddr" shape=box3d]; reduce_call -> reduce_call_expr [color=red]; reduce_call [label="reduce\ncall" shape=box3d]; expr_stmt_end -> reduce_expr_stmt [label="shift\n\";\""]; assign_stmt_end -> reduce_assign [label="shift\n\";\""]; reduce_assign -> reduce_assign_stmt [color=red]; reduce_assign [label="reduce\nassign" shape=box3d]; reduce_expr_stmt -> reduce_stmt [color=red]; reduce_expr_stmt [label="reduce\nexpr_stmt" shape=box3d]; reduce_assign_stmt -> reduce_stmt [color=red]; reduce_assign_stmt [label="reduce\nassign_stmt" shape=box3d]; reduce_stmt -> accept [color=red]; reduce_stmt [label="reduce\nstmt" shape=box3d]; }