Next: Precedence, Previous: Look-Ahead, Up: Algorithm [Contents][Index]
¼¡¤Î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 ;