Next: Simple Error Recovery, Previous: RPN Calc, Up: Examples [Contents][Index]
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