Ticket #1544: ParseInfix.hs

File ParseInfix.hs, 844 bytes (added by simonpj, 7 years ago)
Line 
1module Main where
2
3import Text.Read.Lex
4import Text.ParserCombinators.ReadPrec
5import GHC.Read
6
7data Exp = C | Exp :+: Exp | Exp :-: Exp deriving (  Show )
8
9-- A stripped-down read instance that shows the problem
10instance Read Exp where
11   readPrec = parens
12                          ((do Ident "C" <- lexP
13                               return Main.C)
14                         +++
15                           (prec 9 $
16                               (do a1_acT <- step readPrec
17                                   Symbol ":+:" <- lexP
18                                   return ((Main.:+:) a1_acT undefined ))
19                        ))
20
21{-
22p0 = parens (p_C +++ prec 9 (p10 >>= ...))
23    = (p_C +++ prec 9 (p10 >>= ...)) +++ (char '(' >> p0 >> ...)
24    = (p_C +++ (parens (p_C +++ prec 9 (p10 >>= ...)) >>= ...) +++ (char '(' >> p0 >> ...)
25    = (p_C +++ (p_C +++ (char '(' >> p0 >> ...) +++ (char '(' >> p0 >> ...)
26
27(C :+: C) :+: C
28-}
29
30main = print (read "(((((((((((((((C)))))))))))))))" :: Exp)