Next: , Previous: Infix Calc, Up: Examples   [Contents][Index]


2.3 ñ½ã¤Ê¥¨¥é¡¼²óÉü

º£¤Þ¤Ç¡¢Ëܽñ¤Ç¤Ï¡¢¥¨¥é¡¼²óÉü¡Êerror recovery¡Ë¡¢ ¤Ä¤Þ¤ê¡¢¹½Ê¸¥¨¥é¡¼¤ò¸¡½Ð¤·¤¿¸å¤Ç¹½Ê¸²òÀϤò³¤±¤ëÊýË¡¤Ë¤Ä¤¤¤Æ¤Ï ¸ÀµÚ¤·¤Æ¤¤¤Þ¤»¤ó¤Ç¤·¤¿¡£ º£¤Þ¤Ç¤Ë°·¤Ã¤¿¤³¤È¤Ï¡¢yyerror¤ò»È¤Ã¤Æ¥¨¥é¡¼¤òÊó¹ð¤¹¤ë¤³¤È¤À¤±¤Ç¤·¤¿¡£ yyerror¤ò¸Æ¤Ó½Ð¤·¤¿¸å¤Ç¡¢ÆÃ¤Ë»ØÄꤷ¤Ê¤¤¤Èyyparse¤Ï ½èÍý¤ò½ª¤ï¤ë¤³¤È¤ò»×¤¤½Ð¤·¤Æ¤¯¤À¤µ¤¤¡£ ¤Ä¤Þ¤ê¡¢¥¨¥é¡¼¤ò´Þ¤àÆþÎϹԤ¬¡¢ÅÅÂî¥×¥í¥°¥é¥à¤ò½ªÎ»¤µ¤»¤Þ¤¹¡£ ¤³¤Î·ç´Ù¤ò¤É¤Î¤è¤¦¤Ë²þÁ±¤¹¤ë¤«¼¨¤·¤Þ¤·¤ç¤¦¡£

Bison¸À¸ì¤Îʸˡµ¬Â§¤Ë¤Ï¡¢Í½Ìó¸ìerror¤¬¤¢¤ê¤Þ¤¹¡£ ¼¡¤ÎÎã¤Ç¤Ï¡¢line¤ËÂФ¹¤ëÁªÂò»è·²¤Ëerror¤òÄɲ乤ë ÊýË¡¤ò¼¨¤·¤Þ¤¹¡£

line:     '\n'
        | exp '\n'   { printf ("\t%.10g\n", $1); }
        | error '\n' { yyerrok;                  }
;

ʸˡ¤Ø¤Î¤³¤ÎÄɲäˤè¤Ã¤Æ¡¢¹½Ê¸²òÀÏ¥¨¥é¡¼¤¬È¯À¸¤·¤¿¾ì¹ç¤Ë¡¢ ´Êñ¤Ê¥¨¥é¡¼²óÉü¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£ ɾ²ÁÉÔ²Äǽ¤Ê¼°¤¬ÆÉ¤ß¹þ¤Þ¤ì¤ë¤È¡¢ line¤ËÂФ¹¤ëÂè3¤Îµ¬Â§¤Ë¤è¤Ã¤Æ¥¨¥é¡¼¤¬Ç§¼±¤µ¤ì¡¢ ¹½Ê¸²òÀϤ¬Â³¤±¤é¤ì¤Þ¤¹¡£ ¤³¤Î¾ì¹ç¤Ë¤â¡¢´Ø¿ôyyerror¤Ï¸Æ¤Ó½Ð¤µ¤ì¡¢ ¥á¥Ã¥»¡¼¥¸¤òɽ¼¨¤·¤Þ¤¹¡£ ¥¢¥¯¥·¥ç¥ó¤Ï¡¢ Bison¤Ë¤è¤Ã¤Æ¼«Æ°Åª¤ËÄêµÁ¤µ¤ì¤ë¥Þ¥¯¥í¤Ç¤¢¤ëyyerrokʸ¤ò¼Â¹Ô¤·¤Þ¤¹¡£ ¤³¤ì¤Ï¥¨¥é¡¼²óÉü¤Î´°Î»¤ò°ÕÌ£¤·¤Þ¤¹¡Êsee Error Recovery¡Ë¡£ yyerrok¤Èyyerror¤Î°ã¤¤¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£

¤³¤Î·Á¼°¤Î¥¨¥é¡¼²óÉü¤Ï¡¢¹½Ê¸¥¨¥é¡¼¤ò°·¤¤¤Þ¤¹¡£ ¾¤Î¼ïÎà¤Î¥¨¥é¡¼¤â¤¢¤ê¤Þ¤¹¡£ ¤¿¤È¤¨¤Ð¡¢0¤Ë¤è¤ë½ü»»¤Ï¡¢Îã³°¥·¥°¥Ê¥ë¤òȯÀ¸¤·¡¢Ä̾ï¤ÏÃ×̿Ū¤Ç¤¹¡£ ¼ÂºÝ¤ÎÅÅÂî¥×¥í¥°¥é¥à¤Ï¡¢¤³¤Î¥·¥°¥Ê¥ë¤ò¤Ä¤«¤Þ¤¨¤Æ¡¢longjmp¤ò»È¤Ã¤Æ main¤ËÌá¤ê¡¢ÆþÎϹԤι½Ê¸²òÀϤò³¤±¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ¤µ¤é¤Ë¡¢¸½ºß¤ÎÆþÎϹԤλĤê¤ÏÇË´þ¤µ¤ì¤ë¤Ù¤­¤Ç¤¹¡£ ¤·¤«¤·¡¢¤³¤ì¤é¤ÎÌäÂê¤Ï¡¢Bison¤Î¥×¥í¥°¥é¥à¤Ë¸ÇÍ­¤ÎÌäÂê¤Ç¤Ï¤Ê¤¤¤Î¤Ç¡¢ Ëܽñ¤Ç¤Ï²òÀ⤷¤Þ¤»¤ó¡£