鹿児島Ruby会議02
ԘҪඒ࡙ [email protected].BS ࣛࣇౡ3VCZձٞͨͷ͍͠3VCZͷߏจղੳπΞʔ
View Slide
ࣗݾհ(JU)VC!TIJPJNN[email protected]גࣜձࣾΤεɾΤϜɾΤε'VLVPLBSCग़"TBLVTBSCҭͪࡀ͔Βࡀ·ͰࣛࣇౡʹॅΜͰ͍·ͨ͜͠ͷ͋ͨΓࣾձ՝ʹऔΓΈ͍ͨ3VCZେ͖ΤϯδχΞ͕ηΧϯυΩϟϦΞʹΤεɾΤϜɾΤεΛબΜͩཧ༝IUUQTUFDICNTNTDPKQFOUSZ
ࣛࣇౡ3VCZձٞͷςʔϚͱ͍͏͜ͱͰɺ࠷ۙݸਓతʹڵຯ͕͕ͬͨ3VCZͷଆͷੈքͷ͓Λ͍ͨ͠ͱࢥ͍·͢IUUQTLSVCZDPNLBHPTIJNBSVCZLBJHJBCPVU3VCZͰ͕Δੈքɺ3VCZͰ͡ΊΑ͏
ͱ͍͑ʮ3VCZͷଆͷੈքʯͱ͍ͬͯɺ࣮ࡍʹͱͯେͰ͍ΖΜͳΓޱ͕͋Γ·͢Ͷ
ʮ3VCZͷଆͷੈքʯࠓճͦͷதͰɹ3VCZ .3*͕ɹͲΜͳ;͏ʹίʔυΛ࣮ߦ͍ͯ͠Δͷ͔ͷҰ෦Ͱ͋ΔߏจղੳʹεϙοτϥΠτΛͯͯΈ͍ͨͱࢥ͍·͢
ʮ3VCZͷଆͷੈքʯ·ͣ3VCZ͕ίʔυΛ࣮ߦ͢Δ·Ͱʹ3VCZ .3*ͷଆͰͲΜͳ͜ͱ͕ى͍ͬͯ͜Δͷ͔ͦͷશମ૾ΛோΊͯΈ͍ͨͱࢥ͍·͢
3VCZ͕ίʔυΛ࣮ߦ͢Δ·ͰͷྲྀΕιʔείʔυ 1 + 2
3VCZ͕ίʔυΛ࣮ߦ͢Δ·ͰͷྲྀΕιʔείʔυ 1 + 2࣮ߦ
3VCZ͕ίʔυΛ࣮ߦ͢Δ·ͰͷྲྀΕιʔείʔυΛҙຯతʹղऍ͢ΔॲཧιʔείʔυΛ୯ޠ୯ҐʹΓग़͢ॲཧߏจղੳιʔείʔυࣈ۟ղੳ1 + 2
3VCZ͕ίʔυΛ࣮ߦ͢Δ·ͰͷྲྀΕιʔείʔυΛҙຯతʹղऍͨ͠ߏͷσʔλߏจղੳιʔείʔυࣈ۟ղੳ1 + 2([email protected]:0-1:5([email protected]:0-1:1 1):+([email protected]:4-1:5([email protected]:4-1:5 2) nil)))ߏจ
3VCZ͕ίʔυΛ࣮ߦ͢Δ·ͰͷྲྀΕߏจղੳίϯύΠϧιʔείʔυࣈ۟ղੳ1 + 2([email protected]:0-1:5([email protected]:0-1:1 1):+([email protected]:4-1:5([email protected]:4-1:5 2) nil)))ߏจ
3VCZ͕ίʔυΛ࣮ߦ͢Δ·ͰͷྲྀΕϓϩάϥϜΛ࣮ࡍʹ࣮ߦ͢Δ໋ྩྻߏจղੳίϯύΠϧιʔείʔυ:"37όΠτίʔυࣈ۟ղੳ1 + 2== disasm: #@-e:1 (1,0)-(1,5)> (catch: false)0000 putobject 1 ( 1)[Li]0002 putobject 20004 send , nil0007 leave([email protected]:0-1:5([email protected]:0-1:1 1):+([email protected]:4-1:5([email protected]:4-1:5 2) nil)))ߏจ
3VCZ͕ίʔυΛ࣮ߦ͢Δ·ͰͷྲྀΕߏจղੳίϯύΠϧιʔείʔυ:"37όΠτίʔυࣈ۟ղੳ:"37্Ͱ࣮ߦ1 + 2== disasm: #@-e:1 (1,0)-(1,5)> (catch: false)0000 putobject 1 ( 1)[Li]0002 putobject 20004 send , nil0007 leave([email protected]:0-1:5([email protected]:0-1:1 1):+([email protected]:4-1:5([email protected]:4-1:5 2) nil)))ߏจ
ߏจղੳίϯύΠϧιʔείʔυ:"37όΠτίʔυࣈ۟ղੳ:"37্Ͱ࣮ߦ࣮ߦ݁Ռ > 31 + 23VCZ͕ίʔυΛ࣮ߦ͢Δ·ͰͷྲྀΕ== disasm: #@-e:1 (1,0)-(1,5)> (catch: false)0000 putobject 1 ( 1)[Li]0002 putobject 20004 send , nil0007 leave([email protected]:0-1:5([email protected]:0-1:1 1):+([email protected]:4-1:5([email protected]:4-1:5 2) nil)))ߏจ
ຊൃදͰͷείʔϓ3VCZ .3*ͷଆͷੈքͰɺ3VCZ͕ιʔείʔυΛಡΈղ͍͍ͯ͘աఔΛ3VCZͱҰॹʹମݧͯ͠Έ͍ͨͱࢥ͍·ͨ͢ͷ͍͠3VCZͷߏจղੳπΞʔߏจղੳίϯύΠϧιʔείʔυ:"37όΠτίʔυࣈ۟ղੳ:"37্Ͱ࣮ߦ࣮ߦ݁Ռߏจ
.3*ͷߏจղੳ
ύʔαͱεΩϟφύʔαͱݺΕΔ͕ؔߏจղੳΛߦ͏εΩϟφͱݺΕΔ͕ؔࣈ۟ղੳΛߦ͏ߏจղੳίϯύΠϧιʔείʔυ:"37όΠτίʔυࣈ۟ղੳ:"37্Ͱ࣮ߦ࣮ߦ݁Ռߏจ
.3*ʹ͓͚ΔεΩϟφͷओͳͨΒ͖ιʔείʔυ͔Β୯ޠΛΓग़͠ɺɹᶃͦͷ୯ޠͷछྨΛࣔ͢ه߸ΛܾΊΔɹᶄͦͷ୯ޠͷ࣮ମΛද͢Λͭ͘Δɹᶅ୯ޠ͝ͱʹه߸ʹΛඥ͚ͮͯύʔαʹ͢ͱ͍͏ॲཧΛߦ͏
;ͨͨͼ͋Δͱ͜Ζʹ͜Μͳιʔείʔυ͕1 + 2.3*ʹ͓͚ΔεΩϟφͷओͳͨΒ͖
ᶃ୯ޠ͝ͱʹछྨΛࣔ͢ه߸ΛܾΊΔU*/5&(&3 b` U*/5&(&31 + 2.3*ʹ͓͚ΔεΩϟφͷओͳͨΒ͖ Ճࢉه߸ ه߸ҙຯ
ᶄͦͷ୯ޠͷ࣮ମΛද͢Λͭ͘Δ͜ͷޙͰߏจΛ࡞ΔͨΊͷࡐྉʹͳΔ/0%&@-*51 + 2/0%&@-*5.3*ʹ͓͚ΔεΩϟφͷओͳͨΒ͖Λද͢ Λද͢Ճࢉه߸b`
ᶅ୯ޠ͝ͱʹه߸ʹΛඥ͚ͮͯύʔαʹ͢1 + 2.3*ʹ͓͚ΔεΩϟφͷओͳͨΒ͖ه߸/0%&@-*5 /0%&@-*5 Ճࢉه߸b`U*/5&(&3 U*/5&(&3
.3*ʹ͓͚ΔύʔαͷओͳͨΒ͖εΩϟφ͔Βه߸Λड͚औͬͯɹᶃه߸ΛࣗࣗͷελοΫʹͨΊΔɹᶄελοΫͷه߸ͷฒͼ͕ߏจنଇʹҰக͢ΔͱɺɹɹΑΓநͷߴ͍ه߸ม͢ΔɹᶅมʹϑοΫͯ͠ߏจΛΈཱͯΔͱ͍͏ॲཧΛߦ͏
ͪΐͬͱෳࡶͳͷͰɺ·ͣύʔαͷجຊతͳΈ͔Β֬ೝͯ͠Έ͍ͨͱࢥ͍·͢˞.3*͕ར༻͍ͯ͠Δ#JTPOʹΑΔύʔαͷ߹
ύʔαࣗࣗͷதʹه߸ΛͨΊ͓ͯͨ͘ΊͷελοΫΛ͍࣋ͬͯΔεΩϟφ͔Βड͚औͬͨه߸λΠϛϯάΛਤͬͯελοΫʹૹΒΕΔ͜ΕΛʮه߸Λγϑτ͢Δʯͱ͍͏ύʔαͷ͘͠ΈελοΫU*/5&(&3b`U*/5&(&3
ύʔαࣗࣗͷதʹͨ͘͞ΜͷߏจنଇΛ͍࣋ͬͯΔߏจنଇʹͲΜͳ༰͕ఆٛ͞Ε͍ͯΔ͔ͱ͍͏ͱʜύʔαͷ͘͠Έߏจنଇߏจنଇྫ
ᶃͲΜͳه߸͕ͲΜͳॱ൪ͰฒͿ͖͔ύʔαͷελοΫʹγϑτ͞ΕΔ֤ه߸͍ͣΕ͔ͷنଇʹఆٛ͞ΕͨॱʹฒͿඞཁ͕͋Δύʔαͷ͘͠ΈߏจنଇߏจنଇྫᶃU*/5&(&3 b` U*/5&(&3ͷॱͰฒͿ U*/5&(&3 b` U*/5&(&3
ᶄฒΜͩه߸ྻΛͲΜͳه߸ʹม͢Δ͔ελοΫͷه߸͕ಛఆͷنଇͷॱ൪௨Γʹἧ͏ͱɺͦͷه߸ྻΑΓநͷߴ͍ผͷه߸ม͞ΕΔ͜ΕΛʮؐݩʯͱݺͿύʔαͷ͘͠Έߏจنଇ ؐݩมઌ มݩߏจنଇྫᶄॱ൪௨Γʹه߸͕ฒΜͩΒFYQSؐݩ͢ΔU*/5&(&3 b` U*/5&(&3FYQS
ᶅՃͰͲΜͳॲཧΛߦ͏͔ ΦϓγϣϯؐݩʹϑοΫͯ͠ՃͰҙͷॲཧΛߦ͏͜ͱ͕Ͱ͖Δ͜ͷॲཧͷ͜ͱΛʮΞΫγϣϯʯͱݺͿ.3*ͰΞΫγϣϯΛར༻ͯ͠ߏจΛΈཱ͍ͯͯΔ/0%&@-*5/0%&@-*5b`Ճࢉه߸ύʔαͷ͘͠Έߏจنଇ ΞΫγϣϯߏจنଇྫᶅ ՃͷॲཧؐݩʹϑοΫͯ͠ߏจΛΈཱͯΔߏจه߸ͷ
͜͜·ͰͷΛ౿·͑ͯɺ.3*ͷύʔα͕εΩϟφɺελοΫɺߏจنଇΛۦͯ͠ߏจΛ࡞Γ্͛Δ·Ͱͷجຊతͳಈ͖Λ͍͔͚ͯΈ·͠ΐ͏
ύʔαεΩϟφ͔ΒૹΒΕ͖ͯͨه߸ΛελοΫγϑτ͢Δ.3*ʹ͓͚ΔύʔαͷओͳͨΒ͖ύʔαͷελοΫ U*/5&(&3b`U*/5&(&3
ελοΫʹͨ·ͬͨه߸ྻ͕͍ͣΕ͔ͷߏจنଇʹҰக͢Δͱʜ.3*ʹ͓͚ΔύʔαͷओͳͨΒ͖ύʔαͷελοΫ U*/5&(&3b`U*/5&(&3U*/5&(&3 b` U*/5&(&3FYQS ߏจنଇ ྫ
ελοΫͷه߸ྻͦͷنଇʹΑͬͯఆΊΒΕͨผͷه߸ʹؐݩ͞ΕΔ.3*ʹ͓͚ΔύʔαͷओͳͨΒ͖ύʔαͷελοΫ FYQSU*/5&(&3 b` U*/5&(&3FYQS ߏจنଇ ྫ
ؐݩલɺελοΫͷ֤ه߸ʹͦΕͧΕͷ࣮ମΛද͕͢ඥ͍͍ͮͯΔ.3*ʹ͓͚ΔύʔαͷओͳͨΒ͖ύʔαͷελοΫ/0%&@-*5/0%&@-*5 Ճࢉه߸U*/5&(&3 b` U*/5&(&3
ύʔαؐݩʹϑοΫͯ͠ɺΞΫγϣϯͰ͜ΕΒͷΛࡐྉʹߏจΛΈཱͯΔ/0%&@-*5.3*ʹ͓͚ΔύʔαͷओͳͨΒ͖/0%&@-*5b`Ճࢉه߸/0%&@01$"--ߏจͷࡐྉΈཱͯΒΕͨߏจ/0%&@-*5/0%&@-*5
ΈཱͯΒΕͨߏจؐݩޙͷه߸ʹඥ͚ͮΒΕΔ.3*ʹ͓͚ΔύʔαͷओͳͨΒ͖/0%&@01$"--/0%&@-*5/0%&@-*5ߏจύʔαͷελοΫFYQS
࠷ऴతʹͯ͢ͷιʔείʔυΛಡΈऴ͑ͯɺελοΫͷه߸ྻ͕ه߸QSPHSBNؐݩ͞Εͨ࣌Ͱߏจղੳ͕ऴྃ͢Δ.3*ʹ͓͚ΔύʔαͷओͳͨΒ͖ύʔαͷελοΫQSPHSBN
ه߸QSPHSBN͕ؐݩ͞Εͨ࣌ͰߏจͷΈཱͯྃ͠ɺ͜ͷߏจͦͷޙ:"37όΠτίʔυίϯύΠϧ͞ΕΔ.3*ʹ͓͚ΔύʔαͷओͳͨΒ͖/0%&@01$"--/0%&@-*5/0%&@-*5ߏจQSPHSBNύʔαͷελοΫ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ
·ͣߏจղੳͷ༷ࢠΛಡΉʹ͋ͨͬͯศརͳπʔϧΛ͝հ͠·͢
ߏจղੳศརπʔϧ Φϓγϣϯ3VCZͷιʔείʔυΛ࣮ߦ͢Δͱ͖ɺɹίϚϯυʹɹɹΦϓγϣϯΛ͚ͭΔ͜ͱͰߏจղੳͷաఔͷϩάΛඪ४ग़ྗ͢Δ͜ͱ͕Ͱ͖Δruby -y$ ruby -ye ‘1 + 2’…-y
.3*ͷ࣮ࡍͷߏจنଇ.3*ͷιʔείʔυʹؚ·ΕΔQBSTFZʹఆٛ͞Ε͍ͯΔ/**********************************************************************parse.y -$Author$created at: Fri May 28 18:02:42 JST 1993Copyright (C) 1993-2007 Yukihiro Matsumoto**********************************************************************/// …%%// …%%// …[email protected]@QBSTFZͰғ·Ε͍ͯΔ෦ʹߏจنଇ͕ఆٛ͞Ε͍ͯΔߏจղੳศརπʔϧ QBSTFZϑΝΠϧ
ߏจղੳศརπʔϧ QBSTFZϑΝΠϧmethod_call : primary_value call_op operation2 opt_paren_args{$$ = new_qcall(p, $2, $1, $3, $4, &@3, &@$);nd_set_line($$, @3.end_pos.lineno);}ߏจنଇͷಡΈํɹྫQBSTFZ- ؆ུԽ͍ͯ͠·͢
ߏจղੳศརπʔϧ QBSTFZϑΝΠϧmethod_call : primary_value call_op operation2 opt_paren_args{$$ = new_qcall(p, $2, $1, $3, $4, &@3, &@$);nd_set_line($$, @3.end_pos.lineno);}ؐݩޙͷه߸ ؐݩલͷه߸ྻΞΫγϣϯ ΦϓγϣφϧߏจنଇͷಡΈํɹྫQBSTFZ- ؆ུԽ͍ͯ͠·͢
method_call : primary_value call_op operation2 opt_paren_args{$$ = new_qcall(p, $2, $1, $3, $4, &@3, &@$);nd_set_line($$, @3.end_pos.lineno);}ߏจղੳศརπʔϧ QBSTFZϑΝΠϧ ҙຯᶃ[email protected] [email protected] PQFSBUJPO [email protected]@BSHT͕ฒΜͩΒɹ[email protected]ؐݩ͢ΔᶄؐݩʹϑοΫͯ͠[email protected]ؔͱ[email protected]@MJOFؔΛݺͼग़ؐ͢ݩޙͷه߸ ؐݩલͷه߸ྻΞΫγϣϯ ΦϓγϣφϧߏจنଇͷಡΈํɹྫQBSTFZ- ؆ུԽ͍ͯ͠·͢
ͦΕͰ࣮ࡍʹ.3*͕ߏจղੳΛ͢ΔऔΓΛ͍͔͚ͯΈ·͠ΐ͏࣮ߦڥɹ04NBD04.POUFSFZɹ$16"QQMF.ɹ3VCZ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’ࠓճղੳ͢ΔίʔυߏจղੳΛ։࢝͢Δ$ ruby -y ίϚϯυΛ༻ͯ͠
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’add_delayed_token:7062 (0: 0|0|0)Starting parse ߏจղੳΛ։࢝
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’add_delayed_token:7062 (0: 0|0|0)Starting parseEntering state 0Stack now 0Reducing stack by rule 1 (line 1580):lex_state: NONE -> BEG at line 1581vtable_alloc:13130: 0x00006000034e9b40vtable_alloc:13131: 0x00006000034e9b60cmdarg_stack(push): 0 at line 13144cond_stack(push): 0 at line 13145-> $$ = nterm [email protected] (1.0-1.0: )QBSTFZͷߦʹఆٛ͞Ε͍ͯΔߏจنଇʹैͬͯؐݩΛ։࢝
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’add_delayed_token:7062 (0: 0|0|0)Starting parseEntering state 0Stack now 0Reducing stack by rule 1 (line 1580):lex_state: NONE -> BEG at line 1581vtable_alloc:13130: 0x00006000034e9b40vtable_alloc:13131: 0x00006000034e9b60cmdarg_stack(push): 0 at line 13144cond_stack(push): 0 at line 13145-> $$ = nterm [email protected] (1.0-1.0: )ߏจنଇࠓ͔Βߏจղੳ͢Δ४උΛߦ͏ͨΊͷಛघͳنଇͳͷͰࠓճৄࡉΛׂѪ͠·͢
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 2Stack now 0 2Reading a tokenͦͷ͙͢ޙɺύʔαεΩϟφΛͬͯιʔείʔυ͔Βه߸ΛಡΈࠐΉه߸ΛಡΈࠐΉ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 2Stack now 0 2Reading a tokenlex_state: BEG -> END at line 9005lex_state: END -> END at line 8282parser_dispatch_scan_event:10499 (1: 0|1|5)Next token is token "integer literal" (1.0-1.1: 1)Shifting token "integer literal" (1.0-1.1: 1)࣍ͷه߸JOUFHFSMJUFSBMzͩͬͨͷͷ෦JOUFHFSMJUFSBMz U*/5&(&3Λγϑτ˞lJOUFHFSMJUFSBMzɹߏจنଇ্U*/5&(&3ͱදݱ͞ΕΔU*/5&(&3ύʔαͷελοΫ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 41Stack now 0 2 41Reducing stack by rule 645 (line 5383):$1 = token "integer literal" (1.0-1.1: 1)-> $$ = nterm simple_numeric (1.0-1.1: NODE_LIT)ߏจنଇʹैͬͯؐݩΛ։࢝U*/5&(&3Λ[email protected]ʹؐݩ// parse.y: L5383simple_numeric : tINTEGERύʔαͷελοΫ[email protected]
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 120Stack now 0 2 120Reducing stack by rule 643 (line 5372):$1 = nterm simple_numeric (1.0-1.1: NODE_LIT)-> $$ = nterm numeric (1.0-1.1: NODE_LIT)ߏจنଇʹैͬͯؐݩΛ։࢝[email protected]ΛOVNFSJDʹؐݩ// parse.y: L5372numeric : simple_numericύʔαͷελοΫOVNFSJD
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 119Stack now 0 2 119Reducing stack by rule 595 (line 4998):$1 = nterm numeric (1.0-1.1: NODE_LIT)-> $$ = nterm literal (1.0-1.1: NODE_LIT)// parse.y: L4998literal : numericߏจنଇʹैͬͯؐݩΛ։࢝OVNFSJDΛMJUFSBMʹؐݩύʔαͷελοΫMJUFSBM
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 106Stack now 0 2 106Reducing stack by rule 310 (line 3220):$1 = nterm literal (1.0-1.1: NODE_LIT)-> $$ = nterm primary (1.0-1.1: NODE_LIT)// parse.y: L3220primary : literalߏจنଇʹैͬͯؐݩΛ։࢝MJUFSBMΛQSJNBSZʹؐݩύʔαͷελοΫQSJNBSZ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 106Stack now 0 2 106Reducing stack by rule 310 (line 3220):$1 = nterm literal (1.0-1.1: NODE_LIT)-> $$ = nterm primary (1.0-1.1: NODE_LIT)ɾ͜͜·ͰͰͷΛɹه߸QSJNBSZͱͯ͠ղੳͰ͖ͨɾه߸QSJNBSZɺ͜ͷޙɹͲΜͳه߸ͱΈ߹ΘͤΔ͔ʹΑͬͯɹద༻͢Δߏจنଇͱؐݩઌͷه߸͕ɹมΘΔɾύʔαɺ͜ͷޙͷɹιʔείʔυʹ͕ଓ͘͜ͱΛɹࠓͷ࣌Ͱ·ͩΒͳ͍ύʔαͷελοΫQSJNBSZߏจղੳͷݱࡏ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 90Stack now 0 2 90Reading a token ࣍ͷه߸ΛಡΈࠐΉ࣍ͷه߸Λ֬ೝ͢ΔͨΊɺύʔαεΩϟφΛͬͯιʔείʔυ͔Βه߸ΛಡΈࠐΉ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 90Stack now 0 2 90Reading a tokenparser_dispatch_scan_event:9833 (1: 1|1|4)lex_state: END -> BEG at line 10181parser_dispatch_scan_event:10499 (1: 2|1|3)Next token is token '+' (1.2-1.3: ) ࣍ͷه߸b`ͩͬͨύʔαͷελοΫQSJNBSZύʔα࣍ͷه߸͕b`Ͱ͋Δͱ͖ه߸QSJNBSZʹରͯ͠ͲΜͳߏจنଇΛద༻͢Δ͖͔அ͢Δ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Reading a tokenparser_dispatch_scan_event:9833 (1: 1|1|4)lex_state: END -> BEG at line 10181parser_dispatch_scan_event:10499 (1: 2|1|3)Next token is token '+' (1.2-1.3: )Reducing stack by rule 263 (line 2906):$1 = nterm primary (1.0-1.1: NODE_LIT)-> $$ = nterm arg (1.0-1.1: NODE_LIT)QSJNBSZΛBSHʹؐݩ// parse.y: 2906arg : primaryߏจنଇʹैͬͯؐݩΛ։࢝ύʔαͷελοΫBSH˞؆ུԽ͍ͯ͠·͢
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 88Stack now 0 2 88Next token is token '+' (1.2-1.3: )Shifting token '+' (1.2-1.3: ) b`ΛγϑτύʔαͷελοΫBSH b`ղੳΛଓ͚ΔͨΊʹύʔαઌ΄Ͳ֬ೝͨ࣍͠ͷه߸b`ΛελοΫʹγϑτ͢Δ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 88Stack now 0 2 88Next token is token '+' (1.2-1.3: )Shifting token '+' (1.2-1.3: )ɾ͜ͷ࣌ͰελοΫʹ͋ΔɹBSHb`>ͱ͍͏ه߸ͷฒͼͰɹؐݩͰ͖Δߏจنଇଘࡏ͠ͳ͍ύʔαͷελοΫBSH b`ߏจղੳͷݱࡏ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 367Stack now 0 2 88 367Reading a token ࣍ͷه߸ΛಡΈࠐΉ࣍ʹؐݩͰ͖ΔنଇΛݟ͚ͭΔͨΊɺύʔαεΩϟφΛͬͯ࣍ͷه߸ΛಡΈࠐΉ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 367Stack now 0 2 88 367Reading a tokenparser_dispatch_scan_event:9833 (1: 3|1|2)lex_state: BEG -> END at line 9005lex_state: END -> END at line 8282parser_dispatch_scan_event:10499 (1: 4|1|1)Next token is token "integer literal" (1.4-1.5: 2)Shifting token "integer literal" (1.4-1.5: 2)࣍ͷه߸lJOUFHFSMJUFSBMzͩͬͨͷͷ෦lJOUFHFSMJUFSBMz U*/5&(&3ΛγϑτύʔαͷελοΫBSH b` U*/5&(&3
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 41Stack now 0 2 88 367 41Reducing stack by rule 645 (line 5383):$1 = token "integer literal" (1.4-1.5: 2)-> $$ = nterm simple_numeric (1.4-1.5: NODE_LIT)ߏจنଇʹैͬͯؐݩΛ։࢝U*/5&(&3Λ[email protected]ʹؐݩ// parse.y: L5383simple_numeric : tINTEGERύʔαͷελοΫBSH b` [email protected]
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 120Stack now 0 2 88 367 120Reducing stack by rule 643 (line 5372):$1 = nterm simple_numeric (1.4-1.5: NODE_LIT)-> $$ = nterm numeric (1.4-1.5: NODE_LIT)ߏจنଇʹैͬͯؐݩΛ։࢝[email protected]ΛOVNFSJDʹؐݩ// parse.y: L5372numeric : simple_numericύʔαͷελοΫBSH b` OVNFSJD
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 119Stack now 0 2 88 367 119Reducing stack by rule 595 (line 4998):$1 = nterm numeric (1.4-1.5: NODE_LIT)-> $$ = nterm literal (1.4-1.5: NODE_LIT)// parse.y: L4998literal : numericߏจنଇʹैͬͯؐݩΛ։࢝OVNFSJDΛMJUFSBMʹؐݩύʔαͷελοΫBSH b` MJUFSBM
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 106Stack now 0 2 88 367 106Reducing stack by rule 310 (line 3220):$1 = nterm literal (1.4-1.5: NODE_LIT)-> $$ = nterm primary (1.4-1.5: NODE_LIT)// parse.y: L3220primary : literalߏจنଇʹैͬͯؐݩΛ։࢝MJUFSBMΛQSJNBSZʹؐݩύʔαͷελοΫBSH b` QSJNBSZ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 106Stack now 0 2 88 367 106Reducing stack by rule 310 (line 3220):$1 = nterm literal (1.4-1.5: NODE_LIT)-> $$ = nterm primary (1.4-1.5: NODE_LIT)ɾ ઌ΄Ͳͱಉ͘͡ɾه߸QSJNBSZɺ͜ͷޙɹͲΜͳه߸ͱΈ߹ΘͤΔ͔ʹΑͬͯɹద༻͢Δߏจنଇͱؐݩઌͷه߸͕ɹมΘΔɾύʔαɺ͜ͷޙɹιʔείʔυ͕ऴྃ͢Δ͜ͱΛɹࠓͷ࣌Ͱ·ͩΒͳ͍ύʔαͷελοΫBSH b` QSJNBSZߏจղੳͷݱࡏ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 90Stack now 0 2 88 367 90Reading a token ࣍ͷه߸ΛಡΈࠐΉͦΕΛ֬ೝ͢ΔͨΊɺύʔαεΩϟφΛͬͯ࣍ͷه߸ΛಡΈࠐΉ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 90Stack now 0 2 88 367 90Reading a tokenlex_state: END -> BEG at line 9900parser_dispatch_scan_event:10499 (1: 5|1|0)Next token is token '\n' (1.5-1.6: ) ࣍ͷه߸baO վߦίʔυͩͬͨύʔαͷελοΫBSH b` QSJNBSZύʔα࣍ͷه߸͕baO`Ͱ͋Δͱ͖ه߸QSJNBSZʹରͯ͠ͲΜͳߏจنଇΛద༻͢Δ͖͔அ͢Δ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 90Stack now 0 2 88 367 90Reading a tokenlex_state: END -> BEG at line 9900parser_dispatch_scan_event:10499 (1: 5|1|0)Next token is token '\n' (1.5-1.6: )Reducing stack by rule 263 (line 2906):$1 = nterm primary (1.4-1.5: NODE_LIT)-> $$ = nterm arg (1.4-1.5: NODE_LIT)QSJNBSZΛBSHʹؐݩ// parse.y: 2906arg : primaryߏจنଇʹैͬͯؐݩΛ։࢝ύʔαͷελοΫBSH b` BSHελοΫʹBSH b` BSH͕ฒΜͩ˞؆ུԽ͍ͯ͠·͢
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 602Stack now 0 2 88 367 602Next token is token '\n' (1.5-1.6: )Reducing stack by rule 231 (line 2745):$1 = nterm arg (1.0-1.1: NODE_LIT)$2 = token '+' (1.2-1.3: )$3 = nterm arg (1.4-1.5: NODE_LIT)-> $$ = nterm arg (1.0-1.5: NODE_OPCALL)// parse.y: L2745arg : arg ‘+’ argBSHb`BSHΛBSHʹؐݩߏจنଇʹैͬͯؐݩΛ։࢝ύʔαͷελοΫBSH˞؆ུԽ͍ͯ͠·͢
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 602Stack now 0 2 88 367 602Next token is token '\n' (1.5-1.6: )Reducing stack by rule 231 (line 2745):$1 = nterm arg (1.0-1.1: NODE_LIT)$2 = token '+' (1.2-1.3: )$3 = nterm arg (1.4-1.5: NODE_LIT)-> $$ = nterm arg (1.0-1.5: NODE_OPCALL)// parse.y: L2745BSHBSHb`BSH\[email protected]@PQ Q b ! !^˞؆ུԽ͍ͯ͠·͢͜ͷߏจنଇʹߏจΛΈཱͯΔͨΊͷΞΫγϣϯ͕ఆٛ͞Ε͍ͯΔ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 602Stack now 0 2 88 367 602Next token is token '\n' (1.5-1.6: )Reducing stack by rule 231 (line 2745):$1 = nterm arg (1.0-1.1: NODE_LIT)$2 = token '+' (1.2-1.3: )$3 = nterm arg (1.4-1.5: NODE_LIT)-> $$ = nterm arg (1.0-1.5: NODE_OPCALL)˞؆ུԽ͍ͯ͠·͢ߏจΛΈཱͯΔ͕ؔݺͼग़͞Ε͍ͯΔ// parse.y: L2745BSHBSHb`BSH\[email protected]@PQ Q b ! !^
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 602Stack now 0 2 88 367 602Next token is token '\n' (1.5-1.6: )Reducing stack by rule 231 (line 2745):$1 = nterm arg (1.0-1.1: NODE_LIT)$2 = token '+' (1.2-1.3: )$3 = nterm arg (1.4-1.5: NODE_LIT)-> $$ = nterm arg (1.0-1.5: NODE_OPCALL)BSHBSHb`BSH\[email protected]@PQ Q b ! !^˞؆ུԽ͍ͯ͠·͢Ҿʹه߸ͷΛ͍ͯ͠ΔʜࠨͷBSHͷ b`ʜՃࢉه߸ʜӈͷBSHͷ // parse.y: L2745
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 602Stack now 0 2 88 367 602Next token is token '\n' (1.5-1.6: )Reducing stack by rule 231 (line 2745):$1 = nterm arg (1.0-1.1: NODE_LIT)$2 = token '+' (1.2-1.3: )$3 = nterm arg (1.4-1.5: NODE_LIT)-> $$ = nterm arg (1.0-1.5: NODE_OPCALL)˞؆ུԽ͍ͯ͠·͢͜ͷؔΛ࣮ߦ͢ΔͱΈཱͯΒΕͨߏจ͕ฦͬͯ͘Δ// parse.y: L2745BSHBSHb`BSH\[email protected]@PQ Q b ! !^
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 602Stack now 0 2 88 367 602Next token is token '\n' (1.5-1.6: )Reducing stack by rule 231 (line 2745):$1 = nterm arg (1.0-1.1: NODE_LIT)$2 = token '+' (1.2-1.3: )$3 = nterm arg (1.4-1.5: NODE_LIT)-> $$ = nterm arg (1.0-1.5: NODE_OPCALL)˞؆ུԽ͍ͯ͠·͢ΈཱͯΒΕͨߏจ͕ؐݩޙͷه߸BSHʹඥͮ͘Λද͢ʹೖ͞ΕΔBSHBSHb`BSH\[email protected]@PQ Q b ! !^// parse.y: L2745
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 602Stack now 0 2 88 367 602Next token is token '\n' (1.5-1.6: )Reducing stack by rule 231 (line 2745):$1 = nterm arg (1.0-1.1: NODE_LIT)$2 = token '+' (1.2-1.3: )$3 = nterm arg (1.4-1.5: NODE_LIT)-> $$ = nterm arg (1.0-1.5: NODE_OPCALL)ύʔαͷελοΫBSH/0%&@01$"--/0%&@-*5/0%&@-*5ߏจ͜ΕʹΑͬͯؐݩޙͷه߸BSHʹߏจ͕ඥ͍ͮͨঢ়ଶʹͳΔ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 88Stack now 0 2 88Next token is token '\n' (1.5-1.6: )Reducing stack by rule 65 (line 2051):$1 = nterm arg (1.0-1.5: node_opcall)-> $$ = nterm expr (1.0-1.5: node_opcall)// parse.y: 2051expr : argBSHΛFYQSʹؐݩߏจنଇʹैͬͯؐݩΛ։࢝ύʔαͷελοΫFYQS˞؆ུԽ͍ͯ͠·͢
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 75Stack now 0 2 75Next token is token '\n' (1.5-1.6: )Reducing stack by rule 37 (line 1853):$1 = nterm expr (1.0-1.5: NODE_OPCALL)-> $$ = nterm stmt (1.0-1.5: NODE_OPCALL)// parse.y: 1853stmt : exprFYQSΛTUNUʹؐݩߏจنଇʹैͬͯؐݩΛ։࢝ύʔαͷελοΫTUNU˞؆ུԽ͍ͯ͠·͢
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 73Stack now 0 2 73Next token is token '\n' (1.5-1.6: )Reducing stack by rule 7 (line 1635):$1 = nterm stmt (1.0-1.5: NODE_OPCALL)-> $$ = nterm top_stmt (1.0-1.5: NODE_OPCALL)// parse.y: 1635top_stmt : stmtTUNUΛ[email protected]ʹؐݩߏจنଇʹैͬͯؐݩΛ։࢝ύʔαͷελοΫ[email protected]˞؆ུԽ͍ͯ͠·͢
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 72Stack now 0 2 72Reducing stack by rule 5 (line 1619):$1 = nterm top_stmt (1.0-1.5: NODE_OPCALL)-> $$ = nterm top_stmts (1.0-1.5: NODE_OPCALL)// parse.y: 1619top_stmts : top_stmt[email protected]Λ[email protected]ʹؐݩߏจنଇʹैͬͯؐݩΛ։࢝ύʔαͷελοΫ[email protected]˞؆ུԽ͍ͯ͠·͢
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 72Stack now 0 2 72Reducing stack by rule 5 (line 1619):$1 = nterm top_stmt (1.0-1.5: NODE_OPCALL)-> $$ = nterm top_stmts (1.0-1.5: NODE_OPCALL)ɾ͜͜·ͰͰɹΛղੳͰ͖ͨɾ͋ͱվߦίʔυaOΛɹಡΈࠐΜͰ͜ͷߦΛऴͤ͞Δɹඞཁ͕͋ΔύʔαͷελοΫ[email protected]ߏจղੳͷݱࡏ˞վߦޙʹϝιουݺͼग़͠ͷAA υοτ͕ɹଓ͘έʔεεΩϟφͰରԠ͍ͯ͠·͕͢ɹࠓճղઆΛׂѪ͠·͢
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 71Stack now 0 2 71Next token is token '\n' (1.5-1.6: )Shifting token '\n' (1.5-1.6: ) baOΛγϑτ࣍ͷه߸aO ߦͩͬͨύʔαͷελοΫ[email protected] baO`
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 310Stack now 0 2 71 310Reducing stack by rule 778 (line 6115):$1 = token '\n' (1.5-1.6: )-> $$ = nterm term (1.5-1.5: )// parse.y: 6115term : ‘\n’baO`ΛUFSNʹؐݩߏจنଇʹैͬͯؐݩΛ։࢝ύʔαͷελοΫ[email protected] UFSN
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 312Stack now 0 2 71 312Reducing stack by rule 779 (line 6122):$1 = nterm term (1.5-1.5: )-> $$ = nterm terms (1.5-1.5: )// parse.y: 6122terms : termUFSNΛUFSNTʹؐݩߏจنଇʹैͬͯؐݩΛ։࢝ύʔαͷελοΫ[email protected] UFSNT
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 312Stack now 0 2 71 312Reducing stack by rule 779 (line 6122):$1 = nterm term (1.5-1.5: )-> $$ = nterm terms (1.5-1.5: )ɾ͜͜·ͰͰɹaOΛղੳͰ͖ͨɾύʔα͜ͷίʔυ͕ɹ͜͜ͰऴΘΔͷ͔ɺɹ͜ͷޙ͞ΒʹߦҎ্ଓ͍͍ͯ͘ͷ͔Λɹࠓͷ࣌Ͱ·ͩΒͳ͍ύʔαͷελοΫ[email protected] UFSNTߏจղੳͷݱࡏ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 313Stack now 0 2 71 313Reading a tokenͦΕΛ֬ೝ͢ΔͨΊɺύʔαεΩϟφΛͬͯ࣍ͷه߸ΛಡΈࠐΉ࣍ͷه߸ΛಡΈࠐΉ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 313Stack now 0 2 71 313Reading a tokenNow at end of input.͔͠͠ɺ͜ͷίʔυ͜ͷҰߦͰऴ͍ྃͯ͠ΔͷͰ࣍ͷߦଘࡏ͠ͳ͍࣍ͷೖྗͳ͍
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 313Stack now 0 2 71 313Reading a tokenNow at end of input. ࣍ͷೖྗͳ͍ύʔαͷελοΫ[email protected] UFSNTύʔα࣍ͷه߸͕ଘࡏ͠ͳ͍ͱ͖ه߸UFSNTʹରͯ͠ͲΜͳߏจنଇΛద༻͢Δ͖͔அ͢Δ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 313Stack now 0 2 71 313Reading a tokenNow at end of input.Reducing stack by rule 769 (line 6094):$1 = nterm terms (1.5-1.5: )-> $$ = nterm opt_terms (1.5-1.5: )// parse.y: 6094opt_terms : termsUFSNTΛ[email protected]ʹؐݩߏจنଇʹैͬͯؐݩΛ։࢝ύʔαͷελοΫ[email protected] [email protected]ελοΫʹ[email protected] [email protected]͕ฒΜͩ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 311Stack now 0 2 71 311Reducing stack by rule 3 (line 1606):$1 = nterm top_stmts (1.0-1.5: NODE_OPCALL)$2 = nterm opt_terms (1.5-1.5: )-> $$ = nterm top_compstmt (1.0-1.5: NODE_OPCALL)// parse.y: 1606top_compstmt : top_stmts opt_terms[email protected] [email protected]Λ[email protected]ʹؐݩߏจنଇʹैͬͯؐݩΛ։࢝ύʔαͷελοΫ[email protected]
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 70Stack now 0 2 70Reducing stack by rule 2 (line 1580):$1 = nterm [email protected] (1.0-1.0: )$2 = nterm top_compstmt (1.0-1.5: NODE_OPCALL)…cmdarg_stack(pop): 0 at line 13166cond_stack(pop): 0 at line 13167-> $$ = nterm program (1.0-1.5: )// parse.y: 1580program : top_compstmt[email protected]ΛQSPHSBNʹؐݩύʔαͷελοΫQSPHSBNߏจنଇʹैͬͯؐݩΛ։࢝
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 70Stack now 0 2 70Reducing stack by rule 2 (line 1580):$1 = nterm [email protected] (1.0-1.0: )$2 = nterm top_compstmt (1.0-1.5: NODE_OPCALL)…cmdarg_stack(pop): 0 at line 13166cond_stack(pop): 0 at line 13167-> $$ = nterm program (1.0-1.5: )ύʔαͷελοΫQSPHSBNɾه߸QSPHSBNɹؐݩ͢Δ͜ͱ͕Ͱ͖ͨͨΊɹύʔα͜͜·ͰͰɹߏจղੳΛऴྃ͢Δߏจղੳͷݱࡏ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 1Stack now 0 1Now at end of input.Shifting token "end-of-input" (1.6-1.6: )Entering state 3Stack now 0 1 3Stack now 0 1 3Cleanup: popping token "end-of-input" (1.6-1.6: )Cleanup: popping nterm program (1.0-1.5: )ελοΫΛۭʹͯ͠ਖ਼ৗʹೖྗ͕ऴΘͬͨ͜ͱΛ֬ೝ͠ɺॲཧΛऴྃޙॲཧͷͨΊɺೖྗͷऴྃΛදݱ͢Δه߸ΛελοΫʹγϑτ
ͨͷ͍͠3VCZͷߏจղੳπΞʔ$ ruby -ye ‘1 + 2’…Entering state 1Stack now 0 1Now at end of input.Shifting token "end-of-input" (1.6-1.6: )Entering state 3Stack now 0 1 3Stack now 0 1 3Cleanup: popping token "end-of-input" (1.6-1.6: )Cleanup: popping nterm program (1.0-1.5: )aత౸ணߏจղੳͷݱࡏ
͓͔ͭΕ͞·Ͱͨ͠3VCZͱҰॹʹ८ΔߏจղੳπΞʔ͓ͨͷ͠Έ͍͚ͨͩͨͰ͠ΐ͏͔
·ͱΊɹɹΦϓγϣϯ͕͋Ε͍ͭͰͲ͜ͰखܰʹߏจղੳϩάΛग़ྗͰ͖·͢QBSTFZϑΝΠϧ͕͋ΕΑΓৄࡉʹߏจղੳͷ࣮ࡍΛ֬ೝ͢Δ͜ͱ͕Ͱ͖·͢-yΈͳ͞Μͥͻ͓खݩͷ.3*Ͱ͓ࢼ͍ͩ͘͠͞
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠4QFDJBMUIBOLTUP ܟশུ!TQJLFPMBG!NJOFSPBPLJࢀߟॻ੶3VCZιʔείʔυશղઆɹୈೋ෦ʮߏจղੳʯ IUUQTJMPWFSVCZOFUKBSIHCPPL3VCZͷ͘͠Έɹ̍ࣈ۟ղੳͱߏจղੳ