Next: , Previous: Rpcalc Rules, Up: RPN Calc   [Contents][Index]


2.1.3 rpcalc»ú¶ç²òÀÏ´ï

»ú¶ç²òÀÏ´ï¤Î»Å»ö¤Ï¡¢Äã¿å½à¤Î¹½Ê¸²òÀϤǡ¢Ê¸»ú¤Þ¤¿¤Ïʸ»úÎó¤ò ¥È¡¼¥¯¥ó¤ËÊÑ´¹¤·¤Þ¤¹¡£ Bison¹½Ê¸²òÀÏ´ï¤Ï¡¢»ú¶ç²òÀÏ´ï¤ò¸Æ¤Ó½Ð¤·¤Æ¥È¡¼¥¯¥ó¤òÆÀ¤Þ¤¹¡£ See The Lexical Analyzer Function yylex¡£

RPN¡ÊµÕ¥Ý¡¼¥é¥ó¥Éµ­Ë¡¡ËÅÅÂî¤Ë¤Ï¡¢´Êñ¤Ê»ú¶ç²òÀÏ´ï¤Î¤ß¤¬É¬ÍפǤ¹¡£ ¤³¤Î»ú¶ç²òÀÏ´ï¤Ï¡¢¶õÇò¤È¥¿¥Ö¤òÆÉ¤ßÈô¤Ð¤·¡¢ ¿ôÃͤòÆÉ¤ß¹þ¤ó¤Çdouble·¿¤ÎNUM¥È¡¼¥¯¥ó¤È¤·¤ÆÊÖ¤·¤Þ¤¹¡£ ¿ôÃͤΰìÉôʬ¤Ç¤Ï¤Ê¤¤¤½¤Î¾¤Îʸ»ú¤Ï¡¢ÆÈΩ¤Î¥È¡¼¥¯¥ó¤Ç¤¹¡£ 1ʸ»ú¥È¡¼¥¯¥ó¤Î¥È¡¼¥¯¥óÉ乿¤Ï¤½¤Îʸ»ú¼«¿È¤Ç¤¢¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£

»ú¶ç²òÀÏ´Ø¿ô¤ÎÌá¤êÃͤϡ¢¥È¡¼¥¯¥ó·¿¤òɽ¤¹¿ôÃͤǤ¹¡£ Bisonµ¬Â§¤ÎÃæ¤Ç¥È¡¼¥¯¥ó·¿¤òɽ¤¹¤¿¤á¤Ë»È¤ï¤ì¤ëʸ»úÎó¤ÈƱ¤¸¤â¤Î¤¬¡¢ ¤½¤Î·¿¤Î¿ôÃÍÉ乿¤òɽ¤¹C¤Î¼°¤Ç¤â¤¢¤ê¤Þ¤¹¡£ ¤³¤ì¤Ë¤Ï¡¢2¼ïÎà¤ÎƯ¤­¤¬¤¢¤ê¤Þ¤¹¡£ ¤â¤·¡¢¥È¡¼¥¯¥ó·¿¤¬Ê¸»ú¥ê¥Æ¥é¥ë¤Ê¤é¤Ð¡¢ ¤½¤Î¿ôÃÍÉ乿¤Ïʸ»ú¤ÎASCIIÉ乿¤Ç¤¢¤ê¡¢ ¿ôÃͤòɽ¤¹¤¿¤á¤Ë»ú¶ç²òÀÏ´ï¤ÎÃæ¤ÈƱ¤¸Ê¸»ú¥ê¥Æ¥é¥ë¤ò»È¤¨¤Þ¤¹¡£ ¤â¤·¡¢¥È¡¼¥¯¥ó·¿¤¬¼±Ê̻Ҥʤé¤Ð¡¢Å¬ÀÚ¤ÊÈÖ¹æ¤òÄêµÁ¤¹¤ëC¤Î¥Þ¥¯¥í¤È¤·¤Æ¡¢ ¤½¤Î¼±Ê̻Ҥ¬Bison¤Ë¤è¤Ã¤ÆÄêµÁ¤µ¤ì¤Þ¤¹¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢¤³¤ÎÎã¤Ç¤Ï¡¢NUM¤Ï¡¢yylex¤Î¤¿¤á¤Ë»È¤¨¤ë ¥Þ¥¯¥í¤Ë¤â¤Ê¤ê¤Þ¤¹¡£

¥È¡¼¥¯¥ó¤Î°ÕÌ£Ãͤϡ¢¤â¤·Â¸ºß¤¹¤ì¤Ð¡¢Âç°èÊÑ¿ôyylval¤Ëµ­²±¤µ¤ì¡¢ Bison¹½Ê¸²òÀÏ´ï¤Ï¤½¤³¤ò¸«¤Ë¤¤¤­¤Þ¤¹ ¡Êyylval¤ÎC¥Ç¡¼¥¿·¿¤Ï¡¢Ê¸Ë¡¤ÎºÇ½é¤ÇÄêµÁ¤µ¤ì¤ëYYSTYPE¤Ç¤¹¡£ see Declarations for rpcalc¡Ë¡£

¥Õ¥¡¥¤¥ë¤Î½ª¤ï¤ê¤Ë㤹¤ë¤È¡¢¥È¡¼¥¯¥ó·¿¤Î¥³¡¼¥É0¤¬ÊÖ¤µ¤ì¤Þ¤¹ ¡ÊBison¤Ï¡¢Àµ¤Ç¤Ê¤¤Ç¤°Õ¤ÎÃͤòÆþÎϤνª¤ï¤ê¤Èǧ¼±¤·¤Þ¤¹¡Ë¡£

»ú¶ç²òÀÏ´ï¤Î¥×¥í¥°¥é¥à¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£

/*
 * »ú¶ç²òÀÏ´ï¤Ï¡¢¿ôÃͤòÆÉ¤á¤Ð¡¢double·¿¤ÎÃͤò¥¹¥¿¥Ã¥¯¤ËÀѤó¤Ç
 * ¥È¡¼¥¯¥ó¡ÖNUM¡×¤òÊÖ¤·¡¢¿ôÃͰʳ°¤òÆÉ¤á¤Ð¡¢¤½¤Îʸ»ú¤Î¥¢¥¹¥­¡¼É乿¤òÊÖ¤¹¡£
 * ¶õÇò¤È¥¿¥Ö¤ÏÆÉ¤ßÈô¤Ð¤µ¤ì¤ë¡£¥Õ¥¡¥¤¥ë¤¬½ª¤ï¤ë¤È0¤òÊÖ¤¹¡£
 */

#include <ctype.h>
yylex ()
{
  int c;

  /* ¶õÇòÎà¤òÆÉ¤ßÈô¤Ð¤¹  */
  while ((c = getchar ()) == ' ' || c == '\t')  
    ;
  /* ¿ôÃͤò½èÍý¤¹¤ë   */
  if (c == '.' || isdigit (c))                
    {
      ungetc (c, stdin);
      scanf ("%lf", &yylval);
      return NUM;
    }
  /* ¥Õ¥¡¥¤¥ë¤Î½ª¤ï¤ê¤ò½èÍý¤¹¤ë  */
  if (c == EOF)                            
    return 0;
  /* 1ʸ»ú¤òÊÖ¤¹ */
  return c;                                
}