Ticket #5631: test_rules2.y

File test_rules2.y, 2.0 KB (added by simonmar, 4 years ago)

happy input file

Line 
1{
2import Control.Monad(when)
3import System.Exit
4}
5
6%monad { Maybe } { (>>=) } { return }
7%tokentype { Char }
8%token
9  'a' { 'a' }
10  'b' { 'b' }
11
12%name test0 test0
13%name test1 test1
14%name test2 test2
15%name test3 test3
16%name test4 test4
17%name test5 test5
18%name test6 test6
19%name test7 test7
20%name test8 test8
21%name test9 test9
22%name test10 test10
23
24%%
25
26test0
27  : many1(test3)  { $1 }
28
29test1
30  : sepBy('a','b')  { $1 }
31
32test2
33  : endBy('a','b')  { $1 }
34
35test3
36  : many1(test4)  { $1 }
37
38test4
39  : many1(test5)  { $1 }
40
41test5
42  : sepBy1('a','b')  { $1 }
43
44test6
45  : endBy1('a',test1)  { $1 }
46
47test7
48  : endBy1('a',test2)  { $1 }
49
50test8
51  : endBy1('a',test3)  { $1 }
52
53test9
54  : endBy1('a',test4)  { $1 }
55
56test10
57  : endBy1('a',test5)  { $1 }
58
59many_rev1(p)
60  : p               { [$1] }
61  | many_rev1(p) p  { $2 : $1 }
62
63many1(p)
64  : many_rev1(p)    { reverse $1 }
65
66many(p)
67  : many1(p)        { $1 }
68  |                 { [] }
69
70optional(p)
71  : p               { Just $1 }
72  |                 { Nothing }
73
74sepR(p,q)
75  : p q             { $2 }
76
77sepL(p,q)
78  : p q             { $1 }
79
80sepBy1(p,q)
81  : p many(sepR(q,p)) { $1 : $2 }
82
83sepBy(p,q)
84  : sepBy1(p,q)       { $1 }
85  |                   { [] }
86
87endBy(p,q)
88  : many (sepL(p,q))  { $1 }
89
90endBy1(p,q)
91  : many1 (sepL(p,q)) { $1 }
92
93{
94happyError _  = Nothing
95
96tests         = [ test1 ""      == Just ""
97                , test1 "a"     == Just "a"
98                , test1 "ab"    == Nothing
99                , test1 "aba"   == Just "aa"
100                , test1 "abab"  == Nothing
101
102                , test2 ""      == Just ""
103                , test2 "a"     == Nothing
104                , test2 "ab"    == Just "a"
105                , test2 "aba"   == Nothing
106                , test2 "abab"  == Just "aa"
107                ]
108
109main        = do let failed = filter (not . snd) (zip [0..] tests)
110                 when (not (null failed)) $
111                   do putStrLn ("Failed tests: " ++ show (map fst failed))
112                      exitFailure
113                 putStrLn "Tests passed."
114
115}