Go to the first, previous, next, last section, table of contents.


Parsen

----------------------------------------------------------------------
> module Parse          (  expr, var, number, ext, lit, lits
>                       )
> where
----------------------------------------------------------------------

----------------------------------------------------------------------
> import CPSParser
>
> import Expr           (  Prim(..), Expr(..)  )
> import Limes          (  Extended(..)  )
----------------------------------------------------------------------

Parsen primitiver Funktionen

----------------------------------------------------------------------
> prim          =  lexical (
>                  lexs "sinh"   & unit Sinh    ?  lexs "cosh"   & unit Cosh
>               ?  lexs "tanh"   & unit Tanh    ?  lexs "coth"   & unit Coth
>               ?  lexs "sin"    & unit Sin     ?  lexs "cos"    & unit Cos
>               ?  lexs "tan"    & unit Tan     ?  lexs "cot"    & unit Cot
>               ?  lexs "exp"    & unit Exp     ?  lexs "ln"     & unit Ln
>               ?  lexs "log"    & unit Log
>               ?  lexs "arcsin" & unit Arcsin  ?  lexs "arccos" & unit Arccos
>               ?  lexs "arctan" & unit Arctan  ?  lexs "arccot" & unit Arccot
>               ?  lexs "abs"    & unit Abs
>               )
----------------------------------------------------------------------

Parsen von Ausdr"ucken

----------------------------------------------------------------------
> expr          =  term &= expr1
> expr1 e1      =  (lit '+' & term &= \e2 -> expr1 (Add e1 e2))
>               ?  (lit '-' & term &= \e2 -> expr1 (Sub e1 e2))
>               ?  unit e1
----------------------------------------------------------------------

----------------------------------------------------------------------
> term          =  sfactor &= term1
> term1 e1      =  (lit '*' & sfactor &= \e2 -> term1 (Mul e1 e2))
>               ?  (lit '/' & sfactor &= \e2 -> term1 (Div e1 e2))
>               ?  unit e1
----------------------------------------------------------------------

----------------------------------------------------------------------
> sfactor       =  (lit '+' & sfactor)
>               ?  (lit '-' & sfactor &= \e -> unit (Neg e))
>               ?  factor
----------------------------------------------------------------------

----------------------------------------------------------------------
> factor        =  atom &= factor1
> factor1 e1    =  (lit '^' & factor &= \e2 -> unit (Pow e1 e2))
>               ?  unit e1
----------------------------------------------------------------------

----------------------------------------------------------------------
> atom          =  (prim &= \f -> many (lit '\") &= \d -> atom &= \e ->
>                   unit (AppPrim f (length d) e))
>               ?  (var &= \f -> many (lit '\") &= \d -> atom &= \e ->
>                   unit (AppFun f (length d) e))
>               ?  (var &= \x -> unit (Var x))
>               ?  (number &= \n -> unit (Lit (read n % 1)))
>               ?  (lit '(' & expr &= \e -> lit ')' & unit e)
----------------------------------------------------------------------

Lexical parser.

----------------------------------------------------------------------
> var           =  lexical (alpha &= \c -> many alphanum &= \cs -> unit (c:cs))
----------------------------------------------------------------------

----------------------------------------------------------------------
> number        =  lexical (many1 digit)
----------------------------------------------------------------------

Parsen von erweiterten Ausdr"ucken

----------------------------------------------------------------------
> ext p         =  (lits "-oo" & unit MInfty)
>               ?  (lits "oo"  & unit Infty)
>               ?  (p &= \v -> unit (Proper v))
----------------------------------------------------------------------

Hilfsparser

----------------------------------------------------------------------
> lit c         =  lexical (item |> (==c))
> lits s        =  lexical (lexs s)
----------------------------------------------------------------------

----------------------------------------------------------------------
> space         =  item |> isSpace
> digit         =  item |> isDigit
> alpha         =  item |> isAlpha
> alphanum      =  item |> isAlphanum
----------------------------------------------------------------------

----------------------------------------------------------------------
> lexs s        =  let lex c = item |> (==c) in accumulat (map lex s)
----------------------------------------------------------------------

----------------------------------------------------------------------
> lexical p     =  p &= \v -> many space & unit v
----------------------------------------------------------------------


Go to the first, previous, next, last section, table of contents.