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