Next: , Previous: Look-Ahead, Up: Algorithm   [Contents][Index]


5.2 ¥·¥Õ¥È´Ô¸µ¾×ÆÍ

¼¡¤Î2¸Ä¤Îµ¬Â§¤ÇÄê¤á¤é¤ì¤ë¡¢“if-then”¤È“if-then-else”ʸ¤ò»ý¤Ä ¸À¸ì¤Î¹½Ê¸²òÀϤˤĤ¤¤Æ¹Í¤¨¤Þ¤¹¡£

if_stmt:
          IF expr THEN stmt
        | IF expr THEN stmt ELSE stmt
        ;

¤³¤³¤Ç¡¢IF¡¢THEN¡¢ELSE¤Ï¡¢ ¥­¡¼¥ï¡¼¥É¥È¡¼¥¯¥ó¤òɽ¤¹½ªÃ¼µ­¹æ¤Ç¤¢¤ë¤È²¾Äꤷ¤Þ¤¹¡£

ELSE¥È¡¼¥¯¥ó¤¬ÆÉ¤Þ¤ì¤ÆÀèÆÉ¤ß¥È¡¼¥¯¥ó¤Ë¤Ê¤Ã¤¿¤È¤­¤Ë¡¢ ÆþÎϤ¬Àµ¤·¤¤¤È²¾Äꤷ¤Æ¡¢¥¹¥¿¥Ã¥¯¤ÎÆâÍÆ¤Ï¤Á¤ç¤¦¤É ºÇ½é¤Îµ¬Â§¤Ç´Ô¸µ¤µ¤ì¤ë±¦ÊդˤʤäƤ¤¤Þ¤¹¡£ ¤·¤«¤·¡¢¤¤¤º¤ìµ¯¤³¤ë¤Ï¤º¤ÎÂè2¤Îµ¬Â§¤Î´Ô¸µ¤Î¤¿¤á¤Ë¡¢ ELSE¥È¡¼¥¯¥ó¤ò¥·¥Õ¥È¤¹¤ë¤³¤È¤âÍ­¸ú¤Ç¤¹¡£

¤³¤Î¡¢¥·¥Õ¥È¤È´Ô¸µ¤ÎξÊý¤¬Í­¸ú¤Ê¾ì¹ç¤ò¡¢ ¥·¥Õ¥È´Ô¸µ¾×ÆÍ¡Êshift/reduce conflict¡Ë¤È¸Æ¤Ó¤Þ¤¹¡£ Bison¤Ï¡¢±é»»»ÒÍ¥À赬§Àë¸À¤ÇÆÃ¤Ë»ØÄꤵ¤ì¤Æ¤¤¤Ê¤¤¤«¤®¤ê¡¢ ¥·¥Õ¥È¤òÁª¤Ö¤³¤È¤Ç¾×ÆÍ¤ò²ò·è¤¹¤ë¤è¤¦¤ËÀ߷פµ¤ì¤Æ¤¤¤Þ¤¹¡£ ¤³¤ÎÍýͳ¤òÍý²ò¤¹¤ë¤¿¤á¤Ë¡¢Ê̤ÎÁªÂò»è¤ÈÈæ³Ó¤·¤Æ¤ß¤Þ¤·¤ç¤¦¡£

¹½Ê¸²òÀÏ´ï¤ÏELSE¤Î¥·¥Õ¥È¤òÁª¤Ö¤Î¤Ç¡¢¤½¤Î·ë²Ì¡¢ elseÀá¤Ï¤â¤Ã¤È¤âÆâ¦¤Îifʸ¤ËÂбþ¤·¡¢¼¡¤Î2¤Ä¤ÎÆþÎϤÏÅù²Á¤Ë¤Ê¤ê¤Þ¤¹¡£

if x then if y then win (); else lose;

if x then do; if y then win (); else lose; end;

¤·¤«¤·¡¢»ú¶ç²òÀϴ郎¥·¥Õ¥È¤Ç¤Ê¤¯´Ô¸µ¤òÁª¤Ö¤È¡¢¤½¤Î·ë²Ì¡¢ elseÀ᤬¤â¤Ã¤È¤â³°Â¦¤Îifʸ¤ËÂбþ¤·¡¢¼¡¤Î2¤Ä¤ÎÆþÎϤÏÅù²Á¤Ë¤Ê¤ê¤Þ¤¹¡£

if x then if y then win (); else lose;

if x then do; if y then win (); end; else lose;

ʸˡ¤¬¤¢¤¤¤Þ¤¤¤Ë½ñ¤«¤ì¤Æ¤¤¤ë¤¿¤á¤Ë¡¢¾×ÆÍ¤¬µ¯¤­¤Þ¤¹¡£ ¤Ä¤Þ¤ê¡¢Æþ¤ì»Ò¤Ë¤Ê¤Ã¤¿ifʸ¤Ë¤Ä¤¤¤Æ¡¢¤É¤Á¤é¤Î¹½Ê¸²òÀÏ·ë²Ì¤âÀµÅö¤Ê¤Î¤Ç¤¹¡£ ³ÎΩ¤µ¤ì¤¿½¬´·¤Ç¤Ï¡¢elseÀá¤ò¤â¤Ã¤È¤âÆâ¦¤Îifʸ¤ËÂбþ¤µ¤»¤Æ¡¢ ¤¢¤¤¤Þ¤¤¤µ¤ò²ò·è¤·¤Æ¤¤¤Þ¤¹¡£ ¤³¤ì¤¬¡¢Bison¤¬´Ô¸µ¤è¤ê¤â¥·¥Õ¥È¤òÁª¤ÖÍýͳ¤Ç¤¹ ¡ÊÍýÁÛŪ¤Ë¤Ï¡¢¤¢¤¤¤Þ¤¤¤Ç¤Ê¤¤Ê¸Ë¡¤ò½ñ¤¯¤Ù¤­¤Ç¤¹¤¬¡¢¤³¤Î¾ì¹ç¤Ë¤Ïº¤Æñ¤Ç¤¹¡Ë¡£ ¤³¤ÎÌäÂê¤Ï¡¢Algol 60¤Î»ÅÍͤÎÃæ¤Ë¸½¤ì¤¿¤Î¤¬ºÇ½é¤Ç¡¢ ¡Ö¤Ö¤é¤µ¤¬¤êelse¡Êdangling else¡Ë¡×ÌäÂê¤È¸Æ¤Ð¤ì¤Æ¤¤¤Þ¤¹¡£

ͽ¬²Äǽ¤ÇÀµÅö¤Ê¥·¥Õ¥È´Ô¸µ¾×ÆÍ¤Ë¤Ä¤¤¤Æ¡¢Bison¤¬·Ù¹ð¤òɽ¼¨¤·¤Ê¤¤¤è¤¦¤Ë¡¢ %expect nÀë¸À¤ò»È¤¨¤Þ¤¹¡£ ¤¹¤ë¤È¡¢¤Á¤ç¤¦¤Én¸Ä¤Î¥·¥Õ¥È´Ô¸µ¾×ÆÍ¤¬¤¢¤ë¤«¤®¤ê¡¢ ·Ù¹ð¤Ïɽ¼¨¤µ¤ì¤Þ¤»¤ó¡£ See Suppressing Conflict Warnings¡£

¾åµ­¤Îif_stmt¤ÎÄêµÁ¤Ï¡¢¾×ÆÍ¤ò¤ï¤¶¤ÈȯÀ¸¤µ¤»¤ë¤¿¤á¤Ë½ñ¤­¤Þ¤·¤¿¤¬¡¢ Äɲäε¬Â§¤¬¤Ê¤±¤ì¤Ð¼ÂºÝ¤Ë¤Ï¾×ÆÍ¤¬µ¯¤­¤Þ¤»¤ó¡£ ¼¡¤Ë¡¢¼ÂºÝ¤Ë¾×ÆÍ¤ò´Þ¤à´°Á´¤ÊBisonÆþÎÏ¥Õ¥¡¥¤¥ë¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£

%token IF THEN ELSE variable
%%
stmt:     expr
        | if_stmt
        ;
if_stmt:
          IF expr THEN stmt
        | IF expr THEN stmt ELSE stmt
        ;
expr:     variable
        ;