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


2.2 Ãæ´Öµ­Ë¡ÅÅÂî¡§calc

¸åÃÖµ­Ë¡±é»»»Ò¤ËÂå¤ï¤Ã¤ÆÃæ´Öµ­Ë¡±é»»»Ò¤ò°·¤¦¤è¤¦¤Ë rpcalc¤òÊѹ¹¤·¤Þ¤¹¡£ Ãæ´Öµ­Ë¡¤Ë¤Ï¡¢±é»»»Ò¤ÎÍ¥Àè½ç°Ì¤Î³µÇ°¤È¡¢ ŬÀڤʿ¼¤µ¤ËÆþ¤ì»Ò¤Ç¤­¤ë¤«¤Ã¤³¤¬É¬ÍפǤ¹¡£ Ãæ´Öµ­Ë¡ÅÅÂî¤òºî¤ë¤¿¤á¤ÎBison¥½¡¼¥¹¥Õ¥¡¥¤¥ë calc.y¤ò¼¨¤·¤Þ¤¹¡£

/* Ãæ´Öµ­Ë¡ÅÅÂî -- calc */

%{
#define YYSTYPE double
#include <math.h>
%}

/* BISONÀë¸À */
%token NUM
%left '-' '+'
%left '*' '/'
%left NEG     /* negation--ñ¹à¥Þ¥¤¥Ê¥¹ */
%right '^'    /* ¤Ù¤­¾è´Ø¿ô        */

/* ʸˡµ¬Â§¤¬Â³¤¯ */
%%
input:    /* ¶õʸ»úÎó */
        | input line
;

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

exp:      NUM                { $$ = $1;         }
        | exp '+' exp        { $$ = $1 + $3;    }
        | exp '-' exp        { $$ = $1 - $3;    }
        | exp '*' exp        { $$ = $1 * $3;    }
        | exp '/' exp        { $$ = $1 / $3;    }
        | '-' exp  %prec NEG { $$ = -$2;        }
        | exp '^' exp        { $$ = pow ($1, $3); }
        | '(' exp ')'        { $$ = $2;         }
;
%%

yylex¡¢yyerror¡¢main´Ø¿ô¤Ï¡¢ Á°¤ÎÎã¤Î¤â¤Î¤ÈƱ¤¸¤Ç¤¹¡£

¤³¤Î¥×¥í¥°¥é¥à¤Ë¤Ï¡¢2¤Ä¤Î½ÅÍ×¤ÊÆÃħ¤¬¤¢¤ê¤Þ¤¹¡£

Âè2¤ÎÉôʬ¡ÊBisonÀë¸ÀÉô¡Ë¤Ç¤Ï¡¢ %left¤¬¥È¡¼¥¯¥ó¤Î·¿¤È¤½¤ì¤¬º¸·ë¹ç±é»»»Ò¤Ç¤¢¤ë¤ÈÀë¸À¤·¤Þ¤¹¡£ Àë¸À%left¤È%right¡Ê±¦·ë¹ç±é»»»Ò¡Ë¤Ï¡¢ ·ë¹çÀ­¤ò»ý¤¿¤Ê¤¤¥È¡¼¥¯¥ó·¿Ì¾¤òÀë¸À¤¹¤ë¤¿¤á¤Ë»È¤ï¤ì¤ë%token¤ÎÂå¤ï¤ê¤Ë ¤Ê¤ê¤Þ¤¹ ¡Ê1ʸ»ú¤Î¥ê¥Æ¥é¥ë¤Ç¤¢¤ë¥È¡¼¥¯¥ó¤Ï¡¢Ä̾Àë¸À¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤»¤ó¡£ ¤³¤³¤Ç¤Ï¡¢·ë¹çÀ­¤òÀë¸À¤·¤Þ¤¹¡Ë¡£

±é»»»Ò¤ÎÍ¥Àè½ç°Ì¤Ï¡¢Àë¸À¤¬½ñ¤«¤ì¤ë¹Ô¤Î½ç½ø¤Ç·è¤Þ¤ê¤Þ¤¹¡£ ¸å¤«¤éÀë¸À¤µ¤ì¤¿±é»»»Ò¤Û¤É¡¢¹â¤¤Í¥Àè½ç°Ì¤ò»ý¤Á¤Þ¤¹¡£ ¤·¤¿¤¬¤Ã¤Æ¡¢¤Ù¤­¾è¤ÎÍ¥Àè½ç°Ì¤¬¤â¤Ã¤È¤â¹â¤¯¡¢ ñ¹à¤ÎÉé¡ÊNEG¡Ë¡¢¡Ö‘*’¡×¤È¡Ö‘/’¡×¤È³¤­¤Þ¤¹¡£ See Operator Precedence¡£

¤â¤¦1¤Ä¤Î½ÅÍ×¤ÊÆÃħ¤Ï¡¢Ã±¹à¤ÎÉé¤Î±é»»»Ò¤Î¤¿¤á¤ËʸˡÉôʬ¤Ë¤¢¤ë %prec¤Ç¤¹¡£ %prec¤Ï¡¢Ã±½ã¤ËBison¤ËÂФ·¤Æ¡¢µ¬Â§‘| '-' exp’¤Ï NEG¤ÈƱ¤¸Í¥Àè½ç°Ì¤ò»ý¤Ä¤è¤¦¤Ë»Ø¼¨¤·¡¢ ¤³¤ÎÎã¤Ç¤Ï¤É¤Á¤é¤â2ÈÖÌܤ˹⤤ͥÀè½ç°Ì¤ò»ý¤Á¤Þ¤¹¡£

°Ê²¼¤Ïcalc.y¤Î¼Â¹ÔÎã¤Ç¤¹¡£

% calc
4 + 4.5 - (34/(8*3+-3))
6.880952381
-56 + 2
-54
3 ^ 2
9