[Ebene höher] [Zurück] [Weiter] [Inhalt] [Seitenende]
> {
> 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)
> }
©1996,97,98 Norbert
Klose (nklose@mail.com)