Advertisement
Guest User

Untitled

a guest
Oct 16th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module Oblig1 where
  2.     --Axel Peter Glede Collett
  3.  
  4. import Data.Char
  5.  
  6. data AST = C String | Seq AST AST | Star AST | Plus AST AST deriving (Show)
  7.  
  8. parse :: String -> AST
  9. parse (x:xs)  
  10.     | isDigit x || isLower x = case lookAhead xs of
  11.         "*" -> Star (C [x])
  12.         "+" -> Plus (C [x]) (parse $ tail xs)
  13.         [] -> C [x]
  14.         _ -> Seq (C [x]) $ parse xs
  15.  
  16. parse ('(':xs) =
  17.     let (inside, rest) = parseParentes xs
  18.     in case lookAhead rest of
  19.         "*" -> Star inside
  20.         "*_" -> Seq (Star inside) (parse $ tail rest)
  21.         "+" -> Plus inside $ parse rest
  22.         [] -> inside
  23.         _ -> Seq inside $ parse rest
  24.  
  25. parse _ = error "Error: Invalid expression"  
  26.  
  27. parseParentes xs =
  28.     let insideParentes = takeWhile ( /= ')') xs
  29.         rest = tail $ dropWhile ( /= ')') xs
  30.     in (parse insideParentes, rest)
  31.  
  32. lookAhead :: String -> [Char]
  33. lookAhead [] = []
  34. lookAhead ('*':xs) = if null xs then "*" else "*_"
  35. lookAhead ('+':xs) = "+"
  36. lookAhead (x:xs) = [x]
  37.  
  38. type Rule = (String, String)
  39. type Rules = [Rule]
  40. type Gr = (String, Rules)
  41. gr :: AST -> Gr
  42. gr ast = gr' ast 0
  43.  
  44. gr' :: AST -> Int -> Gr
  45. gr' (C a) counter =
  46.    let startSymbol = fresh counter
  47.    in (startSymbol, [(startSymbol, a)])
  48.  
  49. gr' (Star x) counter =
  50.     let (s, rules)  = gr' x counter
  51.        empty = (s, "")
  52.        r1Rules = filter r1 rules
  53.        newR1Rules = map (\(s,prod) -> (s,prod ++  s)) r1Rules
  54.        r3Rules = filter r3 rules
  55.        newR3Rules = map (\(p, prod) -> (p, s)) r3Rules
  56.    in (s, newR1Rules ++ newR3Rules ++ [empty] ++ rules)
  57.  
  58. gr' (Seq x y) counter =
  59.     let (xs, xrules) = gr' x counter
  60.        (ys, yrules) = gr' y counter
  61.         r2Rules = filter r2 xrules
  62.         r1Rules = filter r1 xrules
  63.         newR1Rules = map (\(s,prod) -> (s,prod ++ ys)) r1Rules
  64.         r3Rules = filter r3 xrules
  65.         newR3Rules = map (\(s,prod) -> (s, ys)) r3Rules
  66.         r = (ys, r2Rules ++ newR1Rules ++ newR3Rules)
  67.  
  68.     in (ys, r2Rules ++ newR1Rules ++ newR3Rules)
  69.  
  70. --gr' (Plus x y) counter =
  71. --    let (xs, xrules) = gr' x counter
  72. --        (xy, yrules) = gr' y counter
  73. --        n =  
  74. ex = "(a+b)*dc*"
  75.  
  76. ex = "(a+b)*dc*"
  77.  
  78. mem :: String -> String -> Bool
  79. mem s ex =
  80.  
  81. r1 :: Rule -> Bool
  82. r1 (s, prod) = (length prod == 1) && isLower (head prod)
  83.  
  84. r2 :: Rule -> Bool
  85. r2 (s, prod) = not (null prod) && (length prod > 1)  && isLower (head prod) && isUpper (prod !! 1)
  86.  
  87. r3 :: Rule -> Bool
  88. r3 (s, prod) = null prod
  89.  
  90. r4 :: Rule -> Bool
  91. r4 (s, prod) = not (null prod) && isUpper (head prod)
  92.  
  93.  
  94. fresh :: Int -> String
  95. fresh 0 = "S"
  96. fresh counter = "S" ++ show((counter+1))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement