1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
> module Calc where
> import Result
> import Char
>
> type Terminal = Char
>
> %{
>
> Terminal = guard {isDigit} as "digit"
> | '+'
> | '*'
> | '('
> | ')';
>
> Nonterminal = expr {Integer}
> | term {Integer}
> | factor {Integer}
> | numeral {Integer};
>
> expr {v1 + v2} : expr {v1}, '+', term {v2};
> {e} | term {e};
> term {v1 * v2} : term {v1}, '*', factor {v2};
> {e} | factor {e};
> factor {n} : numeral {n};
> {e} | '(', expr {e}, ')';
> numeral {encode c} : "digit" {c};
> {n * 10 + encode c} | numeral {n}, "digit" {c};
>
> }%
>
> encode c = toInteger (fromEnum c - fromEnum '0')
>
> frown _ = fail "syntax error"
|