Next: , Previous: Reduce/Reduce, Up: Algorithm   [Contents][Index]


5.7 ÉԲIJò¤Ê´Ô¸µ/´Ô¸µ¾×ÆÍ

¤½¤¦¤Ê¤ë¤Ï¤º¤¬¤Ê¤¤¤è¤¦¤Ë¸«¤¨¤ë¤Î¤Ë¡¢¤È¤­¤É¤­ ´Ô¸µ/´Ô¸µ¾×ÆÍ¤¬µ¯¤­¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ Îã¤ò¼¨¤·¤Þ¤¹¡£

%token ID

%%
def:    param_spec return_spec ','
        ;
param_spec:
             type
        |    name_list ':' type
        ;
return_spec:
             type
        |    name ':' type
        ;
type:        ID
        ;
name:        ID
        ;
name_list:
             name
        |    name ',' name_list
        ;

¤³¤Îʸˡ¤Ï¡¢1¸Ä¤Î¥È¡¼¥¯¥ó¤ÎÀèÆÉ¤ß¤Ë¤è¤Ã¤Æ¡¢¹½Ê¸²òÀϤǤ­¤ë¤è¤¦¤Ë¸«¤¨¤Þ¤¹¡£ ¤¿¤È¤¨¤Ð¡¢pram_spec¤¬ÆÉ¤Þ¤ì¤¿¸å¤Ç¡¢ ID¤Ï¥«¥ó¥Þ¤«¥»¥ß¥³¥í¥ó¤¬Â³¤¯¤Ê¤é¤Ðname¡¢ ¤½¤¦¤Ç¤Ê¤±¤ì¤Ðtype¤È¤Ê¤ê¤Þ¤¹¡£ ¸À¤¤´¹¤¨¤ì¤Ð¡¢¤³¤Îʸˡ¤ÏLR(1)¤Ç¤¹¡£

¤·¤«¤·¡¢Bison¤Ï¡¢Â¿¤¯¤Î¹½Ê¸²òÀÏ´ïÀ¸À®´ï¤ÈƱÍͤˡ¢ ¤¹¤Ù¤Æ¤ÎLR(1)ʸˡ¤ò°·¤¨¤ë¤ï¤±¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ Á°½Ò¤ÎÎã¤Ç¤Ï¡¢ID¤Î¸å¤Ç¡¢¤½¤³¤¬param_spec¤ÎÀèÆ¬¤Ç¤¢¤ë¤È¤¤¤¦ ʸ̮¤È¡¢¤½¤³¤¬return_spec¤ÎÀèÆ¬¤Ç¤¢¤ë¤È¤¤¤¦Ê¸Ì®¤Ï¡¢ Bison¤¬Æ±°ì¤Ç¤¢¤ë¤È¤ß¤Ê¤·¤Æ¤·¤Þ¤¦¤Û¤É»÷¤Æ¤¤¤Þ¤¹¡£ ¤³¤ì¤é¤Îʸ̮¤¬»÷¤Æ¤·¤Þ¤¦¸¶°ø¤Ï¡¢Æ±¤¸µ¬Â§¤Î½¸¹ç¤¬Í­¸ú¤Ë¤Ê¤ë¡¢¤Ä¤Þ¤ê¡¢ name¤Ø´Ô¸µ¤¹¤ë¤¿¤á¤Îµ¬Â§¤È¡¢type¤Ø´Ô¸µ¤¹¤ë¤¿¤á¤Îµ¬Â§¤Î ξÊý¤¬Í­¸ú¤Ê¤³¤È¤Ç¤¹¡£ Bison¤Ï¡¢¤½¤Îµ¬Â§¤¬2¤Ä¤Îʸ̮¤Ç°Û¤Ê¤ëÀèÆÉ¤ß¥È¡¼¥¯¥ó¤òÍ׵᤹¤ë¤è¤¦¤Ê¡¢ ½èÍý¤ÎÃʳ¬¤ò·èÄê¤Ç¤­¤º¡¢Î¾¼Ô¤«¤é1¤Ä¤Î¹½Ê¸²òÀÏ´ï¾õÂÖ¤¬¤Ç¤­¤Æ¤·¤Þ¤¤¤Þ¤¹¡£ 2¸Ä¤Îʸ̮¤ÎÁȤ߹ç¤ï¤»¤Ï¡¢¸å¤Ç¾×ÆÍ¤òµ¯¤³¤·¤Þ¤¹¡£ ¹½Ê¸²òÀÏ´ï¤ÎÍѸì¤Ç¤¤¤¨¤Ð¡¢¤³¤ÎÌäÂê¤ÎȯÀ¸¤Ï¡¢ ʸˡ¤¬LALR(1)¤Ç¤Ê¤¤¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£

°ìÈ̤ˡ¢¤³¤Î¤è¤¦¤Ê·çÅÀ¤Ï²ò·è¤·¤Æ¡¢Ê¸½ñ²½¤¹¤ë¤Ù¤­¤Ç¤¹¡£ ¤·¤«¤·¡¢¤³¤ÎÌäÂê¤ÏËܼÁŪ¤Ë²ò·èº¤Æñ¤Ç¤¹¡£ LR(1)ʸˡ¤ò°·¤¨¤ë¹½Ê¸²òÀÏ´ïÀ¸À®´ï¤Ï¡¢ºîÀ®º¤Æñ¤Ç¡¢ À¸À®¤µ¤ì¤ë¹½Ê¸²òÀϴ郎µðÂç¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¤¤Þ¤¹¡£ ¼ÂÍѾ塢Bison¤Ïº£¤Î¤Þ¤Þ¤Ç¤âÍ­ÍѤǤ¹¡£

¤³¤Î¤è¤¦¤ÊÌäÂ꤬¸½¤ì¤¿¾ì¹ç¤Ë¡¢º®Íð¤Î¸µ¤Ë¤Ê¤Ã¤Æ¤¤¤ë2¼ïÎà¤Î¹½Ê¸²òÀÏ´ï¤Î ¾õÂÖ¤ò¶èÊ̤·¡¢¤½¤ì¤é¤¬°ã¤¦¤È¤¤¤¦Ìܰõ¤«²¿¤«¤òÄɲ乤뤳¤È¤Ë¤è¤Ã¤Æ¡¢ ¤·¤Ð¤·¤ÐÌäÂê¤ò²ò·è¤Ç¤­¤Þ¤¹¡£ Á°½Ò¤ÎÎã¤Ç¤Ï¡¢¼¡¤Î¤è¤¦¤Ëreturn_spec¤Ëµ¬Â§¤òÄɲ䷤ơ¢ ÌäÂê¤ò²ò·è¤Ç¤­¤Þ¤¹¡£

%token BOGUS
…
%%
…
return_spec:
             type
        |    name ':' type
         /* ¤³¤Îµ¬Â§¤Ï·è¤·¤Æ»È¤ï¤ì¤Ê¤¤¡£  */
        |    ID BOGUS
        ;

ID¤Î¼¡¤Çreturn_spec¤ÎÀèÆ¬¤Ç¤¢¤ëʸ̮¤Ç¡¢ Äɲäε¬Â§¤¬Í­¸ú¤Ë¤Ê¤ë²ÄǽÀ­¤òƳÆþ¤·¤Æ¡¢ÌäÂê¤ò²ò·è¤·¤Æ¤¤¤Þ¤¹¡£ ¤³¤Îµ¬Â§¤Ï¡¢param_spec¤Ë´ØÏ¢¤¹¤ëʸ̮¤Ç¤ÏÍ­¸ú¤Ë¤Ê¤é¤Ê¤¤¤Î¤Ç¡¢ 2¸Ä¤Îʸ̮¤Ï¡¢°Û¤Ê¤ë¹½Ê¸²òÀÏ´ï¾õÂÖ¤ò»ý¤Á¤Þ¤¹¡£ BOGUS¤Ïyylex¤Ë¤è¤Ã¤Æ¤Ï·è¤·¤ÆÀ¸À®¤µ¤ì¤Ê¤¤¤Î¤Ç¡¢ Äɲ䵤줿µ¬Â§¤ÏÆþÎϤ¬¼ÂºÝ¤Ë¹½Ê¸²òÀϤµ¤ì¤ëÊýË¡¤Ë¤Ï±Æ¶Á¤·¤Þ¤»¤ó¡£

¤³¤Î¶ñÂÎÎã¤Ç¤Ï¡¢ÌäÂê¤ò²ò·è¤¹¤ëÊ̤ÎÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£ ¤Ä¤Þ¤ê¡¢return_spec¤Îµ¬Â§¤ò¡¢name·Ðͳ¤Ç¤Ï¤Ê¤¯ ID¤òľÀܻȤ¦¤è¤¦¤Ë½ñ¤­´¹¤¨¤ë¤Î¤Ç¤¹¡£ return_spec¤ËÂФ¹¤ëµ¬Â§¤Ï¡¢name¤ËÂФ¹¤ëµ¬Â§¤Ç¤Ï¤Ê¤¯¡¢ return_spec¤ËÂФ¹¤ëµ¬Â§¤òÍ­¸ú¤Ë¤¹¤ë¤Î¤Ç¡¢ 2¤Ä¤Îº®Í𤷤Ƥ¤¤¿Ê¸Ì®¤Ï°Û¤Ê¤ëÍ­¸ú¤Êµ¬Â§¤Î½¸¤Þ¤ê¤ò»ý¤Á¤Þ¤¹¡£

param_spec:
             type
        |    name_list ':' type
        ;
return_spec:
             type
        |    ID ':' type
        ;