Links und Funktionen
Sprachumschaltung

Navigationspfad
Sie sind hier: Startseite / Lehre / SS 2014 / Programmierung und Modellierung / ProMo Material / Vorlage H6-3 (Parser)


Inhaltsbereich

Vorlage H6-3 (Parser)

Dateivorlage zur Hausübung 6-3. Vervollständigen Sie den am Ende von Vorlesung 8 begonnenen simplen Parser für arithmetische Ausdrücke.

Haskell source code icon VorlageExprParser.hs — Haskell source code, 1 KB (1661 bytes)

Dateiinhalt

-- Vervollständigen Sie alle Funktion ab Zeile 42!
-- Sie dürfen auch das Pattern-Matching der Funktionen verändern.
-- Vor Zeile 42 dürfen Sie nichts verändern.
 
data Token = CONST Integer | LPAREN | RPAREN | PLUS | TIMES

instance Show Token where
  show (CONST i) = show i
  show LPAREN    = "("
  show RPAREN    = ")"
  show PLUS      = "+"
  show TIMES     = "*"
  
lexer :: String -> [Token]           
lexer     ""  = []
lexer (' ':s) =        lexer s
lexer ('(':s) = LPAREN:lexer s
lexer (')':s) = RPAREN:lexer s
lexer ('+':s) = PLUS  :lexer s
lexer ('*':s) = TIMES :lexer s
lexer      s  = (CONST $ read num) : lexer rest
  where (num,rest) = span (`elem` '-':['0'..'9']) s
    
data Expr = Const Integer | Plus  Expr Expr | Times Expr Expr

instance Show Expr where
  show (Const i)     = show i
  show (Plus  e1 e2) = "("++ show e1 ++ "+" ++ show e2 ++")"
  show (Times e1 e2) = "("++ show e1 ++ "*" ++ show e2 ++")"
  
instance Read Expr where
  readsPrec _ s = let (e,t) = parseExpr $ lexer s in [(e,concatMap show t)]

test :: Expr -- query GHCI for "test" to test your solution
test = read "1 * (2 + 3 * 4) + 5 * 6 + 7 + 8 * 9"
  
parseExpr :: [Token] -> (Expr,[Token]) 
parseExpr l = case parseProd l of
  (summand1, PLUS:rest1) -> let (summand2 , rest2) = parseExpr rest1 
                            in  (Plus summand1 summand2, rest2)
  other -> other

-- Implementieren Sie folgende Funktionen:                
parseProd   :: [Token] -> (Expr,[Token]) 
parseProd   ts = error "Funktion parseProd noch nicht implementiert"

parseFactor :: [Token] -> (Expr,[Token])
parseFactor ts = error "Funktion parseFactor noch nicht implementiert"

Artikelaktionen


Funktionsleiste