%{ #include #include extern int lineno; /* simple AG based on Knuth example 1.3 */ %} %union{ struct { float value; int len; } ival; } %token ZERO ONE RADIXPOINT %type bit bitlist binaryfloat %start binaryfloat %% bit : ZERO { $$.value = 0.; }; bit : ONE { $$.value = 1.; }; bitlist : bit { $$.value = $1.value; $$.len = 1; }; bitlist : bitlist bit { $$.value = 2*$1.value +$2.value; $$.len = $1.len + 1; }; binaryfloat : bitlist { $$.value = $1.value; printf("value is %f\n",$$.value); } ; binaryfloat : bitlist RADIXPOINT bitlist { $$.value = $1.value + $3.value/pow(2., (0.0 + $3.len)); printf("length of fractional part is %d\n", $3.len); printf("value is %f\n",$$.value); }; %%