File: TestFrown.lhs

package info (click to toggle)
frown 0.6.1-13
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 9,956 kB
  • sloc: haskell: 35,132; makefile: 228; csh: 35; yacc: 23
file content (95 lines) | stat: -rw-r--r-- 3,949 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
Compile me with

        ghc --make TestFrown.lhs

> import System
> import Monad

Helper functions.

> subsets []                    =  [[]]
> subsets (a : s)               =  sets ++ map (a :) sets
>     where sets                =  subsets s
>
> interleave sep []             =  ""
> interleave sep [s]            =  s
> interleave sep (s1 : s2 : x)  =  s1 ++ sep ++ interleave sep (s2 : x)

> revBreak                      :: (a -> Bool) -> [a] -> ([a], [a])
> revBreak p as                 =  (reverse as2, reverse as1)
>     where (as1, as2)          =  break p (reverse as)
>
> echo                          =  putStrLn
>
> foreach x f                   =  mapM f x
>
> call xs                       =  system cmd >>= \ exit ->
>                                      case exit of
>                                          ExitSuccess   -> return ()
>                                          ExitFailure _ -> putStrLn ("!!! failed: " ++ cmd)
>     where cmd                 =  concat xs
>
> frown                         =  "../../frown"
>
> test opts g flag              =  do echo (out ++ g ++ " ..." ++
>                                           if null opts then ""
>                                           else " (" ++ interleave ", " [ o | o <- opts ] ++ ")")
>                                     call ([frown] ++ [ " " ++ o | o <- opts' ] ++ [" ", g])
>                                     call ["hugs +I -98 ", t, ".hs < ", t, ".in ", diff, t, ".out"]
>     where out | flag          =  "* testing "
>               | otherwise     =  "* generating "
>           opts'               =  map ("--" ++) opts
>           (s, _)              =  revBreak (== '.') g
>           t                   =  init s
>           diff | flag         =  "| diff -q - "
>                | otherwise    =  "> "

NB. The `|-98|' is only needed for `|LexTerm|'.

Grammar files (has `|EOF|' symbol; is LALR, necessary flags).

> grammars                      =
>     [ ("Calc.lg",     False, True,  [])
>     , ("Let1.lg",     False, True,  ["backtrack"])
>     , ("Let2.lg",     False, True,  [])
>     , ("Let3.lg",     False, True,  [])
>     , ("Let4.lg",     True,  True,  ["lexer"])
>     , ("Let5.lg",     True,  True,  ["lexer"])
>     , ("Let6.lg",     True,  True,  ["expected", "lexer", "optimize"]) -- -o to ensure that the error messages are identical
>     , ("Let7.lg",     True,  True,  ["lexer"])
>     , ("Let8.lg",     True,  True,  ["lexer"])
>     , ("MCalc.lg",    False, True,  [])
>     , ("Paren1.lg",   False, True,  [])
>     , ("Paren2.lg",   False, True,  [])
>     , ("Paren3.lg",   False, True,  [])
>     , ("RepMin.lg",   False, True,  [])
>     , ("VarCalc.lg",  False, True,  [])
>     , ("VarParen.lg", False, True,  [])
>     ]

> main                          =
>     do args <- getArgs
>        case args of
>            ["--generate"]         -> generate grammars >> return ()
>            ("--generate" : files) -> generate [ g | g@(s, _, _, _) <- grammars, s `elem` files] >> return ()
>            []                     -> testall  >> return ()

> generate grammars             =
>     foreach grammars (\ (g, eof, lalr, flags) ->
>       test flags g False
>     )
>
> testall                       =
>     foreach grammars (\ (g, eof, lalr, flags) ->
>       foreach ["standard", "compact", "stackless"] (\ fmt -> -- , "gvstack"
>         foreach (subsets [ "optimize" -- ,"signature=mono", "signature=poly"
>                          , "prefix", "prefix=frown", "suffix=_"]) (\ opts ->
>            let opts' = flags ++ opts ++ ["code=" ++ fmt] in
>            unless ((fmt == "gvstack" && not eof)
>                    || (fmt `elem` ["stackless", "gvstack"] && "backtrack" `elem` flags)
>                    || (fmt == "gvstack" && "lookahead=2" `elem` flags)
>                    || (fmt `elem` ["stackless", "gvstack"] && not lalr))
>                (test opts' g True)
>         )
>       )
>     )