[Ebene höher] [Zurück] [Weiter] [Inhalt] [Seitenende]

Beispiel

> {

> module Main where

> data Lexem = TVarid String
>            | TComma
>            | TLBracket
>            | TRBracket

> instance Show Lexem where
>   showsPrec i lexem = case lexem of
>     TVarid v  -> showString v
>     TComma    -> showString ","
>     TLBracket -> showString "["
>     TRBracket -> showString "]"

> type Line = Int
> type Col  = Int

> type Token = (Lexem, Line, Col)

> }

> %name myParser
> %tokentype { Token }
> %token varid { (TVarid $$, _, _) }
>        ','   { (TComma, _, _)    }
>        '['   { (TLBracket, _, _) }
>        ']'   { (TRBracket, _, _) }
> %%

> Liste  :: { [String] }
>        : '[' Varids ']'    { $2 }

> Varids :: { [String] }
>        : Varids ',' varid  { $3 : $1 }
>        | varid             { [$1] }
       
> {

> lexer :: Int -> Int -> String -> [Token]
> lexer l c []        = []
> lexer l c ('[':ss)  = (TLBracket, l, c) : lexer l (c+1) ss
> lexer l c (']':ss)  = (TRBracket, l, c) : lexer l (c+1) ss
> lexer l c (',':ss)  = (TComma, l, c) : lexer l (c+1) ss
> lexer l c ('\n':ss) = lexer (l+1) 1 ss
> lexer l c (s:ss)
>   | isAlpha s = let (varid,ss') = span isAlpha (s:ss) 
>                  in (TVarid varid, l, c) : lexer l (c + length varid) ss'
>   | otherwise = error ("Unexpected Symbol " ++ (s:ss))


> luckyError :: String -> [Token] -> a
> luckyError filename []              =
>   error (filename ++ ": Unexpected EOF!")
> luckyError filename ((lexem,l,c):_) =
>   error (filename ++ ": (" ++ show l ++ "," ++ show c ++
>          ") Syntaxerror on input " ++ show lexem)

> main filename = (myParser filename).(lexer 1 1)

> }

[Seitenanfang]

©1996,97,98 Norbert Klose (nklose@mail.com)