Slide 1

Slide 1 text

-3QBSTFS͸͍͍ͧ 4VOEBZ .BZ  ,FSOFM7.୳ݕୂ!ؔ੢ճ໨ !ZEBI :VEBJ5BLBEB

Slide 2

Slide 2 text

XIPBNJ ߴా༤େ:VEBJ5BLBEB (JU)VCZEBI 5XJUUFSZEBI@ 4PGUXBSFFOHJOFFS $3VCZDPNNJUUFS NBJOMZEFWFMPQQBSTFSSFMBUFEGFBUVSFT "DPNNJUUFSPGSVCZMSBNB-"-3QBSTFSHFOFSBUPS $IJFGPSHBOJ[FSPG,BOTBJ3VCZ,BJHJ !ઌేொՎ෣࿅৔

Slide 3

Slide 3 text

3VCZ,BJHJQIPUP IUUQTYDPN-JUUMF@3VCZJTUTUBUVT .F

Slide 4

Slide 4 text

3VCZͰ͸ࠓ1BSTFS͕೤͍ 3VCZ,BJHJͰ͸͜͜೥ؒͰηογϣϯ ࠓ೥΋ηογϣϯ 3VCZʹ͸ࠓೋͭͷ1BSTFS͕ଘࡏ͍ͯ͠Δ ϑϧεΫϥονͰ࣮૷͢Δखॻ͖1BSTFS ύʔαʔδΣωϨʔλʹΑͬͯੜ੒͞ΕΔ1BSTFS ࠓ೔͸ͬͪ͜ͷ࿩

Slide 5

Slide 5 text

1BSTFSͱ͸ จ๏نଇʹैͬͯهड़͞ΕͨςΩετΛղੳ͠ɺϓϩάϥϜͰѻ͑ΔΑ͏ ͳσʔλߏ଄ʹม׵͢ΔϓϩάϥϜ΍ɺͦͷॲཧΛࢦ͢ 1BSTFSͷ͓࢓ࣄ ೖྗ͞ΕͨςΩετ΍σʔλͷಡऔʢࣈ۟ղੳʣ จ๏نଇʹैͬͯղੳ ߏ଄Խ͞Εͨσʔλʢଟ͘ͷ৔߹ɺߏจ໦΍τʔΫϯྻʣʹม׵

Slide 6

Slide 6 text

1BSTFSͱ-FYFS ࣈ ۟ ղ ੳ ث ߏ จ ղ ੳ ث จࣈྻ όΠτྻ τʔΫϯྻ ந৅ߏจ໦ "45

Slide 7

Slide 7 text

1BSTFSͱ-FYFS ࣈ ۟ ղ ੳ ث ߏ จ ղ ੳ ث จࣈྻ όΠτྻ τʔΫϯྻ ந৅ߏจ໦ "45

Slide 8

Slide 8 text

-FYFS def method_name(param) puts param end ೖྗ͸ίʔυͷจࣈྻ

Slide 9

Slide 9 text

-FYFS ॲཧܥ͔ΒݟΔͱόΠτྻ จࣈͷฒͼΛղੳ͠ɺҙຯͷ͋Δ࠷খͷ୯ҐʢτʔΫϯʣʹ෼ղ͢Δ 64 65 66 20 6d 65 74 68 6f 64 5f 6e 61 6d 65 28 70 61 72 61 6d 29 0a 20 20 70 75 74 73 20 70 61 72 61 6d 0a 65 6e 64 def method_name param

Slide 10

Slide 10 text

1BSTFSͱ-FYFS ࣈ ۟ ղ ੳ ث ߏ จ ղ ੳ ث จࣈྻ όΠτྻ τʔΫϯྻ ந৅ߏจ໦ "45

Slide 11

Slide 11 text

1BSTFS τʔΫϯྻ͕จ๏తʹਖ਼͍͔͠Λݕࠪͯ͠ந৅ߏจ໦ "45 Λ࡞੒͢Δ def method_name(param) puts param end defn ar g s body fcall puts ar g s '(' keyword_def tIDENTIFIER tIDENTIFIER ')' ...

Slide 12

Slide 12 text

1BSTFSHFOFSBUPS 構 文 解 析 器 生 成 器 จ๏ϑΝΠϧ 1BSTFS

Slide 13

Slide 13 text

1BSTFSHFOFSBUPS 構 文 解 析 器 生 成 器 จ๏ϑΝΠϧ 1BSTFS

Slide 14

Slide 14 text

จ๏ϑΝΠϧ #/' #BDLVTr/BVS'PSN Ͱจ๏Λهड़͢Δ #/'ͱ͸จ๏نଇΛఆٛ͢ΔͨΊͷه๏Ͱɺਓؒʹͱͬͯ௚ײతͰཧղ͠΍͍͢ expr : NUMBER { $$ = $1; } | expr '+' expr { $$ = $1 + $3; } ;

Slide 15

Slide 15 text

1BSTFSHFOFSBUPS 構 文 解 析 器 生 成 器 จ๏ϑΝΠϧ 1BSTFS

Slide 16

Slide 16 text

1BSTFSHFOFSBUPS ͦͷ໊ͷ௨Γ1BSTFSΛੜ੒͢ΔͨΊͷπʔϧ ղੳ͍ͨ͠ݴޠͷจ๏ఆٛΛೖྗͱͯ͠ड͚औͬͯɺͦͷจ๏ʹैͬͯߏ จղੳΛߦ͏ͨΊͷ1BSTFSͷίʔυΛॻ͖ग़͢ 3VCZͰ͸௕Β͘(/6#JTPOΛ࢖͖͍ͬͯͯͨ 3VCZ ೥݄ ͔Β͸-SBNBͱ͍͏3VCZ੡ͷ1BSTFS HFOFSBUPSʹஔ͖׵Θͬͨ

Slide 17

Slide 17 text

ͳͥ#JTPOΛஔ͖׵͑ͨʁ

Slide 18

Slide 18 text

#JTPOΛஔ͖׵͑ͨཧ༝ #JTPOͷWFSTJPO͸؀ڥʹΑͬͯҟͳΔͷͰෳ਺WFSTJPOͷαϙʔτ͕ඞཁ ιʔείʔυ͔ΒϏϧυ͢Δ৔߹͸ɺͦͷ؀ڥͰΠϯετʔϧ͞Ε͍ͯΔ #JTPO͕࢖ΘΕΔ #JTPOʹ௥Ճ͞Εͨ৽͍͠ػೳ΋͙͢ʹ࢖͏͜ͱ͕Ͱ͖ͳ͍ɹ #JTPOʹػೳΛ௥Ճͨ͠ΓػೳΛ֦ு͢Δͷ͸೉͍͠ #JTPOͷϢʔβʔ͸໪࿦3VCZ͚ͩͰ͸ͳ͍ʢͦΕ͸ͦ͏ʣ มߋ͢Δʹ͸ଟ͘ͷௐ੔΍ٞ࿦͕ඞཁ

Slide 19

Slide 19 text

SVCZMSBNB1VSF3VCZ-"-3QBSTFSHFOFSBUPS 3VCZ੡ͷ-"-3  ύʔαδΣωϨʔλ 3VCZίϛολͷ:VJDIJSP,BOFLP !ZVJLOL ͞Μ͕࡞ऀ #JTPOܗࣜͷจ๏ϑΝΠϧΛೖྗͱͯ͠$Ͱॻ͔Εͨ1BSTFSΛग़ྗ͢Δ 3VCZ͕࢖༻͍ͯ͠Δจ๏ʹݶͬͯ͸#JTPOͱޓ׵ੑ͕͋Δ :BDDɺ#JTPOͱ͍͏ϞϑϞϑͷ࢛଍าߦͷಈ෺ͷܥේͰͷ໋໊ -MBNBͩͱ--ύʔαʔʹݟ͑ΔͷͰ-3BNBͱ͍͏௲Γʹ

Slide 20

Slide 20 text

1BSTFS(FOFSBUPS ΞʔΩςΫνϟ $PNNBOE -JOF *OUFSGBDF จ๏ϑΝΠϧ 1BSTFS (SBNNBS 4ZTUFN 4UBUF .BOBHFS $PEF (FOFSBUPS

Slide 21

Slide 21 text

1BSTFS(FOFSBUPS ΞʔΩςΫνϟ $PNNBOE -JOF *OUFSGBDF จ๏ϑΝΠϧ 1BSTFS (SBNNBS 4ZTUFN 4UBUF .BOBHFS $PEF (FOFSBUPS

Slide 22

Slide 22 text

$PNNBOE-JOF*OUFSGBDF -SBNBͷίϚϯυ࣮ߦΛ࢘Δத৺తͳΫϥε ೖྗͱͳΔจ๏ϑΝΠϧ΍֤छΦϓγϣϯΛड͚औͬͯɺ1BSTFSੜ੒ϓϩ ηεશମͷΦʔέετϨʔγϣϯΛߦ͏ % lrama - h Lrama is LALR (1) parser generator written by Ruby. Usage: lrama [options] FILE STDIN mode: lrama [options] - FILE read grammar from STDIN Tuning the Parser: -S, - - skeleton=FILE specify the skeleton to use - t, - - debug display debugging outputs of internal parser same as '-Dparse.trace' - - locations enable location support -D, - - def i ne=NAME[=VALUE] similar to '%def i ne NAME VALUE'

Slide 23

Slide 23 text

1BSTFS(FOFSBUPS ΞʔΩςΫνϟ $PNNBOE -JOF *OUFSGBDF จ๏ϑΝΠϧ 1BSTFS (SBNNBS 4ZTUFN 4UBUF .BOBHFS $PEF (FOFSBUPS

Slide 24

Slide 24 text

(SBNNBS4ZTUFN ೖྗ͞Εͨจ๏ϑΝΠϧΛղੳ͢Δ੹೚Λ࣋ͭ ҎԼΛऔΓࠐΈɺίʔυੜ੒ʹར༻Մೳͳ಺෦తͳจ๏දݱΛߏங จ๏نଇɺऴ୺ه߸ɾඇऴ୺ه߸ͱ͍ͬͨγϯϘϧ ԋࢉࢠͷ༏ઌॱҐએݴ ϢʔβʔఆٛͷΞΫγϣϯίʔυ

Slide 25

Slide 25 text

(SBNNBS4ZTUFN -FYFSͱ1BSTFSΛ͍࣋ͬͯΔ -FYFSਖ਼نදݱͰτʔΫϯΛ੾Γग़͍ͯ͠Δ 1BSTFSSVCZSBDDͱ͍͏1BSTFS(FOFSBUPSΛ࢖ͬͯੜ੒͍ͯ͠Δ SBDD ੨໦ๆ࿠͞Μ͕࡞ऀͷ-"-3  1BSTFS(FOFSBUPS 3VCZͰॻ͔Εͨ1BSTFSΛग़ྗ͢Δ

Slide 26

Slide 26 text

SBDDͰ#JTPOΛஔ͖׵͑Ε͹͍͍ͷͰ͸ ੜ੒ΞϧΰϦζϜ͸ಉ͡Ͱ-"-3   ೖྗͷจ๏ϑΝΠϧͦͷ΋ͷͷจ๏ϑΝΠϧ͕ҟͳΔ #JTPO͸:BDD#JTPOܗࣜɺSBDD͸ಠࣗͷه๏ ग़ྗ͢Δ1BSTFSͷݴޠ͕ҟͳΔ #JTJPO͸$ݴޠɺSBDD͸3VCZ parser_option: "%expect" INTEGER { @grammar.expect = val[1] } | "%def i ne" variable value { @grammar.def i ne[val[1].s_value] = val[2]&.s_value }

Slide 27

Slide 27 text

(SBNNBS4ZTUFN "DUJPOTͷ෦෼ͷղੳ΍ࢀরղܾ΋ඞཁ "DUJPO͸จ๏نଇʹҰகͯؐ͠ݩ͢Δॠؒʹ࣮ߦ͞ΕΔ ΍ɺOɺ!Oͱ͍͏ಛघͳม਺Λ࢖༻͢Δ͜ͱͰऴ୺ɾඇऴ୺ه߸ͷ஋ ΍Ґஔ৘ใʹΞΫηεՄೳͳͷͰɺͦΕΒΛஔ͖׵͑Δ if_tail: opt_else | k_elsif expr_value then compstmt(stmts) if_tail { $$ = new_if(p, $2, $4, $5, &@$, &@1, &@3, &NULL_LOC); f i xpos($$, $2); / * % ripper: elsif!($ : 2, $ : 4, $ : 5) % * / } ;

Slide 28

Slide 28 text

1BSTFS(FOFSBUPS ΞʔΩςΫνϟ $PNNBOE -JOF *OUFSGBDF จ๏ϑΝΠϧ 1BSTFS (SBNNBS 4ZTUFN 4UBUF .BOBHFS $PEF (FOFSBUPS

Slide 29

Slide 29 text

4UBUF.BOBHFS (SBNNBS4ZTUFN͔Βड͚औͬͨ಺෦จ๏දݱΛ༻͍ͯɺεςʔτϚγ ϯΛܭࢉ͓Αͼ؅ཧ͠·͢ ·ͨɺߏจղੳදΛੜ੒͢Δ໾ׂ΋୲͍ͬͯΔ

Slide 30

Slide 30 text

1BSTFS(FOFSBUPS ΞʔΩςΫνϟ $PNNBOE -JOF *OUFSGBDF จ๏ϑΝΠϧ 1BSTFS (SBNNBS 4ZTUFN 4UBUF .BOBHFS $PEF (FOFSBUPS

Slide 31

Slide 31 text

$PEF(FOFSBUPS εςʔτϚγϯͱߏจղੳදΛݩʹ࣮ߦՄೳͳ1BSTFSͷίʔυΛੜ੒͢Δ 5FNQMBUFʹ஋ΛຒΊࠐΜͰ͍͘ SVCZFSCͱ͍͏ςϯϓϨʔτγεςϜΛ࢖ͬͯຒΊࠐΉ / * - - - - - - - - - - . | yyparse. | ` - - - - - - - - - - * / int yyparse (<%= output.parse_param %>) { <%# b4_declare_scanner_communication_variables -%> / * Lookahead token kind. * / int yychar; / * The semantic value of the lookahead symbol. * / / * Default value used for initialization, for pacifying older GCCs or non-GCC compilers. * / #ifdef _ _ cplusplus static const YYSTYPE yyval_default = {}; (void) yyval_default; #else YY_INITIAL_VALUE (static const YYSTYPE yyval_default;)

Slide 32

Slide 32 text

ػೳͷ֦ு

Slide 33

Slide 33 text

ͱ͸͍͑1BSTFSHFOFSBUPSͷྺ࢙͸ݹ͍ ೥ʹ5POZ#SPPLFSͱ%FSSJDL.PSSJTʹΑͬͯઃܭ͕։࢝͞Εͨ#SPPLFS .PSSJT$PNQJMFS$PNQJMFS͕࠷ݹʢͳ͸ͣʣ ೥୅ॳ಄ʹ͸4UFQIFO$+PIOTPO͕:BDDΛ։ൃ ೥ʹ3PCFSU$PSCFUUʹΑͬͯ(/6#JTPO͕ॻ͔Εͨ ೥୅Ҏ߱͸ԼՐʹ ($$͸౰ॳ#JTPOΛ࢖͍͕ͬͯͨखॻ͖ͷ࠶ؼԼ߱1BSTFSʹ (P΋ಉ༷ʹ೥ʹखॻ͖ͷεΩϟφͱ1BSTFSʹ

Slide 34

Slide 34 text

ػೳΛ֦ுͷ༨஍ͬͯ͋Δͷʁ ͦ΋ͦ΋#JTPOͬͯ೥͔Β։ൃ͕ଓ͍͍ͯΔΜͰ͠ΐʁͦΜͳ֦ு͢ Δ༨஍͸͋Δͷʁ ൺֱతɺ#JTPO͕αϙʔτ͍ͯ͠Δจ๏͸ϓϦϛςΟϒ ྫ͑͹ɺଞͷ1BSTFSHFOFSBUPSͷػೳ΍αϙʔτ͍ͯ͠Δศརͳจ๏ Λ࣮૷͢Ε͹#FUUFS#JTPO͕Ͱ͖Δ͔΋͠Εͳ͍

Slide 35

Slide 35 text

จ๏ͷ֦ு

Slide 36

Slide 36 text

΋ͬͱ͍͍ײ͡ͷจ๏͕΄͍͠ #JTPO͕ఏڙ͍ͯ͠Δจ๏͸ϓϦϛςΟϒʢ࠶ܝʣ ৑௕Ͱந৅Խͷ༨஍͕͋ΔίʔυΛΈͨΒؔ਺ʹ੾Γग़͍ͨ͠ ͕͔ͩ͠͠ɺͦΜͳจ๏͸ͳ͍

Slide 37

Slide 37 text

1BSBNFUFSJ[JOH3VMFT 0$BNM޲͚ͷ-3  QBSTFSHFOFSBUPSͰ͋Δ.FOIJSͷศརػೳ ੜ੒نଇͷඇऴ୺ه߸ͷఆٛʹ͓͚Δڞ௨తͳύλʔϯΛந৅Խ͢ΔͨΊ ͷจ๏Λఏڙ͢Δ Πϝʔδͱͯ͠͸ϝιουͱͯ͠நग़Ͱ͖ΔΑ͏ʹ͢ΔͨΊͷػೳ .FOIJS3FGFSFODF.BOVBM WFSTJPO  IUUQTHBMMJVNJOSJBGSdGQPUUJFSNFOIJSNBOVBMIUNMTFD

Slide 38

Slide 38 text

ࣅͨΑ͏ͳߏ଄͸Α͋͘Δ stmt : keyword_alias f i tem . . . | lhs '=' lex_ctxt mrhs { $$ = node_assign(p, $1, $4, $3, &@$); / * % ripper: assign!($ : 1, $ : 4) % * / } command_asgn : lhs '=' lex_ctxt command_rhs { $$ = node_assign(p, $1, $4, $3, &@$); / * % ripper: assign!($ : 1, $ : 4) % * / } arg : lhs '=' lex_ctxt arg_rhs { $$ = node_assign(p, $1, $4, $3, &@$); / * % ripper: assign!($ : 1, $ : 4) % * / }

Slide 39

Slide 39 text

ࣅͨΑ͏ͳߏ଄͸Α͋͘Δ stmt : keyword_alias f i tem . . . | lhs '=' lex_ctxt mrhs { $$ = node_assign(p, $1, $4, $3, &@$); / * % ripper: assign!($ : 1, $ : 4) % * / } command_asgn : lhs '=' lex_ctxt command_rhs { $$ = node_assign(p, $1, $4, $3, &@$); / * % ripper: assign!($ : 1, $ : 4) % * / } arg : lhs '=' lex_ctxt arg_rhs { $$ = node_assign(p, $1, $4, $3, &@$); / * % ripper: assign!($ : 1, $ : 4) % * / }

Slide 40

Slide 40 text

ߏ଄Λநग़͢Δ͜ͱ͕Ͱ͖Δ %rule asgn(rhs) : lhs '=' lex_ctxt rhs { $$ = node_assign(p, $1, $4, $3, &@$); / * % ripper: assign!($ : 1, $ : 4) % * / } ; stmt : keyword_alias f i tem . . . | asgn(rhs) ; arg : asgn(arg_rhs) ; command_asgn : asgn(command_rhs) ;

Slide 41

Slide 41 text

ύϥϝʔλͱͯ͠5PLFOΛ౉͢͜ͱ͕Ͱ͖Δ %rule asgn(rhs) : lhs '=' lex_ctxt rhs { $$ = node_assign(p, $1, $4, $3, &@$); / * % ripper: assign!($ : 1, $ : 4) % * / } ; stmt : keyword_alias f i tem . . . | asgn(rhs) ; arg : asgn(arg_rhs) ; command_asgn : asgn(command_rhs) ;

Slide 42

Slide 42 text

౉͞Εͨ5PLFOΛӈลʹల։͢Δ %rule asgn(rhs) : lhs '=' lex_ctxt rhs { $$ = node_assign(p, $1, $4, $3, &@$); / * % ripper: assign!($ : 1, $ : 4) % * / } ; stmt : keyword_alias f i tem . . . | asgn(rhs) ; arg : asgn(arg_rhs) ; command_asgn : asgn(command_rhs) ;

Slide 43

Slide 43 text

౉͞Εͨ5PLFOΛӈลʹల։͢Δ %rule asgn(rhs) : lhs '=' lex_ctxt rhsarg_rhs { $$ = node_assign(p, $1, $4, $3, &@$); / * % ripper: assign!($ : 1, $ : 4) % * / } ; stmt : keyword_alias f i tem . . . | asgn(rhs) ; arg : asgn(arg_rhs) ; command_asgn : asgn(command_rhs) ;

Slide 44

Slide 44 text

౉͞Εͨ5PLFOΛӈลʹల։͢Δ %rule asgn(rhs) : lhs '=' lex_ctxt rhscommand_rhs { $$ = node_assign(p, $1, $4, $3, &@$); / * % ripper: assign!($ : 1, $ : 4) % * / } ; stmt : keyword_alias f i tem . . . | asgn(rhs) ; arg : asgn(arg_rhs) ; command_asgn : asgn(command_rhs) ;

Slide 45

Slide 45 text

ػೳͷ֦ு

Slide 46

Slide 46 text

จ๏ͷߏ଄Λ͍͍ײ͡ʹݟ͍ͨ brace_block : '{' brace_body '}' { $$ = $2; set_embraced_location($$, &@1, &@3); / * % ripper: $ : 2 % * / } | k_do do_body k_end { $$ = $2; set_embraced_location($$, &@1, &@3); / * % ripper: $ : 2 % * / } ;

Slide 47

Slide 47 text

จ๏ͷߏ଄ͱ"DUJPO͕ࠞࡏ brace_block : '{' brace_body '}' { $$ = $2; set_embraced_location($$, &@1, &@3); / * % ripper: $ : 2 % * / } | k_do do_body k_end { $$ = $2; set_embraced_location($$, &@1, &@3); / * % ripper: $ : 2 % * / } ;

Slide 48

Slide 48 text

จ๏ͷߏ଄ͱ"DUJPO͕ࠞࡏ brace_block : '{' brace_body '}' { $$ = $2; set_embraced_location($$, &@1, &@3); / * % ripper: $ : 2 % * / } | k_do do_body k_end { $$ = $2; set_embraced_location($$, &@1, &@3); / * % ripper: $ : 2 % * / } ;

Slide 49

Slide 49 text

3BJMSPBE%JBHSBN +BWB4DSJQU޲͚ͷ1BSTFS#VJMEJOHπʔϧΩοτ$IFWSPUBJOͷػೳ IUUQTHJUIVCDPN$IFWSPUBJODIFWSPUBJO จ຺ࣗ༝จ๏Λߏจਤͱͯ͠දݱ͢ΔͨΊͷػೳͰ#/'Λࢹ֮ԽͰ͖Δ

Slide 50

Slide 50 text

ZEBISBJMSPBE@EJBHSBNT $IFWSPUBJO͕ґଘ͍ͯ͠ΔUBCBULJOTSBJMSPBEEJBHSBNT͕αϙʔτ͠ ͍ͯΔͷ͸+BWB4DSJQUͱ1ZUIPO͚ͩͩͬͨͷͰ3VCZ޲͚ʹ࣮૷ͨ͠ IUUQTHJUIVCDPNZEBISBJMSPBE@EJBHSBNT ଍Γ͍ͯͳ͍ػೳ΍ϥΠϒϥϦ͕͋Ε͹3VCZͰ࡞Δ ྗ͸ύϫʔ  #JTPOͩͱ͜͏͍͏ྗٕͰ৽ػೳΛ૊ΈࠐΉͷ͸೉͍͠ -SBNBͳΒࣗ෼ͨͪͷ1BSTFS(FOFSBUPSͳͷͰ΍Γ΍͍͢

Slide 51

Slide 51 text

ࢥΘ͵෭࢈෺ -SBNB͸#JTPOͱޓ׵͕͋Δ #JTPOͰੜ੒͍ͯ͠Δύʔαʔ͸͢΂ͯ7JTVBMJ[FͰ͖Δ 1)1 ;FOE1BSTFS ɺ1FSMɺ.Z42-౳

Slide 52

Slide 52 text

͔͜͜Βࢼͤ·͢ ZEBIHJUIVCJPSBJMSPBEEJBHSBNDPMMFDUJPO

Slide 53

Slide 53 text

݁࿦ 3VCZͰ͸ʮେ1BSTFS࣌୅ʯ͕౸དྷதʢ΋͏೥໨ʂʣ ௕͘࢖ΘΕ͍ͯΔٕज़͕ͩվળͷ༨஍͸·ͩ͋Δ ࠓ೔͸৮Ε͍ͯͳ͍͕ੜ੒ΞϧΰϦζϜ΋͍͔ͭ͘ͷ࿦จ͕͋Δ $4ΛਓੜͰֶΜͰ͜ͳ͔ͬͨࢲ͕ͷΊΓࠐΉ͘Βָ͍͍͠ʢͭ·Γͱͯ΋ָ͠ ͍ʣ -31BSTFS͸͍͍ͧ -31BSTFS͸͍͍ͧ

Slide 54

Slide 54 text

4UBSHB[FBU HJUIVCDPNSVCZMSBNB