Slide 1

Slide 1 text

Ί΋Γʔ ೋ࿠ܥϥʔϝϯͷίʔϧͰֶͿ
 AST ղੳ PHP ΧϯϑΝϨϯεখాݪ 2024

Slide 2

Slide 2 text

Ί΋Γʔ m3m0r7 memory1994 m3m0r7 1994 ೥ 5 ݄ੜ·Εɻෳ਺ͷελʔτΞοϓ ΍্৔اۀͰιϑτ΢ΣΞΤϯδχΞɼΤ ϯδχΞϦϯάϚωʔδϟʔɼςοΫϦʔ υɼࣥߦ໾һ CTO ͳͲΛ୲͏ɻ

Slide 3

Slide 3 text

Slide 4

Slide 4 text

Έͳ͞Μ͸ɼ͜ͷΑ͏ͳढจΛݟͨ͜ͱ͋Γ·͔͢

Slide 5

Slide 5 text

ΞϒετϥΫτϚγϚγɾγϯλοΫεগ͠
 πϦʔϚγϚγ

Slide 6

Slide 6 text

ͦ͏ɼೋ࿠ܥϥʔϝϯͰ͢

Slide 7

Slide 7 text

͜ͷढจ͸ʮίʔϧʯͱ͍͍ɼணကલʹτοϐϯάΛ
 ௥ՃΦʔμʔ͢Δͱ͖ʹൃ͢ΔϫʔυͰ͢

Slide 8

Slide 8 text

͜ͷίʔϧ͸ෳࡶͦ͏ʹݟ͑·͕͢
 Ұఆͷ๏ଇʹج͍ͮͯจষ͕ߏ੒͞Ε͍ͯ·͢

Slide 9

Slide 9 text

ײͷྑ͍ਓ͸ؾ෇͍ͨ͸ͣͰ͢

Slide 10

Slide 10 text

ϓϩάϥϛϯάݴޠͱಉ͡Ͱ͢Ͷʢʁʣ

Slide 11

Slide 11 text

ຊ೔͸͜ͷίʔϧΛ୊ࡐʹ AST ղੳʹ͍ͭͯ
 ॳ৺ऀͷํͰ΋Θ͔Γ΍͘͢ղઆ͠·͢

Slide 12

Slide 12 text

AST ͱ͸Կ͔ ೋ࿠ܥϥʔϝϯͷίʔϧΛ AST ʹ͢Δ PHP ʹஔ͖׵͑ͯΈΑ͏ ΋͘͡

Slide 13

Slide 13 text

AST ͱ͸Կ͔

Slide 14

Slide 14 text

AST ͱ͸Կ͔ - AST ͸ Abstract Syntax Tree ͷུͰɼந৅ߏจ໦Λࢦ͠·͢ɻ - ͯ͞ɼ͜ͷ AST ͱ͍͏ϫʔυͩͬͨΓɼந৅ߏจ໦ͱ͍͏ݴ༿ʹύοͱདྷͳ ͍ํ΋ଟ͍ͷͰ͸ͳ͍Ͱ͠ΐ͏͔ɻ - ͦ΋ͦ΋ɼ͜ͷ AST ͸Ͳ͏͍͏໾ׂͳͷ͔ɼԿͷ໾ʹཱͭͷ͔Λղઆ͠· ͢ɻ AST ͱ͸Կ͔

Slide 15

Slide 15 text

AST ͷ໾ׂ

Slide 16

Slide 16 text

AST ͷ໾ׂ - AST ͸ύʔαʔʢParserɼߏจղੳثʣͰߦΘΕΔϓϩηεͷҰछͰ͢ɻ ύʔαʔ͸ಛఆͷݴޠΛ͋ΔҰఆͷҙຯΛղऍͯ͠෼ղ͍ͯ͘͠΋ͷͰ͢ɻ - ಛఆͷݴޠͱ͍͏ͷ͸ϓϩάϥϛϯάݴޠ΋ͦ͏Ͱ͢͠ɼࢲୡ͕࢖͍ͬͯΔ೔ ຊޠΛؚΉࣗવݴޠ΋ͦ͏Ͱ͢ɻզʑ͸ਓྨ͸ߴੑೳͳߏจղੳثͳͷͰ͢ɻ - ͦͷதͰɼAST ͷৼΔ෣͍͸؆ܿʹݴ͑͹ϓϩάϥϜͷߏ଄͔Βແବͳ΋ͷΛ ࡟ͬͯπϦʔঢ়ʹදͨ͠΋ͷͰ͢ɻ AST ͱ͸Կ͔

Slide 17

Slide 17 text

AST ͷ໾ׂ - ͦ΋ͦ΋ϓϩάϥϛϯάݴޠͷ΄ͱΜͲ͸Ͳ͏͍͏εςοϓͰղऍ͞ΕΔͷͰ ͠ΐ͏͔ɻ - echo "Hello World!" ; Λݩʹ࣍ͷϖʔδͰղઆ͠·͢ɻ AST ͱ͸Կ͔ echo "Hello World!";

Slide 18

Slide 18 text

ϓϩάϥϛϯάݴޠͷղऍ AST ͱ͸Կ͔ ࣈ۟ղੳʢLexical Analysisʣ ߏจղੳʢParseʣ ίϯύΠϧʢCompileʣ ࣮ߦ

Slide 19

Slide 19 text

ࣈ۟ղੳʢLexical Analysisʣ ϓϩάϥϛϯάݴޠͷղऍ AST ͱ͸Կ͔ ߏจղੳʢParseʣ ίϯύΠϧʢCompileʣ ࣮ߦ echo, (ۭന), "Hello World!", ; ͷ 4 ͭʹ෼ղ

Slide 20

Slide 20 text

ϓϩάϥϛϯάݴޠͷղऍ AST ͱ͸Կ͔ ߏจղੳʢParseʣ ίϯύΠϧʢCompileʣ ࣮ߦ ʮ"Hello World!" Λग़ྗ͢Δʯͱ͍͏ҙຯΛ༩͑Δ ࣈ۟ղੳʢLexical Analysisʣ

Slide 21

Slide 21 text

ϓϩάϥϛϯάݴޠͷղऍ AST ͱ͸Կ͔ ߏจղੳʢParseʣ ίϯύΠϧʢCompileʣ ࣮ߦ ػցޠʹ຋༁͠·͢ɻʢPHP ͷΑ͏ͳʣݴޠʹ Αͬͯ͸ VM ্Ͱѻ͍΍͘͢͢ΔͨΊɼ
 தؒݴޠʹม׵͞ΕΔ͜ͱ΋͋Γ·͢ɻ ࣈ۟ղੳʢLexical Analysisʣ

Slide 22

Slide 22 text

ϓϩάϥϛϯάݴޠͷղऍ AST ͱ͸Կ͔ ߏจղੳʢParseʣ ίϯύΠϧʢCompileʣ ࣮ߦ ϥϯλΠϜʹΑ࣮ͬͯߦ ͞Ε·͢ ࣈ۟ղੳʢLexical Analysisʣ

Slide 23

Slide 23 text

ϓϩάϥϛϯάݴޠͷղऍ - ͜͜ͰΑ͘ग़ͯ͘Δͷ͕ɼΠϯλϓϦλݴޠͳͷ͔ίϯύΠϥݴޠͱ͍͏Ωʔ ϫʔυͰ͢ɻ - ͱ͘ʹɼPHP ͸ΠϯλϓϦλݴޠͱݴΘΕ͍ͯ·͕͢ɼͦ΋ͦ΋Ͳ͏͍͏
 ཁ݅Ͱ 2 छྨ͕࢖͍෼͚ΒΕ͍ͯΔͷͰ͠ΐ͏͔ɻ - ࣍ͷϖʔδͰղઆͯ͠Έ·͢ɻ AST ͱ͸Կ͔

Slide 24

Slide 24 text

ϓϩάϥϛϯάݴޠͷղऍ AST ͱ͸Կ͔ ߏจղੳʢParseʣ ίϯύΠϧʢCompileʣ ࣮ߦ ͜ΕΒͷॲཧΛஞ࣍ʹߦ͏ͷ͕ ΠϯλϓϦλݴޠͰ͢ɻ ࣈ۟ղੳʢLexical Analysisʣ Rust ΍ Go ͳͲ͸ػցޠʹ຋༁͞Ε·͢ɻ
 PHP ΍ Ruby ͸Ұ౓தؒݴޠʢΦϖίʔυʣʹ
 ຋༁͞Ε͔ͯΒ Zend VM , RubyVM ্Ͱ
 ࣮ߦ͞Ε·͢ Rust ΍ Go ͳͲ͸ػցޠʹ຋༁͞Ε·͢ɻ
 PHP ΍ Ruby ͸Ұ౓தؒݴޠʢΦϖίʔυʣʹ
 ຋༁͞Ε͔ͯΒ Zend VM , RubyVM ্Ͱ
 ࣮ߦ͞Ε·͢

Slide 25

Slide 25 text

ϓϩάϥϛϯάݴޠͷղऍ AST ͱ͸Կ͔ ߏจղੳʢParseʣ ίϯύΠϧʢCompileʣ ࣮ߦ ࣈ۟ղੳʢLexical Analysisʣ ΠϯλϓϦλݴޠͷ৔߹ɼίϯύΠϧɼதؒݴޠ ͷม׵ͷϓϩηε͕ͳ͍
 ৔߹΋͋Γ·͢ʢbash ͱ͔ shʣ

Slide 26

Slide 26 text

ϓϩάϥϛϯάݴޠͷղऍ AST ͱ͸Կ͔ ߏจղੳʢParseʣ ίϯύΠϧʢCompileʣ ࣮ߦ ※1 Java ͸ JVM ༻ͷதؒݴޠʹίϯύΠϧ͞Ε·͢͠ɼC/C++, Rust ͳͲ͸ػցޠ΁ίϯύΠϧ͞Ε·͢ɻ ࣈ۟ղੳʢLexical Analysisʣ ίϯύΠϧݴޠ͸
 தؒݴޠʢ·ͨ͸࣮ߦϑΝΠϧʣ※1 ΁ͷ
 ίϯύΠϧͷϓϩηε͕ "ඞͣ" ͋Γ

Slide 27

Slide 27 text

ϓϩάϥϛϯάݴޠͷղऍ AST ͱ͸Կ͔ ߏจղੳʢParseʣ ίϯύΠϧʢCompileʣ ࣮ߦ ίϯύΠϧݴޠ͔Ͳ͏͔͸ίϯύΠϧޙͷ
 ϑΝΠϧΛ഑෍Ͱ͖ɼͦΕ͕७ਮʹ OS ্Ͱ࣮ߦ Ͱ͖Δ͔ΛҰͭ؍఺ͱஔ͘ͱྑ͍͔ͳͱࢥ͍·͢ C, C++, Java, Rust ͳͲ͕ίϯύΠϥݴޠͰ͢※1 ※1 Go ΋ίϯύΠϥݴޠͱݴΘΕ͍ͯ·͕͢ go run ͷΑ͏ͳҰ࿈ͷॲཧΛߦͬͯ͘ΕΔػೳ΋උΘ͓ͬͯΓ೥ʑ
 ΠϯλϓϦλݴޠ΋ίϯύΠϥݴޠ΋ڥք͕ͳ͘ͳ͖͍ͬͯͯΔΑ͏ʹࢥ͍·͢ɻ΄͔ʹ΋ TypeScript ͷΑ͏ͳ
 τϥϯεύΠϥΛඞཁͱ͢Δݴޠ͸ҰݟίϯύΠϥݴޠͷΑ͏ʹݟ͑·͕͢ɼ࣮ଶ͸ΠϯλϓϦλݴޠͷ JavaScript Ͱ ಈ࡞͍ͯ͠ΔͷͰ… ͜ͷล͸ͦΜͳ΋ΜͳΜͩͳʔ͘Β͍Ͱଊ͓͍͑ͯͯ໰୊ͳ͍Ͱ͠ΐ͏ ࣈ۟ղੳʢLexical Analysisʣ

Slide 28

Slide 28 text

ϓϩάϥϛϯάݴޠͷղऍ - ࣈ۟ղੳΛߦ͏ϓϩάϥϜΛࣈ۟ղੳثʢLexer, Lexical Analyzer, Tokenizer ͳͲͱ΋ʣɼߏจղੳΛߦ͏ϓϩάϥϜΛߏจղੳثʢParserʣͱݺͼ·͢ɻ - ʮ೔ຊޠʯΛղੳ͢Δࡍʹ͸ɼܗଶૉʹ෼ղ͢ΔࡍʹτʔΫφΠβʔʹ͍ۙ
 ܗଶૉղੳʢMorphological AnalysisɼϞϧϑΥʔϩδΧϧΞφϦγεʣΛ༻ ͍Δ͜ͱ͕͋Γ·͢ɻ - ܗଶૉղੳثͷஶ໊Ͳ͜Ζ͸ MeCab ΍ Sudachi ͳͲ͕͋Γ·͢ɻ AST ͱ͸Կ͔

Slide 29

Slide 29 text

AST ͷ໾ׂ - ϓϩάϥϛϯάݴޠͷॲཧͷྲྀΕͷΠϝʔδ͕෇͍ͨͱ͜ΖͰɼAST ͷ໾ׂͷ ࿩ʹ໭Γ·͠ΐ͏ɻ - ઌ΄Ͳͷߏจղੳͷ͋ͱͷ۩৅ߏจΛΑΓந৅Խ͠ҙຯΛ༩͑Δʢσʔλߏ଄ ʹ͢ΔʣϓϩηεͷҰ͕ͭɼ͜ͷந৅ߏจ໦ʢASTʣͳͷͰ͢ɻͭ·Γ AST ͸ σʔλߏ଄ͷҰछͰ΋͋Γ·͢ɻ - ϓϩάϥϜ্Ͱ͸ॏཁͳҙຯΛ࣋ͭΧοί΍ηϛίϩϯͳͲؚ͕·Ε͍ͯΔ΋ͷ Λ۩৅ߏจͱ͍͍ɼͦΕΒΛऔΓআ͍ͨ΋ͷ͕ந৅ߏจ໦ͩͱߟ͑ΔͱΘ͔Γ ΍͍͢Ͱ͠ΐ͏ɻ AST ͱ͸Կ͔

Slide 30

Slide 30 text

AST ͷ໾ׂ - ϓϩάϥϛϯάݴޠΛॲཧ͢ΔࡍʹɼϊΠδʔͳ৘ใؚ͕·ΕΔͱѻ͍ͮΒ͍ Ͱ͢ɻྫ͑͹ (a + b) * c Λॲཧ͢Δͱ͖ɼ͍͍ͪͪߏจղੳͷࡍʹ (a + b) Λ ॲཧ͢Δͷ͸൥Θ͍͠Ͱ͢ɻ - ॳΊ͔Βɼ(a + b) ͸ * c ΑΓ΋ܭࢉͷ༏ઌ౓͕ߴ͍ͱ͍͏ҙຯʹ߹க͍ͯ͠Δ σʔλߏ଄ʹͳ͍ͬͯΕ͹ྑ͍͸ͣͰ͢ɻ͜ΕΛදݱ͢Δͷʹ͓͍ͯ͸πϦʔ ঢ়ʹѻ͏ͷ͕౎߹͕ྑ͍ͷͰ͢ɻ AST ͱ͸Կ͔ (a + b) * c

Slide 31

Slide 31 text

ʮΑ͘Θ͔ΒΜʯͦΜͳ੠͕ฉ͖͑ͯ͜·͢

Slide 32

Slide 32 text

Ͱ΋҆৺͍ͯͩ͘͠͞

Slide 33

Slide 33 text

͜ͷந৅ߏจ໦Ͱ͕͢

Slide 34

Slide 34 text

ೋ࿠ܥϥʔϝϯͷίʔϧʹ΋ద༻Ͱ͖·͢

Slide 35

Slide 35 text

Ͱ͸ɼૣ଎ղઆ͍͖ͯ͠·͢

Slide 36

Slide 36 text

ೋ࿠ܥϥʔϝϯͷίʔϧΛ AST ʹ͢Δ

Slide 37

Slide 37 text

ʮೋ࿠ܥϥʔϝϯʯΛ஌͍ͬͯΔਓʙʁ

Slide 38

Slide 38 text

ࠓ೔׆༻͢Δͷ͸ϥʔϝϯಲࢁͷίʔϧͰ͢

Slide 39

Slide 39 text

ը૾ͷҾ༻ݩ: ϥʔϝϯಲࢁެࣜαΠτ https://www.butayama.com/

Slide 40

Slide 40 text

ʮχϯχΫϚγϚγ໺ࡊϚγϚγΧϥϝʯ

Slide 41

Slide 41 text

͜Μͳײ͡Ͱίʔϧ͠·͢

Slide 42

Slide 42 text

ઌ΄Ͳͷࣈ۟ղੳ͔Β࣮ߦ·Ͱͷ
 ϑϩʔʹরΒ͠߹ΘͤͯΈΔͱ

Slide 43

Slide 43 text

ʮχϯχΫ͍Ε·͔͢ʁʯ͔Β࣮ߦ·Ͱͷϑϩʔ ೋ࿠ܥϥʔϝϯͷίʔϧΛ AST ʹ͢Δ ࣈ۟ղੳʢLexical Analysisʣ ߏจղੳʢParseʣ ίϯύΠϧʢCompileʣ ࣮ߦʢϥʔϝϯͷఏڙʣ ೋ࿠ܥϥʔϝϯ͸ɼࣈ۟ղੳ͔Β
 ߏจղੳɼ࣮ߦ·Ͱελοϑ͕୲͏ͷͰ
 ΠϯλϓϦλϥʔϝϯͰ͢ ίϯύΠϧ͸ಛʹ͠ͳ͍ɻ
 ͢Δͱͨ͠ΒϑϦʔζυϥΠʹͳΔ͔ʢʁʣ χϯχΫ͍Ε·͔͢ʁ ʮχϯχΫϚγϚγ໺ࡊϚγϚγΧϥϝʯ

Slide 44

Slide 44 text

͜ΕΛࣈ۟ղੳͯ͠τʔΫϯʹ෼ղ͢Δͱ…

Slide 45

Slide 45 text

χϯχΫ Ϛγ ໺ࡊ Ϛγ Ϛγ Ϛγ Χϥ ϝ

Slide 46

Slide 46 text

τοϐϯά͸ϥʔϝϯΛߏ੒͢Δ
 ύϥϝʔλͳͷͰ…

Slide 47

Slide 47 text

χϯχΫ Ϛγ ໺ࡊ Ϛγ Ϛγ Ϛγ Χϥ ϥʔϝϯ ϝ

Slide 48

Slide 48 text

೔ຊޠͷ··ͩͱѻ͍ͮΒ͍ͷͰ
 ӳ਺ࣈͰ໊લΛ͚ͭ·͢

Slide 49

Slide 49 text

T_GARLIC T_ADD T_VEG T_ADD T_ADD T_ADD T_STONG RAMEN T_ADD Χϥʮϝʯ΋ɼ௥ՃͳͷͰ
 T_ADD Ͱ໰୊ͳ͍ χϯχΫΛ T_GARLIC ʹ ໺ࡊΛ T_VEG (ETABLE) ʹ Χϥ(ϝ) Λ T_STRONG ʹ ϚγΛ T_ADD ʹ

Slide 50

Slide 50 text

ߏจղੳΛߦ͏ͱ…

Slide 51

Slide 51 text

T_GARLIC T_ADD T_VEG T_ADD T_ADD T_ADD T_STONG RAMEN T_ADD ϥʔϝϯ΁ͷτοϐϯά৘ใ ʮχϯχΫʯʹର͢Δݸ਺ͷࢦࣔ ʮ໺ࡊʯʹର͢Δݸ਺ͷࢦࣔ ຯͷೱ͞ʹର͢Δࢦࣔ

Slide 52

Slide 52 text

ந৅ߏจ໦ʹ͢Δͱ…

Slide 53

Slide 53 text

RAMEN Attr\Garlic Attr\Veg Attr\Strong ADD: 2 ADD: 2 ADD: 1 T_ADD 2 ͭ͸ T_GARLIC ʹଐ͢Δ৘ใ΁ T_ADD 2 ͭ͸ T_VEG ʹଐ͢Δ৘ใ΁ T_ADD ͸ T_STRONG ʹଐ͢Δ৘ใ΁ Attr\Garlic ͸ RAMEN ʹ
 ଐ͢Δ෇Ճ৘ใ Attr\Strong ͸ RAMEN ʹ
 ଐ͢Δ৘ใ Attr\Strong ͸ RAMEN ʹ
 ଐ͢Δ৘ใ

Slide 54

Slide 54 text

RAMEN Attr\Garlic Attr\Veg Attr\Strong ADD: 2 ADD: 2 ADD: 1 Attr\Garlic ͸ ADD ͱ͍͏
 ύϥϝʔλΛ࣋ͭ෇Ճ৘ใ Attr\Veg ͸ ADD ͱ͍͏
 ύϥϝʔλΛ࣋ͭ෇Ճ৘ใ Attr\Strong ͸ ADD ͱ͍͏
 ύϥϝʔλΛ࣋ͭ෇Ճ৘ใ

Slide 55

Slide 55 text

͜ͷΑ͏ʹπϦʔঢ়ʹͳΓ
 ແବͳ৘ใʢT_ADDʣ͕࡟ΒΕ·ͨ͠

Slide 56

Slide 56 text

࣮ͦͯ͠ߦʢϥʔϝϯΛΞ΢τϓοτʣ͢Δͱ…

Slide 57

Slide 57 text

ը૾ͷҾ༻ݩ: ϫΠͷεϚϗ

Slide 58

Slide 58 text

͜͏ͳΓ·͢

Slide 59

Slide 59 text

ͦ΋ͦ΋ɼந৅ߏจ໦ʹ͢Δ
 ࣈ۟ղੳثɾߏจղੳث͸
 Ͳ͏͍͏࢓૊ͳͷͰ͠ΐ͏͔

Slide 60

Slide 60 text

࣍અͰղઆ͠·͢

Slide 61

Slide 61 text

ࣈ۟ղੳثɾߏจղੳثͷ࢓૊Έ

Slide 62

Slide 62 text

ࣈ۟ղੳثɾߏจղੳثͷ࢓૊Έ - ࣈ۟ղੳثɾߏจղੳث͸ΦʔτϚτϯͷ֓೦Λ༻͍Δ͜ͱ͕΄ͱΜͲͰ͢ɻ தͰ΋༗ݶΦʔτϚτϯ͸ɼ༗ݶͷঢ়ଶΛ࣋ͪೖྗʢࠓճͷ৔߹͸ʮχϯχΫ ϚγϚγ໺ࡊϚγϚγΧϥϝʯίʔϧʣʹԠͯ͡ঢ়ଶ͕มԽ͢Δந৅తͳػց Ͱ͢ɻ - ࣈ۟ղੳͰ͸ΦʔτϚτϯͷ֓೦͕༻͍ΒΕʢಛʹܾఆత༗ݶΦʔτϚτϯ ʢDFA, Deterministic Finite AutomatonʣʣɼߏจղੳͰ͸τοϓμ΢ϯߏ จղੳʢLL ύʔαʔͳͲʣ΍ϘτϜΞοϓߏจղੳʢLR ύʔαʔʣͳͲ͕༻ ͍ΒΕ·͢ɻ ࣈ۟ղੳثɾߏจղੳثͷ࢓૊Έ

Slide 63

Slide 63 text

ࣈ۟ղੳثɾߏจղੳثͷ࢓૊Έ ࣈ۟ղੳثɾߏจղੳثͷ࢓૊Έ - ͜ΕΒʹ͍ͭͯղઆ͢Δ͚ͩͰ΋஻Δωλ͕๛෋ʹͳͬͯ͠·ͬͯ࣌ؒ಺ʹऴΘΒͳ ͍ͷͰɼࠓճ͸͞ΘΓ͚ͩͰղઆ͠·͢ɻʢχϯχΫͰղઆʣ - ࣈ۟ղੳͷ༗ݶΦʔτϚτϯͷঢ়ଶભҠ͸ɼ؆қతʹॻ͘ͱҎԼͷΑ͏ʹͳΓ·͢ɻ ʢ஫ʣS ͸ State ΑΓɻq ͱॻ͘͜ͱ΋͋Γ·͢ʢͨͿΜ Queue ͕༝དྷʁʣɻ੺৭͸डཧঢ়ଶΛ͍ࣔͯ͠·͢ɻ ࣍ʹظ଴͢Δঢ়ଶ ભ Ҡ ݩ ೋ ϯ ೋ Ϋ S1 S2 S2 S3 S3 S4 S4 S5

Slide 64

Slide 64 text

ܾఆత༗ݶΦʔτϚτϯʢDFAʣͷҰྫ ࣈ۟ղੳثɾߏจղੳثͷ࢓૊Έ S1 S2 S3 S4 ॳظঢ়ଶ ˕͸डཧঢ়ଶ ೋ ϯ ೋ Ϋ S5 ໺ S..N Χ ຊདྷ͸͜ΕΒ΋͋Γ·͢͠ɼ
 ΋ͬͱεςʔτͷ਺΋ଟ͍Ͱ͕͢
 ࢴ෯ͷ౎߹ͰղઆΛলུ͠·͢ Σ = {χ, ϯ, χ, Ϋ} ೖྗ ϥϝ ࡊ

Slide 65

Slide 65 text

ܾఆత༗ݶΦʔτϚτϯʢDFAʣͷҰྫ ࣈ۟ղੳثɾߏจղੳثͷ࢓૊Έ S1 S2 S3 S4 ॳظঢ়ଶ ೋ Σ = {χ, ϯ, χ, Ϋ} ೖྗ

Slide 66

Slide 66 text

ܾఆత༗ݶΦʔτϚτϯʢDFAʣͷҰྫ ࣈ۟ղੳثɾߏจղੳثͷ࢓૊Έ S1 S2 S3 S4 ॳظঢ়ଶ ϯ Σ = {χ, ϯ, χ, Ϋ} ೖྗ ೋ

Slide 67

Slide 67 text

ܾఆత༗ݶΦʔτϚτϯʢDFAʣͷҰྫ ࣈ۟ղੳثɾߏจղੳثͷ࢓૊Έ S1 S2 S3 S4 ॳظঢ়ଶ ೋ Σ = {χ, ϯ, χ, Ϋ} ೖྗ ϯ ೋ

Slide 68

Slide 68 text

ܾఆత༗ݶΦʔτϚτϯʢDFAʣͷҰྫ ࣈ۟ղੳثɾߏจղੳثͷ࢓૊Έ S1 S2 S3 S4 ॳظঢ়ଶ ೋ ϯ ೋ Ϋ Σ = {χ, ϯ, χ, Ϋ} ೖྗ डཧঢ়ଶͰऴྃͨ͠ͷͰʮडཧʯ͞ΕΔ ʢτʔΫϯͱͯ͠ѻΘΕΔʣ

Slide 69

Slide 69 text

PHP ͷ echo ʹஔ͖׵͑ͯΈ·͠ΐ͏

Slide 70

Slide 70 text

ܾఆత༗ݶΦʔτϚτϯʢDFAʣͷҰྫ ࣈ۟ղੳثɾߏจղੳثͷ࢓૊Έ S1 S2 S3 S4 ॳظঢ়ଶ e Σ = {e, c, h, o} ೖྗ

Slide 71

Slide 71 text

ܾఆత༗ݶΦʔτϚτϯʢDFAʣͷҰྫ ࣈ۟ղੳثɾߏจղੳثͷ࢓૊Έ S1 S2 S3 S4 ॳظঢ়ଶ c Σ = {e, c, h, o} ೖྗ e

Slide 72

Slide 72 text

ܾఆత༗ݶΦʔτϚτϯʢDFAʣͷҰྫ ࣈ۟ղੳثɾߏจղੳثͷ࢓૊Έ S1 S2 S3 S4 ॳظঢ়ଶ h Σ = {e, c, h, o} ೖྗ c e

Slide 73

Slide 73 text

ܾఆత༗ݶΦʔτϚτϯʢDFAʣͷҰྫ ࣈ۟ղੳثɾߏจղੳثͷ࢓૊Έ S1 S2 S3 S4 ॳظঢ়ଶ e c h o Σ = {e, c, h, o} ೖྗ डཧঢ়ଶͰऴྃͨ͠ͷͰʮडཧʯ͞ΕΔ ʢτʔΫϯͱͯ͠ѻΘΕΔʣ

Slide 74

Slide 74 text

ࣈ۟ղੳثɾߏจղੳثͷ࢓૊Έ - χϯχΫ ΍ Ϛγ Ͱडཧঢ়ଶʹͳͬͨλΠϛϯάͰ T_GARLIC ΍ T_ADD ͷ Α͏ͳτʔΫϯʹ෼ղ͞Ε·͢ɻ - ͜Ε͸ܗଶૉղੳͰ΋ίʔύεʢૹΓԾ໊ͱ͔͋ΔࣙॻΈ͍ͨͳ΋ͷʣΛ༻͍ Δ఺Ҏ֎ʹ͓͍ͯ͸ɼ͓͓ΑͦࣅͨΑ͏ͳ࢓૊ΈͰ͢ɻ͕ɼ࿩͕๲ΕΔͷͰׂ Ѫ͠·͢ɻ - ͦͯ͠ɼτʔΫϯʹ෼ղͨ͋͠ͱʹɼઌ΄Ͳ৮Εͨ LL ๏΍ LR ๏ͳͲΛ༻͍ ͯந৅ߏจ໦ʢASTʣʹ͍͖ͯ͠·͢ɻ؆қతʹ࡞ΔͳΒ͹࣮૷͕ൺֱత༰қ ͳ LL ๏ͳͲ͕͓͢͢ΊͰ͢ɻ ࣈ۟ղੳثɾߏจղੳثͷ࢓૊Έ χϯχΫ Ϛγ T_GARLIC T_ADD

Slide 75

Slide 75 text

ࣈ۟ղੳثɾߏจղੳثͷ࢓૊Έ - ߏจղੳثͰ͸จͷ్தʹ͋Δ + ΍ - ͳͲ͔Βߏจ໦Λ࡞͍͖ͬͯ·͢ɻLL ๏ͩͱಛʹ͜͏͍ͬͨ΋ͷΛ BNF ه๏ͳͲΛ༻͍ͯهड़͠·͢ɻPHP ͷΑ͏ ͳݴޠΛߏจղੳ͢Δʹ͸ BNF ه๏ʹࣅͨܗͰఆٛͰ͖ΔɼYacc (Yet Another Compiler Compiler) ΍ Bison ͳͲͷύʔαδΣωϨʔλ͕༻͍ΒΕ ͍ͯ·͢ɻ - PHP ຊମʹ΋͋Γ·͢: https://github.com/php/php-src/blob/php-8.3.4/ Zend/zend_language_parser.y ࣈ۟ղੳثɾߏจղੳثͷ࢓૊Έ

Slide 76

Slide 76 text

ࣈ۟ղੳثɾߏจղੳثͷ࢓૊Έ - ΋ͪΖΜ࢖Θͳͯ͘΋ߏจղੳثΛؾ߹Ͱ࣮૷ͯ͠ந৅ߏจ໦ʹ͢Δ͜ͱ΋Մ ೳͰ͢ɻ - ڈ೥ PHP Ͱࡶʹ࡞ͬͨి୎Ͱɼ4 * sqrt((5! + 2 ** 8) - (4! + 2 ** 8)) + 5 ͷΑ͏ ͳෳࡶͳܭࢉࣜΛܭࢉͰ͖ΔΑ͏ͳࣈ۟ղੳͱߏจղੳثʢந৅ߏจ໦ʣʹม ׵࣮ͯ͠ߦ·ͰҰ࿈Ͱߦ͏αϯϓϧ͕͋ΔͷͰɼࢀߟʹͰ͖Δͱࢥ͍·͢ɻ - https://gist.github.com/m3m0r7/a5a5af3eb8d118fae78f6a9e18657ec4 ࣈ۟ղੳثɾߏจղੳثͷ࢓૊Έ ※1 PHP ຊମʹ΋͋Γ·͢ https://github.com/php/php-src/blob/php-8.3.4/Zend/zend_language_parser.y 4 * sqrt((5! + 2 ** 8) - (4! + 2 ** 8)) + 5

Slide 77

Slide 77 text

ೋ࿠ܥϥʔϝϯͷίʔϧΛந৅ߏจ໦ʹͨ͠Α͏ʹ
 PHP ΋ಉ༷ʹ࢓૊ΈͰந৅ߏจ໦ ʹͯ͠Έ·͠ΐ͏

Slide 78

Slide 78 text

PHP ʹஔ͖׵͑ͯΈΑ͏

Slide 79

Slide 79 text

PHP ʹஔ͖׵͑ͯΈΑ͏ - PHP Ͱந৅ߏจ໦ʢASTʣʹ͢Δ༗໊Ͳ͜Ζͱ͍͑͹ɼnikic/PHP-Parser Ͱ ͠ΐ͏͔ɻPHPStan ͳͲ͕༻͍͍ͯ·͢ʢ※1ʣɻ - ͦ΋ͦ΋ɼnikic/PHP-Parser ͸Ͳ͏͍͏࢓૊ΈͰಈ͍͍ͯΔͷͰ͠ΐ͏͔ɻ - ࣮͸ɼ͍͍ͩͨઌ΄Ͳͷϥʔϝϯೋ࿠ͷίʔϧΛߏจղੳ͢Δͷͱಉ͡࢓૊Έ Ͱ͢ɻͲ͏͍͏͜ͱͰ͠ΐ͏͔ɻ࣍ͷϖʔδͰղઆ͍͖ͯ͠·͢ɻ PHP ʹஔ͖׵͑ͯΈΑ͏ ※1: https://github.com/phpstan/phpstan-src/blob/1.11.x/composer.json#L24

Slide 80

Slide 80 text

Slide 81

Slide 81 text

͜ͷίʔυΛ nikic/PHP-Parser ʹ͔͚Δͱ…

Slide 82

Slide 82 text

ઌ΄Ͳͷೋ࿠ܥϥʔϝϯͷίʔϧ΋
 ࣅͨΑ͏ͳܗͰදͤ·͢

Slide 83

Slide 83 text

͜ΕΛπϦʔͰද͢ͱ…

Slide 84

Slide 84 text

Namespace Echo BinaryOp\Concat BinaryOp\Plus String BinaryOp\Plus Int Int Int …stmts …exprs BinaryOp\Concat exprs stmts value: \n value: 3 value: 2 value:1 left left left right right right ʢ஫ʣStmt_ ΍ Expr_ , Scalar_ ͸লུ

Slide 85

Slide 85 text

গ͠ෳࡶͰ͕͢ɼೋ࿠ܥϥʔϝϯͷίʔϧͷ
 πϦʔͱ΄΅ಉ͡ʹݟ͑·͢Ͷʁ

Slide 86

Slide 86 text

͜ΕΛ࣮ߦ͢Δͱ…

Slide 87

Slide 87 text

Namespace Echo BinaryOp\Concat BinaryOp\Plus String Int Int …stmts …exprs BinaryOp\Concat exprs stmts value: \n value: 3 value: 3 left left right right BinaryOp\Plus ʹΑͬͯՃࢉ

Slide 88

Slide 88 text

Namespace Echo BinaryOp\Concat Int String …stmts …exprs BinaryOp\Concat exprs stmts value: \n left right value: 6 BinaryOp\Plus ʹΑͬͯՃࢉ

Slide 89

Slide 89 text

Namespace Echo BinaryOp\Concat …stmts …exprs String exprs stmts right value: 6\n BinaryOp\Concat ʹΑͬͯ 6 ͱ \n ͕݁߹

Slide 90

Slide 90 text

Namespace Echo …stmts stmts out: 6\n Echo ʹΑͬͯ 6\n Λग़ྗ

Slide 91

Slide 91 text

ந৅ߏจ໦ (AST) ʹ͍ͭͯগ͠
 Θ͔ΔΑ͏ʹͳͬͯ͘ΕͨΒ޾͍Ͱ͢

Slide 92

Slide 92 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠