$30 off During Our Annual Pro Sale. View Details »

たのしいRubyの構文解析ツアー

 たのしいRubyの構文解析ツアー

鹿児島Ruby会議02

More Decks by Misaki Shioi(塩井美咲/しおい)

Other Decks in Programming

Transcript

  1. ԘҪඒ࡙ !TIJPJNN!DPF@

    .BS
    ࣛࣇౡ3VCZձٞ
    ͨͷ͍͠3VCZͷߏจղੳπΞʔ

    View Slide

  2. ࣗݾ঺հ
    (JU)VC!TIJPJNN
    5XJUUFS!DPF@
    גࣜձࣾΤεɾΤϜɾΤε
    'VLVPLBSCग़਎"TBLVTBSCҭͪ
    ࡀ͔Βࡀ·ͰࣛࣇౡʹॅΜͰ͍·ͨ͠
    ͜ͷ͋ͨΓ
    ࣾձ՝୊ʹऔΓ૊Έ͍ͨ3VCZେ޷͖ΤϯδχΞ͕
    ηΧϯυΩϟϦΞʹΤεɾΤϜɾΤεΛબΜͩཧ༝
    IUUQTUFDICNTNTDPKQFOUSZ

    View Slide

  3. ࣛࣇౡ3VCZձٞͷςʔϚ
    ͱ͍͏͜ͱͰɺ࠷ۙݸਓతʹڵຯ͕޿͕ͬͨ
    3VCZͷ಺ଆͷੈքͷ͓࿩Λ͍ͨ͠ͱࢥ͍·͢
    IUUQTLSVCZDPNLBHPTIJNBSVCZLBJHJBCPVU
    3VCZͰ޿͕Δੈքɺ3VCZͰ͸͡ΊΑ͏

    View Slide

  4. ͱ͸͍͑
    ʮ3VCZͷ಺ଆͷੈքʯͱ͍ͬͯ΋ɺ
    ࣮ࡍʹ͸ͱͯ΋޿େͰ͍ΖΜͳ੾Γޱ͕͋Γ·͢Ͷ

    View Slide

  5. ʮ3VCZͷ಺ଆͷੈքʯ
    ࠓճ͸ͦͷதͰ΋
    ɹ3VCZ .3*
    ͕
    ɹͲΜͳ;͏ʹίʔυΛ࣮ߦ͍ͯ͠Δͷ͔
    ͷҰ෦Ͱ͋Δߏจղੳʹ
    εϙοτϥΠτΛ౰ͯͯΈ͍ͨͱࢥ͍·͢

    View Slide

  6. ʮ3VCZͷ಺ଆͷੈքʯ
    ·ͣ͸3VCZ͕ίʔυΛ࣮ߦ͢Δ·Ͱʹ
    3VCZ .3*
    ͷ಺ଆͰͲΜͳ͜ͱ͕ى͍ͬͯ͜Δͷ͔
    ͦͷશମ૾ΛோΊͯΈ͍ͨͱࢥ͍·͢

    View Slide

  7. 3VCZ͕ίʔυΛ࣮ߦ͢Δ·ͰͷྲྀΕ
    ιʔείʔυ 1 + 2

    View Slide

  8. 3VCZ͕ίʔυΛ࣮ߦ͢Δ·ͰͷྲྀΕ
    ιʔείʔυ 1 + 2
    ࣮ߦ

    View Slide

  9. 3VCZ͕ίʔυΛ࣮ߦ͢Δ·ͰͷྲྀΕ
    ιʔείʔυΛ
    ҙຯతʹղऍ͢Δॲཧ
    ιʔείʔυΛ
    ୯ޠ୯Ґʹ੾Γग़͢ॲཧ
    ߏจղੳ
    ιʔείʔυ
    ࣈ۟ղੳ
    1 + 2

    View Slide

  10. 3VCZ͕ίʔυΛ࣮ߦ͢Δ·ͰͷྲྀΕ
    ιʔείʔυΛ
    ҙຯతʹղऍͨ͠໦ߏ଄ͷσʔλ
    ߏจղੳ
    ιʔείʔυ
    ࣈ۟ղੳ
    1 + 2
    (OPCALL@1:0-1:5

    (LIT@1:0-1:1 1)

    :+

    (LIST@1:4-1:5

    (LIT@1:4-1:5 2) nil)))
    ߏจ໦

    View Slide

  11. 3VCZ͕ίʔυΛ࣮ߦ͢Δ·ͰͷྲྀΕ
    ߏจղੳ
    ίϯύΠϧ
    ιʔείʔυ
    ࣈ۟ղੳ
    1 + 2
    (OPCALL@1:0-1:5

    (LIT@1:0-1:1 1)

    :+

    (LIST@1:4-1:5

    (LIT@1:4-1:5 2) nil)))
    ߏจ໦

    View Slide

  12. 3VCZ͕ίʔυΛ࣮ߦ͢Δ·ͰͷྲྀΕ
    ϓϩάϥϜΛ࣮ࡍʹ࣮ߦ͢Δ໋ྩྻ
    ߏจղੳ
    ίϯύΠϧ
    ιʔείʔυ
    :"37όΠτίʔυ
    ࣈ۟ղੳ
    1 + 2
    == disasm: #@-e:1 (1,0)-(1,5)> (catch: false)

    0000 putobject 1 ( 1)[Li]

    0002 putobject 2

    0004 send , nil

    0007 leave
    (OPCALL@1:0-1:5

    (LIT@1:0-1:1 1)

    :+

    (LIST@1:4-1:5

    (LIT@1:4-1:5 2) nil)))
    ߏจ໦

    View Slide

  13. 3VCZ͕ίʔυΛ࣮ߦ͢Δ·ͰͷྲྀΕ
    ߏจղੳ
    ίϯύΠϧ
    ιʔείʔυ
    :"37όΠτίʔυ
    ࣈ۟ղੳ
    :"37্Ͱ࣮ߦ
    1 + 2
    == disasm: #@-e:1 (1,0)-(1,5)> (catch: false)

    0000 putobject 1 ( 1)[Li]

    0002 putobject 2

    0004 send , nil

    0007 leave
    (OPCALL@1:0-1:5

    (LIT@1:0-1:1 1)

    :+

    (LIST@1:4-1:5

    (LIT@1:4-1:5 2) nil)))
    ߏจ໦

    View Slide

  14. ߏจղੳ
    ίϯύΠϧ
    ιʔείʔυ
    :"37όΠτίʔυ
    ࣈ۟ղੳ
    :"37্Ͱ࣮ߦ
    ࣮ߦ݁Ռ > 3
    1 + 2
    3VCZ͕ίʔυΛ࣮ߦ͢Δ·ͰͷྲྀΕ
    == disasm: #@-e:1 (1,0)-(1,5)> (catch: false)

    0000 putobject 1 ( 1)[Li]

    0002 putobject 2

    0004 send , nil

    0007 leave
    (OPCALL@1:0-1:5

    (LIT@1:0-1:1 1)

    :+

    (LIST@1:4-1:5

    (LIT@1:4-1:5 2) nil)))
    ߏจ໦

    View Slide

  15. ຊൃදͰͷείʔϓ
    3VCZ .3*
    ͷ಺ଆͷੈքͰɺ
    3VCZ͕ιʔείʔυΛಡΈղ͍͍ͯ͘աఔΛ
    3VCZͱҰॹʹମݧͯ͠Έ͍ͨͱࢥ͍·͢
    ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    ߏจղੳ
    ίϯύΠϧ
    ιʔείʔυ
    :"37όΠτίʔυ
    ࣈ۟ղੳ
    :"37্Ͱ࣮ߦ
    ࣮ߦ݁Ռ
    ߏจ໦

    View Slide

  16. .3*ͷߏจղੳ

    View Slide

  17. ύʔαͱεΩϟφ
    ύʔαͱݺ͹ΕΔؔ਺͕
    ߏจղੳΛߦ͏
    εΩϟφͱݺ͹ΕΔؔ਺͕
    ࣈ۟ղੳΛߦ͏
    ߏจղੳ
    ίϯύΠϧ
    ιʔείʔυ
    :"37όΠτίʔυ
    ࣈ۟ղੳ
    :"37্Ͱ࣮ߦ
    ࣮ߦ݁Ռ
    ߏจ໦

    View Slide

  18. .3*ʹ͓͚ΔεΩϟφͷओͳ͸ͨΒ͖
    ιʔείʔυ͔Β୯ޠΛ੾Γग़͠ɺ
    ɹᶃͦͷ୯ޠͷछྨΛࣔ͢ه߸ΛܾΊΔ
    ɹᶄͦͷ୯ޠͷ࣮ମΛද͢஋Λͭ͘Δ
    ɹᶅ୯ޠ͝ͱʹه߸ʹ஋Λඥ͚ͮͯύʔαʹ౉͢
    ͱ͍͏ॲཧΛߦ͏

    View Slide

  19. ;ͨͨͼ͋Δͱ͜Ζʹ͜Μͳιʔείʔυ͕
    1 + 2
    .3*ʹ͓͚ΔεΩϟφͷओͳ͸ͨΒ͖

    View Slide

  20. ᶃ୯ޠ͝ͱʹछྨΛࣔ͢ه߸ΛܾΊΔ
    U*/5&(&3 b` U*/5&(&3
    1 + 2
    .3*ʹ͓͚ΔεΩϟφͷओͳ͸ͨΒ͖
    ੔਺஋
    Ճࢉه߸
    ੔਺஋

    ه߸
    ҙຯ

    View Slide

  21. ᶄͦͷ୯ޠͷ࣮ମΛද͢஋Λͭ͘Δ
    ͜ͷ஋͸ޙͰߏจ໦Λ࡞ΔͨΊͷࡐྉʹͳΔ
    /0%&@-*5
    1 + 2
    /0%&@-*5
    .3*ʹ͓͚ΔεΩϟφͷओͳ͸ͨΒ͖
    ਺஋Λද͢஋
    ਺஋Λද͢஋

    Ճࢉه߸

    b`

    View Slide

  22. ᶅ୯ޠ͝ͱʹه߸ʹ஋Λඥ͚ͮͯύʔαʹ౉͢
    1 + 2
    .3*ʹ͓͚ΔεΩϟφͷओͳ͸ͨΒ͖
    ه߸
    /0%&@-*5 /0%&@-*5
    ஋ Ճࢉه߸

    b`
    U*/5&(&3 U*/5&(&3

    View Slide

  23. .3*ʹ͓͚Δύʔαͷओͳ͸ͨΒ͖
    εΩϟφ͔Βه߸Λड͚औͬͯ
    ɹᶃه߸Λࣗ෼ࣗ਎ͷελοΫʹͨΊΔ
    ɹᶄελοΫ಺ͷه߸ͷฒͼ͕ߏจنଇʹҰக͢Δͱɺ
    ɹɹΑΓந৅౓ͷߴ͍ه߸΁ม׵͢Δ
    ɹᶅม׵ʹϑοΫͯ͠ߏจ໦Λ૊ΈཱͯΔ
    ͱ͍͏ॲཧΛߦ͏

    View Slide

  24. ͪΐͬͱෳࡶͳͷͰɺ
    ·ͣ͸ύʔαͷجຊతͳ࢓૊Έ͔Β
    ֬ೝͯ͠Έ͍ͨͱࢥ͍·͢
    ˞.3*͕ར༻͍ͯ͠Δ#JTPOʹΑΔύʔαͷ৔߹

    View Slide

  25. ύʔα͸ࣗ෼ࣗ਎ͷதʹه߸ΛͨΊ͓ͯͨ͘Ίͷ
    ελοΫΛ͍࣋ͬͯΔ
    εΩϟφ͔Βड͚औͬͨه߸͸
    λΠϛϯάΛਤͬͯελοΫʹૹΒΕΔ
    ͜ΕΛʮه߸Λγϑτ͢Δʯͱ͍͏

    ύʔαͷ͘͠ΈελοΫ
    U*/5&(&3
    b`
    U*/5&(&3

    View Slide

  26. ύʔα͸ࣗ෼ࣗ਎ͷதʹͨ͘͞ΜͷߏจنଇΛ͍࣋ͬͯΔ
    ߏจنଇʹ͸ͲΜͳ಺༰͕ఆٛ͞Ε͍ͯΔ͔ͱ͍͏ͱʜ
    ύʔαͷ͘͠Έߏจنଇ
    ߏจنଇྫ


    View Slide

  27. ᶃͲΜͳه߸͕ͲΜͳॱ൪ͰฒͿ΂͖͔
    ύʔαͷελοΫʹγϑτ͞ΕΔ֤ه߸͸
    ͍ͣΕ͔ͷنଇʹఆٛ͞ΕͨॱʹฒͿඞཁ͕͋Δ
    ύʔαͷ͘͠Έߏจنଇ
    ߏจنଇྫᶃU*/5&(&3 b` U*/5&(&3ͷॱͰฒͿ

    U*/5&(&3 b` U*/5&(&3

    View Slide

  28. ᶄฒΜͩه߸ྻΛͲΜͳه߸ʹม׵͢Δ͔
    ελοΫ಺ͷه߸͕ಛఆͷنଇͷॱ൪௨Γʹἧ͏ͱɺ
    ͦͷه߸ྻ͸ΑΓந৅౓ͷߴ͍ผͷه߸΁ม׵͞ΕΔ
    ͜ΕΛʮؐݩʯͱݺͿ

    ύʔαͷ͘͠Έߏจنଇ ؐݩ

    ม׵ઌ ม׵ݩ
    ߏจنଇྫᶄॱ൪௨Γʹه߸͕ฒΜͩΒFYQS΁ؐݩ͢Δ
    U*/5&(&3 b` U*/5&(&3
    FYQS

    View Slide

  29. ᶅ௥ՃͰͲΜͳॲཧΛߦ͏͔ Φϓγϣϯ

    ؐݩʹϑοΫͯ͠௥ՃͰ೚ҙͷॲཧΛߦ͏͜ͱ͕Ͱ͖Δ
    ͜ͷॲཧͷ͜ͱΛʮΞΫγϣϯʯͱݺͿ

    .3*Ͱ͸ΞΫγϣϯΛར༻ͯ͠ߏจ໦Λ૊Έཱ͍ͯͯΔ
    /0%&@-*5
    ਺஋

    /0%&@-*5
    ਺஋

    b`
    Ճࢉه߸

    ύʔαͷ͘͠Έߏจنଇ ΞΫγϣϯ


    ߏจنଇྫᶅ ௥Ճͷॲཧ
    ؐݩʹϑοΫͯ͠ߏจ໦Λ૊ΈཱͯΔ
    ߏจ໦
    ه߸ͷ஋

    View Slide

  30. ͜͜·Ͱͷ࿩Λ౿·͑ͯɺ.3*ͷύʔα͕
    εΩϟφɺελοΫɺߏจنଇΛۦ࢖ͯ͠
    ߏจ໦Λ࡞Γ্͛Δ·Ͱͷ
    جຊతͳಈ͖Λ௥͍͔͚ͯΈ·͠ΐ͏

    View Slide

  31. ύʔα͸εΩϟφ͔ΒૹΒΕ͖ͯͨه߸Λ
    ελοΫ΁γϑτ͢Δ
    .3*ʹ͓͚Δύʔαͷओͳ͸ͨΒ͖
    ύʔαͷελοΫ U*/5&(&3
    b`
    U*/5&(&3

    View Slide

  32. ελοΫ಺ʹͨ·ͬͨه߸ྻ͕
    ͍ͣΕ͔ͷߏจنଇʹҰக͢Δͱʜ
    .3*ʹ͓͚Δύʔαͷओͳ͸ͨΒ͖
    ύʔαͷελοΫ U*/5&(&3
    b`
    U*/5&(&3
    U*/5&(&3 b` U*/5&(&3
    FYQS
    ߏจنଇ ྫ

    View Slide

  33. ελοΫ಺ͷه߸ྻ͸
    ͦͷنଇʹΑͬͯఆΊΒΕͨผͷه߸ʹؐݩ͞ΕΔ
    .3*ʹ͓͚Δύʔαͷओͳ͸ͨΒ͖
    ύʔαͷελοΫ FYQS
    U*/5&(&3 b` U*/5&(&3
    FYQS
    ߏจنଇ ྫ

    View Slide

  34. ؐݩલɺελοΫ಺ͷ֤ه߸ʹ͸
    ͦΕͧΕͷ࣮ମΛද͢஋͕ඥ͍͍ͮͯΔ
    .3*ʹ͓͚Δύʔαͷओͳ͸ͨΒ͖

    ύʔαͷελοΫ
    /0%&@-*5
    /0%&@-*5 Ճࢉه߸
    U*/5&(&3 b` U*/5&(&3

    View Slide

  35. ύʔα͸ؐݩʹϑοΫͯ͠ɺΞΫγϣϯ಺Ͱ
    ͜ΕΒͷ஋Λࡐྉʹߏจ໦Λ૊ΈཱͯΔ
    /0%&@-*5
    ਺஋

    .3*ʹ͓͚Δύʔαͷओͳ͸ͨΒ͖
    /0%&@-*5
    ਺஋

    b`
    Ճࢉه߸

    /0%&@01$"--

    ߏจ໦ͷࡐྉ
    ૊ΈཱͯΒΕͨߏจ໦
    /0%&@-*5
    ਺஋

    /0%&@-*5
    ਺஋

    View Slide

  36. ૊ΈཱͯΒΕͨߏจ໦͸ؐݩޙͷه߸ʹඥ͚ͮΒΕΔ
    .3*ʹ͓͚Δύʔαͷओͳ͸ͨΒ͖
    /0%&@01$"--

    /0%&@-*5
    ਺஋

    /0%&@-*5
    ਺஋

    ߏจ໦
    ύʔαͷελοΫ
    FYQS

    View Slide

  37. ࠷ऴతʹ͸͢΂ͯͷιʔείʔυΛಡΈऴ͑ͯɺ
    ελοΫ಺ͷه߸ྻ͕ه߸QSPHSBN΁ؐݩ͞Εͨ࣌఺Ͱ
    ߏจղੳ͕ऴྃ͢Δ
    .3*ʹ͓͚Δύʔαͷओͳ͸ͨΒ͖
    ύʔαͷελοΫ
    QSPHSBN

    View Slide

  38. ه߸QSPHSBN͕ؐݩ͞Εͨ࣌఺Ͱߏจ໦ͷ૊Έཱͯ΋
    ׬ྃ͠ɺ͜ͷߏจ໦͸ͦͷޙ:"37όΠτίʔυ΁
    ίϯύΠϧ͞ΕΔ
    .3*ʹ͓͚Δύʔαͷओͳ͸ͨΒ͖
    /0%&@01$"--

    /0%&@-*5
    ਺஋

    /0%&@-*5
    ਺஋

    ߏจ໦
    QSPHSBN
    ύʔαͷελοΫ

    View Slide

  39. ͨͷ͍͠3VCZͷߏจղੳπΞʔ

    View Slide

  40. ·ͣ͸ߏจղੳͷ༷ࢠΛಡΉʹ͋ͨͬͯ
    ศརͳπʔϧΛ͝঺հ͠·͢

    View Slide

  41. ߏจղੳศརπʔϧ
    Φϓγϣϯ
    3VCZͷιʔείʔυΛ࣮ߦ͢Δͱ͖ɺ
    ɹίϚϯυʹɹɹΦϓγϣϯΛ͚ͭΔ͜ͱͰ
    ߏจղੳͷաఔͷϩάΛඪ४ग़ྗ͢Δ͜ͱ͕Ͱ͖Δ
    ruby -y
    $ ruby -ye ‘1 + 2’


    -y

    View Slide

  42. .3*ͷ࣮ࡍͷߏจنଇ͸.3*ͷιʔείʔυʹؚ·ΕΔ
    QBSTFZʹఆٛ͞Ε͍ͯΔ
    /**********************************************************************

    parse.y -

    $Author$

    created at: Fri May 28 18:02:42 JST 1993

    Copyright (C) 1993-2007 Yukihiro Matsumoto

    **********************************************************************/

    // …

    %%

    // …

    %%

    // …
    IUUQTHJUIVCDPNSVCZSVCZCMPCW@@QBSTFZ

    Ͱғ·Ε͍ͯΔ෦෼ʹߏจنଇ͕ఆٛ͞Ε͍ͯΔ
    ߏจղੳศརπʔϧ
    QBSTFZϑΝΠϧ

    View Slide

  43. ߏจղੳศརπʔϧ
    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- ؆ུԽ͍ͯ͠·͢

    View Slide

  44. ߏจղੳศརπʔϧ
    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- ؆ུԽ͍ͯ͠·͢

    View Slide

  45. 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ϑΝΠϧ
    ҙຯ
    ᶃQSJNBSZ@WBMVF DBMM@PQ PQFSBUJPO PQU@QBSFO@BSHT͕ฒΜͩΒ
    ɹNFUIPE@DBMM΁ؐݩ͢Δ
    ᶄؐݩʹϑοΫͯ͠OFX@RDBMMؔ਺ͱOE@TFU@MJOFؔ਺Λݺͼग़͢
    ؐݩޙͷه߸ ؐݩલͷه߸ྻ
    ΞΫγϣϯ Φϓγϣφϧ

    ߏจنଇͷಡΈํɹྫQBSTFZ- ؆ུԽ͍ͯ͠·͢

    View Slide

  46. ͦΕͰ͸࣮ࡍʹ.3*͕ߏจղੳΛ͢Δ
    ଍औΓΛ௥͍͔͚ͯΈ·͠ΐ͏
    ࣮ߦ؀ڥ
    ɹ04NBD04.POUFSFZ
    ɹ$16"QQMF.
    ɹ3VCZ

    View Slide

  47. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’

    ࠓճղੳ͢Δίʔυ͸

    ߏจղੳΛ։࢝͢Δ
    $ ruby -y ίϚϯυΛ࢖༻ͯ͠

    View Slide

  48. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’

    add_delayed_token:7062 (0: 0|0|0)

    Starting parse
    ߏจղੳΛ։࢝

    View Slide

  49. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’

    add_delayed_token:7062 (0: 0|0|0)

    Starting parse

    Entering state 0

    Stack now 0

    Reducing stack by rule 1 (line 1580):

    lex_state: NONE -> BEG at line 1581

    vtable_alloc:13130: 0x00006000034e9b40

    vtable_alloc:13131: 0x00006000034e9b60

    cmdarg_stack(push): 0 at line 13144

    cond_stack(push): 0 at line 13145

    -> $$ = nterm $@1 (1.0-1.0: )
    QBSTFZͷߦ໨ʹఆٛ͞Ε͍ͯΔ
    ߏจنଇʹैͬͯؐݩΛ։࢝

    View Slide

  50. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’

    add_delayed_token:7062 (0: 0|0|0)

    Starting parse

    Entering state 0

    Stack now 0

    Reducing stack by rule 1 (line 1580):

    lex_state: NONE -> BEG at line 1581

    vtable_alloc:13130: 0x00006000034e9b40

    vtable_alloc:13131: 0x00006000034e9b60

    cmdarg_stack(push): 0 at line 13144

    cond_stack(push): 0 at line 13145

    -> $$ = nterm $@1 (1.0-1.0: )
    ߏจنଇ͸ࠓ͔Βߏจղੳ͢Δ४උΛ
    ߦ͏ͨΊͷಛघͳنଇͳͷͰ
    ࠓճ͸ৄࡉΛׂѪ͠·͢

    View Slide

  51. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 2

    Stack now 0 2

    Reading a token

    ͦͷ͙͢ޙɺύʔα͸εΩϟφΛ࢖ͬͯ
    ιʔείʔυ͔Βه߸ΛಡΈࠐΉ
    ه߸ΛಡΈࠐΉ

    View Slide

  52. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 2

    Stack now 0 2

    Reading a token

    lex_state: BEG -> END at line 9005

    lex_state: END -> END at line 8282

    parser_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
    ύʔαͷελοΫ

    View Slide

  53. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 41

    Stack now 0 2 41

    Reducing 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ΛTJNQMF@OVNFSJDʹؐݩ
    // parse.y: L5383

    simple_numeric : tINTEGER
    ύʔαͷελοΫ
    TJNQMF@OVNFSJD

    View Slide

  54. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 120

    Stack now 0 2 120

    Reducing stack by rule 643 (line 5372):

    $1 = nterm simple_numeric (1.0-1.1: NODE_LIT)

    -> $$ = nterm numeric (1.0-1.1: NODE_LIT)

    ߏจنଇʹैͬͯؐݩΛ։࢝
    TJNQMF@OVNFSJDΛOVNFSJDʹؐݩ
    // parse.y: L5372

    numeric : simple_numeric
    ύʔαͷελοΫ
    OVNFSJD

    View Slide

  55. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 119

    Stack now 0 2 119

    Reducing 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: L4998

    literal : numeric
    ߏจنଇʹैͬͯؐݩΛ։࢝
    OVNFSJDΛMJUFSBMʹؐݩ
    ύʔαͷελοΫ
    MJUFSBM

    View Slide

  56. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 106

    Stack now 0 2 106

    Reducing 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: L3220

    primary : literal
    ߏจنଇʹैͬͯؐݩΛ։࢝
    MJUFSBMΛQSJNBSZʹؐݩ
    ύʔαͷελοΫ
    QSJNBSZ

    View Slide

  57. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 106

    Stack now 0 2 106

    Reducing 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
    ߏจղੳͷݱࡏ஍఺

    View Slide

  58. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 90

    Stack now 0 2 90

    Reading a token
    ࣍ͷه߸ΛಡΈࠐΉ
    ࣍ͷه߸Λ֬ೝ͢ΔͨΊɺ
    ύʔα͸εΩϟφΛ࢖ͬͯ
    ιʔείʔυ͔Βه߸ΛಡΈࠐΉ

    View Slide

  59. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 90

    Stack now 0 2 90

    Reading a token

    parser_dispatch_scan_event:9833 (1: 1|1|4)

    lex_state: END -> BEG at line 10181

    parser_dispatch_scan_event:10499 (1: 2|1|3)

    Next token is token '+' (1.2-1.3: )
    ࣍ͷه߸͸b`ͩͬͨ
    ύʔαͷελοΫ
    QSJNBSZ
    ύʔα͸࣍ͷه߸͕b`Ͱ͋Δͱ͖
    ه߸QSJNBSZʹରͯ͠
    ͲΜͳߏจنଇΛద༻͢Δ΂͖͔൑அ͢Δ

    View Slide

  60. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Reading a token

    parser_dispatch_scan_event:9833 (1: 1|1|4)

    lex_state: END -> BEG at line 10181

    parser_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: 2906

    arg : primary
    ߏจنଇʹैͬͯؐݩΛ։࢝
    ύʔαͷελοΫ
    BSH
    ˞؆ུԽ͍ͯ͠·͢

    View Slide

  61. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 88

    Stack now 0 2 88

    Next token is token '+' (1.2-1.3: )

    Shifting token '+' (1.2-1.3: ) b`Λγϑτ
    ύʔαͷελοΫ
    BSH b`
    ղੳΛଓ͚ΔͨΊʹύʔα͸
    ઌ΄Ͳ֬ೝͨ࣍͠ͷه߸b`Λ
    ελοΫʹγϑτ͢Δ

    View Slide

  62. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 88

    Stack now 0 2 88

    Next token is token '+' (1.2-1.3: )

    Shifting token '+' (1.2-1.3: )
    ɾ͜ͷ࣌఺ͰελοΫ಺ʹ͋Δ
    ɹ<BSHb`>ͱ͍͏ه߸ͷฒͼͰ
    ɹؐݩͰ͖Δߏจنଇ͸ଘࡏ͠ͳ͍
    ύʔαͷελοΫ
    BSH b`
    ߏจղੳͷݱࡏ஍఺

    View Slide

  63. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 367

    Stack now 0 2 88 367

    Reading a token
    ࣍ͷه߸ΛಡΈࠐΉ
    ࣍ʹؐݩͰ͖ΔنଇΛݟ͚ͭΔͨΊɺ
    ύʔα͸εΩϟφΛ࢖ͬͯ
    ࣍ͷه߸ΛಡΈࠐΉ

    View Slide

  64. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 367

    Stack now 0 2 88 367

    Reading a token

    parser_dispatch_scan_event:9833 (1: 3|1|2)

    lex_state: BEG -> END at line 9005

    lex_state: END -> END at line 8282

    parser_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

    View Slide

  65. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 41

    Stack now 0 2 88 367 41

    Reducing 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ΛTJNQMF@OVNFSJDʹؐݩ
    // parse.y: L5383

    simple_numeric : tINTEGER
    ύʔαͷελοΫ
    BSH b` TJNQMF@OVNFSJD

    View Slide

  66. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 120

    Stack now 0 2 88 367 120

    Reducing stack by rule 643 (line 5372):

    $1 = nterm simple_numeric (1.4-1.5: NODE_LIT)

    -> $$ = nterm numeric (1.4-1.5: NODE_LIT)

    ߏจنଇʹैͬͯؐݩΛ։࢝
    TJNQMF@OVNFSJDΛOVNFSJDʹؐݩ
    // parse.y: L5372

    numeric : simple_numeric
    ύʔαͷελοΫ
    BSH b` OVNFSJD

    View Slide

  67. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 119

    Stack now 0 2 88 367 119

    Reducing 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: L4998

    literal : numeric
    ߏจنଇʹैͬͯؐݩΛ։࢝
    OVNFSJDΛMJUFSBMʹؐݩ
    ύʔαͷελοΫ
    BSH b` MJUFSBM

    View Slide

  68. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 106

    Stack now 0 2 88 367 106

    Reducing 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: L3220

    primary : literal
    ߏจنଇʹैͬͯؐݩΛ։࢝
    MJUFSBMΛQSJNBSZʹؐݩ
    ύʔαͷελοΫ
    BSH b` QSJNBSZ

    View Slide

  69. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 106

    Stack now 0 2 88 367 106

    Reducing 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
    ߏจղੳͷݱࡏ஍఺

    View Slide

  70. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 90

    Stack now 0 2 88 367 90

    Reading a token ࣍ͷه߸ΛಡΈࠐΉ
    ͦΕΛ֬ೝ͢ΔͨΊɺύʔα͸
    εΩϟφΛ࢖ͬͯ࣍ͷه߸ΛಡΈࠐΉ

    View Slide

  71. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 90

    Stack now 0 2 88 367 90

    Reading a token

    lex_state: END -> BEG at line 9900

    parser_dispatch_scan_event:10499 (1: 5|1|0)

    Next token is token '\n' (1.5-1.6: )
    ࣍ͷه߸͸baO վߦίʔυ
    ͩͬͨ
    ύʔαͷελοΫ
    BSH b` QSJNBSZ
    ύʔα͸࣍ͷه߸͕baO`Ͱ͋Δͱ͖
    ه߸QSJNBSZʹରͯ͠ͲΜͳߏจنଇΛ
    ద༻͢Δ΂͖͔൑அ͢Δ

    View Slide

  72. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 90

    Stack now 0 2 88 367 90

    Reading a token

    lex_state: END -> BEG at line 9900

    parser_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: 2906

    arg : primary
    ߏจنଇʹैͬͯؐݩΛ։࢝
    ύʔαͷελοΫ
    BSH b` BSH
    ελοΫʹ
    BSH b` BSH͕ฒΜͩ
    ˞؆ུԽ͍ͯ͠·͢

    View Slide

  73. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 602

    Stack now 0 2 88 367 602

    Next 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: L2745

    arg : arg ‘+’ arg
    BSHb`BSHΛBSHʹؐݩ
    ߏจنଇʹैͬͯؐݩΛ։࢝
    ύʔαͷελοΫ
    BSH
    ˞؆ུԽ͍ͯ͠·͢

    View Slide

  74. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 602

    Stack now 0 2 88 367 602

    Next 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: L2745
    BSHBSHb`BSH
    \

    DBMM@CJO@PQ Q b ! !

    ^
    ˞؆ུԽ͍ͯ͠·͢

    ͜ͷߏจنଇʹ͸
    ߏจ໦Λ૊ΈཱͯΔͨΊͷ
    ΞΫγϣϯ͕ఆٛ͞Ε͍ͯΔ

    View Slide

  75. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 602

    Stack now 0 2 88 367 602

    Next 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: L2745
    BSHBSHb`BSH
    \

    DBMM@CJO@PQ Q b ! !

    ^

    View Slide

  76. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 602

    Stack now 0 2 88 367 602

    Next 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
    \

    DBMM@CJO@PQ Q b ! !

    ^
    ˞؆ུԽ͍ͯ͠·͢

    Ҿ਺ʹه߸ͷ஋Λ౉͍ͯ͠Δ
    ʜࠨͷBSHͷ஋ ਺஋

    b`ʜՃࢉه߸
    ʜӈͷBSHͷ஋ ਺஋

    // parse.y: L2745

    View Slide

  77. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 602

    Stack now 0 2 88 367 602

    Next 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: L2745
    BSHBSHb`BSH
    \

    DBMM@CJO@PQ Q b ! !

    ^

    View Slide

  78. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 602

    Stack now 0 2 88 367 602

    Next 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
    \

    DBMM@CJO@PQ Q b ! !

    ^
    // parse.y: L2745

    View Slide

  79. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 602

    Stack now 0 2 88 367 602

    Next 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ʹ
    ߏจ໦͕ඥ͍ͮͨঢ়ଶʹͳΔ

    View Slide

  80. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 88

    Stack now 0 2 88

    Next 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: 2051

    expr : arg
    BSHΛFYQSʹؐݩ
    ߏจنଇʹैͬͯؐݩΛ։࢝
    ύʔαͷελοΫ
    FYQS
    ˞؆ུԽ͍ͯ͠·͢

    View Slide

  81. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 75

    Stack now 0 2 75

    Next 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: 1853

    stmt : expr
    FYQSΛTUNUʹؐݩ
    ߏจنଇʹैͬͯؐݩΛ։࢝
    ύʔαͷελοΫ
    TUNU
    ˞؆ུԽ͍ͯ͠·͢

    View Slide

  82. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 73

    Stack now 0 2 73

    Next 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: 1635

    top_stmt : stmt
    TUNUΛUPQ@TUNUʹؐݩ
    ߏจنଇʹैͬͯؐݩΛ։࢝
    ύʔαͷελοΫ
    UPQ@TUNU
    ˞؆ུԽ͍ͯ͠·͢

    View Slide

  83. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 72

    Stack now 0 2 72

    Reducing 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: 1619

    top_stmts : top_stmt
    UPQ@TUNUΛUPQ@TUNUTʹؐݩ
    ߏจنଇʹैͬͯؐݩΛ։࢝
    ύʔαͷελοΫ
    UPQ@TUNUT
    ˞؆ུԽ͍ͯ͠·͢

    View Slide

  84. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 72

    Stack now 0 2 72

    Reducing 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Λ
    ɹಡΈࠐΜͰ͜ͷߦΛऴ୺ͤ͞Δ
    ɹඞཁ͕͋Δ
    ύʔαͷελοΫ
    UPQ@TUNUT
    ߏจղੳͷݱࡏ஍఺
    ˞վߦޙʹϝιουݺͼग़͠ͷAA υοτ
    ͕
    ɹଓ͘έʔε͸εΩϟφͰରԠ͍ͯ͠·͕͢
    ɹࠓճ͸ղઆΛׂѪ͠·͢

    View Slide

  85. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 71

    Stack now 0 2 71

    Next token is token '\n' (1.5-1.6: )

    Shifting token '\n' (1.5-1.6: ) baOΛγϑτ
    ࣍ͷه߸͸aO ߦ຤
    ͩͬͨ
    ύʔαͷελοΫ
    UPQ@TUNUT baO`

    View Slide

  86. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 310

    Stack now 0 2 71 310

    Reducing stack by rule 778 (line 6115):

    $1 = token '\n' (1.5-1.6: )

    -> $$ = nterm term (1.5-1.5: )

    // parse.y: 6115

    term : ‘\n’
    baO`ΛUFSNʹؐݩ
    ߏจنଇʹैͬͯؐݩΛ։࢝
    ύʔαͷελοΫ
    UPQ@TUNUT UFSN

    View Slide

  87. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 312

    Stack now 0 2 71 312

    Reducing stack by rule 779 (line 6122):

    $1 = nterm term (1.5-1.5: )

    -> $$ = nterm terms (1.5-1.5: )

    // parse.y: 6122

    terms : term
    UFSNΛUFSNTʹؐݩ
    ߏจنଇʹैͬͯؐݩΛ։࢝
    ύʔαͷελοΫ
    UPQ@TUNUT UFSNT

    View Slide

  88. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 312

    Stack now 0 2 71 312

    Reducing stack by rule 779 (line 6122):

    $1 = nterm term (1.5-1.5: )

    -> $$ = nterm terms (1.5-1.5: )

    ɾ͜͜·ͰͰ
    ɹaOΛղੳͰ͖ͨ
    ɾύʔα͸͜ͷίʔυ͕
    ɹ͜͜ͰऴΘΔͷ͔ɺ
    ɹ͜ͷޙ͞ΒʹߦҎ্ଓ͍͍ͯ͘ͷ͔Λ
    ɹࠓͷ࣌఺Ͱ͸·ͩ஌Βͳ͍
    ύʔαͷελοΫ
    UPQ@TUNUT UFSNT
    ߏจղੳͷݱࡏ஍఺

    View Slide

  89. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 313

    Stack now 0 2 71 313

    Reading a token

    ͦΕΛ֬ೝ͢ΔͨΊɺύʔα͸
    εΩϟφΛ࢖ͬͯ࣍ͷه߸ΛಡΈࠐΉ
    ࣍ͷه߸ΛಡΈࠐΉ

    View Slide

  90. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 313

    Stack now 0 2 71 313

    Reading a token

    Now at end of input.

    ͔͠͠ɺ͜ͷίʔυ͸͜ͷҰߦͰ
    ऴ͍ྃͯ͠ΔͷͰ࣍ͷߦ͸ଘࡏ͠ͳ͍
    ࣍ͷೖྗ͸ͳ͍

    View Slide

  91. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 313

    Stack now 0 2 71 313

    Reading a token

    Now at end of input.
    ࣍ͷೖྗ͸ͳ͍
    ύʔαͷελοΫ
    UPQ@TUNUT UFSNT
    ύʔα͸࣍ͷه߸͕ଘࡏ͠ͳ͍ͱ͖
    ه߸UFSNTʹରͯ͠ͲΜͳߏจنଇΛ
    ద༻͢Δ΂͖͔൑அ͢Δ

    View Slide

  92. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 313

    Stack now 0 2 71 313

    Reading a token

    Now 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: 6094

    opt_terms : terms
    UFSNTΛPQU@UFSNTʹؐݩ
    ߏจنଇʹैͬͯؐݩΛ։࢝
    ύʔαͷελοΫ
    UPQ@TUNUT PQU@UFSNT
    ελοΫʹ
    UPQ@TUNUT PQU@UFSNT͕ฒΜͩ

    View Slide

  93. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 311

    Stack now 0 2 71 311

    Reducing 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: 1606

    top_compstmt : top_stmts opt_terms
    UPQ@TUNUT PQU@UFSNTΛ
    UPQ@DPNQTUNUʹؐݩ
    ߏจنଇʹैͬͯؐݩΛ։࢝
    ύʔαͷελοΫ
    UPQ@DPNQTUNUT

    View Slide

  94. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 70

    Stack now 0 2 70

    Reducing stack by rule 2 (line 1580):

    $1 = nterm $@1 (1.0-1.0: )

    $2 = nterm top_compstmt (1.0-1.5: NODE_OPCALL)



    cmdarg_stack(pop): 0 at line 13166

    cond_stack(pop): 0 at line 13167

    -> $$ = nterm program (1.0-1.5: )

    // parse.y: 1580

    program : top_compstmt
    UPQ@DPNQTUNUΛQSPHSBNʹؐݩ
    ύʔαͷελοΫ
    QSPHSBN
    ߏจنଇʹैͬͯؐݩΛ։࢝

    View Slide

  95. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 70

    Stack now 0 2 70

    Reducing stack by rule 2 (line 1580):

    $1 = nterm $@1 (1.0-1.0: )

    $2 = nterm top_compstmt (1.0-1.5: NODE_OPCALL)



    cmdarg_stack(pop): 0 at line 13166

    cond_stack(pop): 0 at line 13167

    -> $$ = nterm program (1.0-1.5: )

    ύʔαͷελοΫ
    QSPHSBN
    ɾه߸QSPHSBN΁
    ɹؐݩ͢Δ͜ͱ͕Ͱ͖ͨͨΊ
    ɹύʔα͸͜͜·ͰͰ
    ɹߏจղੳΛऴྃ͢Δ
    ߏจղੳͷݱࡏ஍఺

    View Slide

  96. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 1

    Stack now 0 1

    Now at end of input.

    Shifting token "end-of-input" (1.6-1.6: )

    Entering state 3

    Stack now 0 1 3

    Stack now 0 1 3

    Cleanup: popping token "end-of-input" (1.6-1.6: )

    Cleanup: popping nterm program (1.0-1.5: )

    ελοΫΛۭʹͯ͠
    ਖ਼ৗʹೖྗ͕ऴΘͬͨ͜ͱΛ֬ೝ͠ɺ
    ॲཧΛऴྃ
    ޙॲཧͷͨΊɺ
    ೖྗͷऴྃΛදݱ͢Δه߸Λ
    ελοΫʹγϑτ

    View Slide

  97. ͨͷ͍͠3VCZͷߏจղੳπΞʔ
    $ ruby -ye ‘1 + 2’



    Entering state 1

    Stack now 0 1

    Now at end of input.

    Shifting token "end-of-input" (1.6-1.6: )

    Entering state 3

    Stack now 0 1 3

    Stack now 0 1 3

    Cleanup: popping token "end-of-input" (1.6-1.6: )

    Cleanup: popping nterm program (1.0-1.5: )


    a໨త஍΁౸ண
    ߏจղੳͷݱࡏ஍఺

    View Slide

  98. ͓͔ͭΕ͞·Ͱͨ͠
    3VCZͱҰॹʹ८ΔߏจղੳπΞʔ͸
    ͓ͨͷ͠Έ͍͚ͨͩͨͰ͠ΐ͏͔

    View Slide

  99. ·ͱΊ
    ɹɹΦϓγϣϯ͕͋Ε͹͍ͭͰ΋Ͳ͜Ͱ΋
    खܰʹߏจղੳϩάΛग़ྗͰ͖·͢
    QBSTFZϑΝΠϧ͕͋Ε͹ΑΓৄࡉʹ
    ߏจղੳͷ࣮ࡍΛ֬ೝ͢Δ͜ͱ͕Ͱ͖·͢

    -y
    Έͳ͞Μ΋ͥͻ͓खݩͷ.3*Ͱ͓ࢼ͍ͩ͘͠͞

    View Slide

  100. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠
    4QFDJBMUIBOLTUP ܟশུ

    !TQJLFPMBG
    !NJOFSPBPLJ
    ࢀߟॻ੶
    3VCZιʔείʔυ׬શղઆɹୈೋ෦ʮߏจղੳʯ
    IUUQTJMPWFSVCZOFUKBSIHCPPL

    3VCZͷ͘͠Έɹ̍ࣈ۟ղੳͱߏจղੳ

    View Slide