bcalc

cli bitcoin unit calculator
git clone git://jb55.com/bcalc
Log | Files | Refs | README | LICENSE

parser.y (1526B)


      1 %{
      2 
      3 #include <stdio.h>
      4 #include <stdlib.h>
      5 
      6 #include "num.h"
      7 
      8 enum unit g_output_format;
      9 int g_print_unit;
     10 
     11 int yylex(void);
     12 int yyerror(char* s);
     13 
     14 %}
     15 
     16 %union {
     17   int64_t intval;
     18   double floatval;
     19   struct lexunit lexunit;
     20   struct num num;
     21 }
     22 
     23 %token<intval> T_INT
     24 %token<floatval> T_FLOAT
     25 %token<lexunit> T_UNIT
     26 
     27 %token T_PLUS T_MINUS T_MULTIPLY T_DIVIDE T_LEFT T_RIGHT T_IN
     28 %token T_NEWLINE T_QUIT
     29 %left T_PLUS T_MINUS
     30 %left T_MULTIPLY T_DIVIDE
     31 
     32 %type<num> expr unit_number number mul_expr div_expr
     33 
     34 %start calc
     35 
     36 %%
     37 
     38 calc:
     39     | calc line
     40 ;
     41 
     42 line: T_NEWLINE
     43     | expr T_NEWLINE { num_print(&$1, g_output_format, NULL, g_print_unit); }
     44     | expr T_IN T_UNIT T_NEWLINE {
     45         num_print(&$1, $3.unit, $3.name, g_print_unit);
     46       }
     47     ;
     48 
     49 unit_number:
     50         T_INT T_UNIT     { num_init_int(&$$, $1, $2.unit); }
     51       | T_FLOAT T_UNIT   { num_init_float(&$$, $1, $2.unit); }
     52       ;
     53 
     54 
     55 number: T_INT    { num_init_int(&$$, $1, UNIT_NONE); }
     56       | T_FLOAT  { num_init_float(&$$, $1, UNIT_NONE); }
     57       ;
     58 
     59 mul_expr: number T_MULTIPLY expr    { num_mul(&$$, &$3, &$1); }
     60         | expr   T_MULTIPLY number  { num_mul(&$$, &$1, &$3); }
     61         ;
     62 
     63 div_expr: /* number T_DIVIDE expr   { num_div(&$$, &$1, &$3); } */
     64           expr   T_DIVIDE number { num_div(&$$, &$1, &$3); }
     65         ;
     66 
     67 expr: unit_number
     68     | expr T_PLUS expr      { num_add(&$$, &$1, &$3); }
     69     | expr T_MINUS expr     { num_sub(&$$, &$1, &$3); }
     70     | mul_expr
     71     | div_expr
     72     | T_LEFT expr T_RIGHT   { num_init(&$$); num_assign(&$$, &$2); }
     73 ;
     74 
     75 %%