Previous: Action Types, Up: Semantics   [Contents][Index]


3.5.5 µ¬Â§¤ÎÅÓÃæ¤Î¥¢¥¯¥·¥ç¥ó

¤Þ¤ì¤Ë¡¢¥¢¥¯¥·¥ç¥ó¤òµ¬Â§¤ÎÅÓÃæ¤ËÃÖ¤¯¤ÈÊØÍø¤Ê¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£ ¤³¤ì¤é¤Î¥¢¥¯¥·¥ç¥ó¤Ï¡¢Ä̾ï¤Îµ¬Â§¤Î½ª¤ï¤ê¤ËÃÖ¤«¤ì¤¿¥¢¥¯¥·¥ç¥ó¤ÈƱÍÍ¤Ë µ­½Ò¤µ¤ì¤Þ¤¹¤¬¡¢¹½Ê¸²òÀϴ郎¸å¤Ë³¤¯Í×ÁǤòǧ¼±¤¹¤ëÁ°¤Ë¼Â¹Ô¤µ¤ì¤Þ¤¹¡£

µ¬Â§¤ÎÅÓÃæ¤Î¥¢¥¯¥·¥ç¥ó¤Ï¡¢¤½¤Î¥¢¥¯¥·¥ç¥ó¤è¤ê¤âÁ°¤Ë¤¢¤ëÍ×ÁǤò $n¤ò»È¤Ã¤Æ»²¾È¤Ç¤­¤Þ¤¹¤¬¡¢¸å¤Ë³¤¯Í×ÁÇ¤Ï ¤Þ¤À¹½Ê¸²òÀϤµ¤ì¤Æ¤¤¤Ê¤¤¤Î¤Ç»²¾È¤Ç¤­¤Þ¤»¤ó¡£

µ¬Â§¤ÎÅÓÃæ¤Î¥¢¥¯¥·¥ç¥ó¼«¿È¤Ï¡¢µ¬Â§¤ÎÍ×ÁǤÎ1¤Ä¤È¤·¤Æ¿ô¤¨¤é¤ì¤Þ¤¹¡£ Ʊ¤¸µ¬Â§¤ÎÃæ¤ËÊ̤Υ¢¥¯¥·¥ç¥ó¤¬Â³¤¯¾ì¹ç¡ÊÄ̾ï¤ÏºÇ¸å¡Ë¤ËÌäÂ꤬µ¯¤­¤Þ¤¹¡£ $n¤Ë»È¤¦ÈÖ¹æn¤Ë µ¬Â§¤ÎÅÓÃæ¤Î¥¢¥¯¥·¥ç¥ó¤ò¿ô¤¨¤ë¤Î¤ò˺¤ì¤Ê¤¤¤è¤¦¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£

µ¬Â§¤ÎÅÓÃæ¤Î¥¢¥¯¥·¥ç¥ó¤Ï¡¢°ÕÌ£Ãͤò»ý¤Æ¤Þ¤¹¡£ ¤½¤Î¥¢¥¯¥·¥ç¥ó¤Ï¡¢$$¤Ø¤ÎÂåÆþ¤ÇÃͤòÄê¤á¡¢ ¸å¤Ë³¤¯¥¢¥¯¥·¥ç¥ó¤ÎÃæ¤Ç¡¢$n¤ÇÃͤò»²¾È¤Ç¤­¤Þ¤¹¡£ ¥¢¥¯¥·¥ç¥ó¤Ëµ­¹æÌ¾¤òÂбþ¤µ¤»¤ëÊýË¡¤¬¤Ê¤¤¤Î¤Ç¡¢ ¥¢¥¯¥·¥ç¥ó¤Î¥Ç¡¼¥¿·¿¤òÀë¸À¤Ç¤­¤Þ¤»¤ó¡£ ¤½¤³¤Ç¡¢¥¢¥¯¥·¥ç¥ó¤Î°ÕÌ£¤ò»²¾È¤¹¤ë¤È¤­¤Ë¡¢ ‘$<…>’¤ò»È¤Ã¤Æ¥Ç¡¼¥¿·¿¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£

µ¬Â§¤ÎÅÓÃæ¤Î¥¢¥¯¥·¥ç¥ó¤Ç¤Ï¡¢$$¤Ø¤ÎÂåÆþ¤¬µ¬Â§¤ÎÃͤ˴ط¸¤·¤Ê¤¤¤Î¤Ç¡¢ µ¬Â§Á´ÂΤÎÃͤòÀßÄꤹ¤ëÊýË¡¤Ï¤¢¤ê¤Þ¤»¤ó¡£ µ¬Â§Á´ÂΤÎÃͤòÀßÄꤹ¤ëÍ£°ì¤ÎÊýË¡¤Ï¡¢ µ¬Â§¤ÎºÇ¸å¤ËÃÖ¤«¤ì¤¿Ä̾ï¤Î¥¢¥¯¥·¥ç¥ó¤Ç¤¹¡£

²Í¶õ¤Î¥³¥ó¥Ñ¥¤¥é¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£ ¤³¤³¤Ç¤Ï¡¢‘let (variable) statement’¤Î¤è¤¦¤Ê½ñ¼°¤Î letʸ¤ò»È¤¨¡¢statement¤Î»ý³´ü´ÖÃæ¤Ë°ì»þŪ¤Ë variable¤È¤¤¤¦Ì¾Á°¤ÎÊÑ¿ô¤òºî¤ê¤Þ¤¹¡£ ¤³¤ì¤ò¹½Ê¸²òÀϤ¹¤ë¤¿¤á¤Ë¡¢statement¤ò²òÀϤ·¤Æ¤¤¤ë´Ö¡¢ variable¤òµ­¹æÉ½¤ËÃÖ¤¤¤Æ¤ª¤­¡¢ ¸å¤Çµ­¹æÉ½¤«¤éºï½ü¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ¤³¤ì¤ò¼Â¸½¤¹¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£

stmt:   LET '(' var ')'
                { $<context>$ = push_context ();
                  declare_variable ($3); }
        stmt    { $$ = $6;
                  pop_context ($<context>5); }

let (variable)’¤¬Ç§¼±¤µ¤ì¤ë¤È¤¹¤°¤Ë¡¢ ºÇ½é¤Î¥¢¥¯¥·¥ç¥ó¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£ ¤½¤Î¥¢¥¯¥·¥ç¥ó¤Ï¡¢¸½ºß¤Î°Ọ̃ʸ̮¡¢¤¹¤Ê¤ï¤Á»²¾È²Äǽ¤ÊÊÑ¿ô¤Îɽ¤ÎÊ£À½¤ò¡¢ ¥Ç¡¼¥¿·¿¶¦ÍÑÂΤÎÃæ¤Îcontext·¿¤Ç¡¢ ¥¢¥¯¥·¥ç¥ó¤Î°ÕÌ£ÃͤȤ·¤ÆÊݸ¤·¤Þ¤¹¡£ ¤½¤·¤Æ¡¢declare_variable¤ò¸Æ¤Ó½Ð¤·¤Æ¡¢ ¿·¤·¤¤ÊÑ¿ô¤òµ­¹æÉ½¤ËÄɲä·¤Þ¤¹¡£ ºÇ½é¤Î¥¢¥¯¥·¥ç¥ó¤¬½ª¤ï¤ë¤È¡¢¸å³¤¹¤ëstmt¤Î²òÀϤ¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£ µ¬Â§¤ÎÅÓÃæ¤Î¥¢¥¯¥·¥ç¥ó¤¬5ÈÖÌܤÎÍ×ÁǤǤ¢¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢‘stmt’¤Ï6ÈÖÌܤÎÍ×ÁǤˤʤê¤Þ¤¹¡£

¸å³¤¹¤ëʸ¤¬²òÀϤµ¤ì¤ë¤È¡¢¤½¤Î°ÕÌ£Ãͤ¬letʸÁ´ÂΤΰÕÌ£Ãͤˤʤê¤Þ¤¹¡£ ¤½¤·¤Æ¡¢ºÇ½é¤Î¥¢¥¯¥·¥ç¥ó¤Î°ÕÌ£Ãͤϡ¢ ÊÑ¿ô¤Îɽ¤ò¸µ¤ËÌ᤹¤¿¤á¤Ë»È¤ï¤ì¤Þ¤¹¡£ ¤½¤³¤Ç¡¢letÊ¸Ãæ¤Ç¤Î°ì»þÊÑ¿ô¤¬É½¤«¤éºï½ü¤µ¤ì¡¢ ¹½Ê¸²òÀϤµ¤ì¤ë¥×¥í¥°¥é¥à¤Î»Ä¤ê¤ÎÉôʬ¤Ç¤Ï°ì»þÊÑ¿ô¤¬Â¸ºß¤·¤Þ¤»¤ó¡£

¹½Ê¸²òÀÏ´ï¤Ï¡¢¥¢¥¯¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë½ç½ø¤ò·è¤á¤ë¤¿¤á¤Ë¡¢ ¹½Ê¸²òÀϤ¹¤ëɬÍפ¬¤¢¤ë¤Î¤Ç¡¢ µ¬Â§¤¬´°Á´¤Ëǧ¼±¤µ¤ì¤ëÁ°¤Ë¥¢¥¯¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ï¡¢ ¤·¤Ð¤·¤ÐÉÔÀ°¹ç¤òµ¯¤³¤·¤Þ¤¹¡£ ¤¿¤È¤¨¤Ð¡¢¸å½Ò¤Î2¸Ä¤Îµ¬Â§¤Ï¡¢µ¬Â§¤ÎÅÓÃæ¤Î¥¢¥¯¥·¥ç¥ó¤ò»ý¤¿¤Ê¤¤¤Î¤Ç¡¢ ¼Â¹Ô²Äǽ¤Ê¹½Ê¸²òÀÏ´ï¤ÎÃæ¤Ç¶¦Â¸¤Ç¤­¤Þ¤¹¡£ ¤½¤ì¤Ï¡¢¹½Ê¸²òÀÏ´ï¤Ï³«¤­¥Ö¥ì¡¼¥¹¥È¡¼¥¯¥ó¤ò¥·¥Õ¥È¤Ç¤­¡¢ Àë¸À¤¬¤¢¤ë¤«¤É¤¦¤«Ä´¤Ù¤ë¤¿¤á¤Ë¸å¤Ë³¤¯¤â¤Î¤òÀèÆÉ¤ß¤Ç¤­¤ë¤«¤é¤Ç¤¹¡£

compound: '{' declarations statements '}'
        | '{' statements '}'
        ;

¤·¤«¤·¡¢¼¡¤ÎÎã¤Î¤è¤¦¤Ë¡¢µ¬Â§¤ÎÅÓÃæ¤Î¥¢¥¯¥·¥ç¥ó¤ò²Ã¤¨¤ë¤È¡¢ ¤³¤Îµ¬Â§¤ÏƯ¤«¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£

compound: { prepare_for_local_variables (); }
          '{' declarations statements '}'
        | '{' statements '}'
        ;

¤³¤³¤Ç¤Ï¡¢³«¤­¥Ö¥ì¡¼¥¹¤ò¸«¤Ä¤±¤¿»þÅÀ¤Ç¡¢ µ¬Â§¤ÎÅÓÃæ¤Î¥¢¥¯¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ëɬÍפ¬¤¢¤ë¤«¤É¤¦¤«¤Î·èÄê¤òÇ÷¤é¤ì¤Þ¤¹¡£ ¸À¤¤´¹¤¨¤ì¤Ð¡¢Àµ¤·¤¯È½ÃǤ¹¤ë¤¿¤á¤Î½½Ê¬¤Ê¾ðÊó¤Ê¤·¤Ë¡¢ ¤¢¤ëµ¬Â§¤«Ê̤ε¬Â§¤Î¤É¤Á¤é¤«¤Ë¤æ¤À¤Í¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ³«¤­¥Ö¥ì¡¼¥¹¥È¡¼¥¯¥ó¤Ï¡¢¤³¤ì¤òÆÉ¤ó¤À»þÅÀ¤Ç¤Ï¹½Ê¸²òÀϴ郎 ²¿¤ò¤¹¤Ù¤­¤«·èÄꤹ¤ëÅÓÃæ¤Ê¤Î¤Ç¡¢ÀèÆÉ¤ß¡Êlook-ahead¡Ë¥È¡¼¥¯¥ó¤È ¸Æ¤Ð¤ì¤Þ¤¹¡£See Look-Ahead Tokens¡£

¼¡¤Î¤è¤¦¤ËƱ°ì¤Î¥¢¥¯¥·¥ç¥ó¤òÃÖ¤¯¤³¤È¤Ç¡¢ ¤³¤ÎÌäÂê¤ò²ò·è¤Ç¤­¤ë¤è¤¦¤Ë»×¤¨¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£

compound: { prepare_for_local_variables (); }
          '{' declarations statements '}'
        | { prepare_for_local_variables (); }
          '{' statements '}'
        ;

¤·¤«¤·¡¢Bison¤Ë¤Ï2¤Ä¤Î¥¢¥¯¥·¥ç¥ó¤¬Æ±°ì¤Ç¤¢¤ë¤«¤É¤¦¤«¤ï¤«¤é¤Ê¤¤¤Î¤Ç¡¢ ÌäÂê¤Ï²ò·è¤·¤Þ¤»¤ó¡£ Bison¤Ï¡¢¥¢¥¯¥·¥ç¥ó¤ÎÃæ¤ÎC¤Ç½ñ¤«¤ì¤¿¥×¥í¥°¥é¥à¤ò¡¢ ·è¤·¤Æ²ò¼á¤·¤è¤¦¤È¤·¤Þ¤»¤ó¡£

C¸À¸ì¤Î¤è¤¦¤Ë¡¢ºÇ½é¤Î¥È¡¼¥¯¥ó¤Ë¤è¤Ã¤ÆÊ¸¤ÈÀë¸À¤ò¶èÊ̤Ǥ­¤ë¤è¤¦¤Ê ʸˡ¤Ê¤é¤Ð¡¢¼Â¸½²Äǽ¤Ê²ò·èÊýË¡¤Î1¤Ä¤Ï¡¢¼¡¤ÎÎã¤Î¤è¤¦¤Ë¡¢ ³«¤­¥Ö¥ì¡¼¥¹¤Î¸å¤Ë¥¢¥¯¥·¥ç¥ó¤òÃÖ¤¯¤³¤È¤Ç¤¹¡£

compound: '{' { prepare_for_local_variables (); }
          declarations statements '}'
        | '{' statements '}'
        ;

¤³¤ì¤Ç¡¢Â³¤¯Àë¸À¤Þ¤¿¤Ïʸ¤ÎºÇ½é¤Î¥È¡¼¥¯¥ó¤Ë¤è¤Ã¤Æ¡¢ Bison¤¬¤É¤Á¤é¤Îµ¬Â§¤ò»È¤¦¤Ù¤­¤«¤ï¤«¤ê¤Þ¤¹¡£

Ê̤βò·èÊýË¡¤Ï¡¢¥µ¥Ö¥ë¡¼¥Á¥ó¤È¤·¤ÆÆ¯¤¯Èó½ªÃ¼µ­¹æ¤ÎÆâ¦¤Ë¡¢ ¥¢¥¯¥·¥ç¥ó¤òËä¤á¹þ¤à¤³¤È¤Ç¤¹¡£

subroutine: /* ¶õ */
          { prepare_for_local_variables (); }
        ;

compound: subroutine
          '{' declarations statements '}'
        | subroutine
          '{' statements '}'
        ;

¤³¤ì¤Ç¡¢Bison¤Ïcompound¤ËÂФ·¤Æ¤É¤Á¤é¤Îµ¬Â§¤ò»È¤¦¤Ù¤­¤«·è¤á¤º¤Ë¡¢ subroutine¤ËÂФ¹¤ëµ¬Â§Ãæ¤Î¥¢¥¯¥·¥ç¥ó¤ò¼Â¹Ô¤Ç¤­¤Þ¤¹¡£ Ǥ°Õ¤Îµ¬Â§Ãæ¤Î¥¢¥¯¥·¥ç¥ó¤Ï¡¢¤³¤ÎÊýË¡¤Ë¤è¤Ã¤Æ¡¢ µ¬Â§¤ÎºÇ¸å¤Î¥¢¥¯¥·¥ç¥ó¤ËÊÑ´¹¤Ç¤­¤Þ¤¹¡£ ¼ÂºÝ¤Ë¡¢Bison¤ÎÆâÉô¤Ç¤Ï¡¢¤³¤Î¤è¤¦¤Ë¤·¤Æ¡¢ µ¬Â§Ãæ¤Î¥¢¥¯¥·¥ç¥ó¤È¤¤¤¦µ¡Ç½¤¬¼Â¸½¤µ¤ì¤Æ¤¤¤Þ¤¹¡£