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 %%