Contact/support | Changelog

parsec golf

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
choosing = choice . trying 

infixr 0 //
f // x = return $ f x

literal :: GenParser Char st Expr
literal =  choosing
    [ do b <- choosing [ string "true"  >> return True 
                       , string "false" >> return False]
         LitE// OBool b
      <?> "boolean"
    , choosing  [ do a <- many1 digit
                     char '.'
                     b <- many digit
                     LitE// ONum (read (a ++ "." ++ b) :: )
                , do a <- many1 digit
                     LitE// ONum (read a :: ) ] 
      <?> "number"
    , do string "\""
         strlit <- many $ 
            choosing [ string "\\\"" >> return '\"'
                     , string "\\n"  >> return '\n'
                     , noneOf "\"\n"]
         string "\""
         LitE// OString strlit
      <?> "string"  
    ] <?> "literal" 

parsec golf (annotation)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
literal :: GenParser Char st Expr
literal = ("literal" ?:) $
	"boolean" ?: do
		b  <-      (string "true"  >> return True )
		      *<|> (string "false" >> return False)
		return $ LitE $ OBool b
	*<|> "number" ?: (
		do
			a <- many1 digit
			char '.'
			b <- many digit
			return $ LitE $ ONum (read (a ++ "." ++ b) :: )
		*<|>  do
			a <- many1 digit
			return $ LitE $ ONum (read a :: )
		)
	*<|> "string" ?: do
		string "\""
		strlit <-  many $ (string "\\\"" >> return '\"') 
		             *<|> (string "\\n" >> return '\n')
		             *<|> ( noneOf "\"\n")
		string "\""
		return $ LitE $ OString strlit
19:35: Warning: Redundant bracket
Found:
(string "\\\"" >> return '"') *<|> (string "\\n" >> return '\n')
*<|> (noneOf "\"\n")
Why not:
(string "\\\"" >> return '"') *<|> (string "\\n" >> return '\n')
*<|> noneOf "\"\n"

parsec golf trying

1
2
3
4
5
-- forgot to add this doubtful definition, or something like it
trying [] = []
trying [x] = [x]
trying [x,y] = [try x , y]
trying (x:xs) = try x : trying xs

parsec golf trying (annotation)

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
{-#LANGUAGE RebindableSyntax,CPP#-}
import Text.ParserCombinators.Parsec  
import Control.Applicative ((*>),(<*),(<$))
import Prelude 
#define parsing let ((>>),(>>=)) = ((>>>>),(>>>=))
#define attempts let x >> y = try x <|> y

literal :: GenParser Char st Expr
literal =  
  do attempts
     do parsing
        b <- do attempts
                True  <$ string "true" 
                False <$ string "false" 
        OBool// b
      <?> "boolean"

     do attempts
        do parsing
           a <- many1 digit <* char '.'
           b <- many digit
           ONum// (read (a ++ "." ++ b) :: Double)
        do parsing
           a <- many1 digit
           ONum// (read a :: Double) 
       <?> "number"
   
     do parsing
        string "\""
        strlit <- many $ 
            do attempts
               '\"' <$ string "\\\""
               '\n' <$ string "\\n"  
               noneOf "\"\n"
        string "\""
        OString// strlit
      <?> "string"  
  
  <?> "literal"

infixr 1 //
f // x = return (f x)

data Expr = ONum Double | OString String | OBool Bool
(>>>=) :: GenParser a b c -> (c -> GenParser a b d) -> GenParser a b d
(>>>>)  :: GenParser a b c -> GenParser a b d -> GenParser a b d
((>>>=),(>>>>)) = ((>>=),(>>))