View difference between Paste ID: RNnvPPS2 and 9pS7RhRm
SHOW: | | - or go back to the newest paste.
1-
-- data ::= usefulData data | invalidData data | eol
1+
-- data ::= usefulData data | invalidData data 
2
-- usefulData ::= keyAndId value
3
-- keyAndId ::= firstPart id lastPart eol
4
-- firstPart ::= "any_"
5
-- id ::= digits
6
-- lastPart ::= "_shape"
7-
-- value ::= string eol
7+
-- value ::= symbols eol
8-
-- invalidData ::= string ivalidData | digit invalidData | eol
8+
-- invalidData ::= symbols eol
9
-- eol ::= end of line
10
11
12
test :: String -> Either ParseError [(String,String)]
13
test str = parse parser "" str
14
15
parser = do result <- Text.Parsec.Prim.try (many1 parKV) <|> Text.Parsec.Prim.try (many1 orPar) 
16
            return result
17
18
orPar = Text.Parsec.Prim.try parKV <|> Text.Parsec.Prim.try remaining            
19
20
remaining = do skipMany (noneOf "\n") 
21
               eol
22
               return [] >> orPar
23
24
parKV = do
25
          id <- tagLine
26
          name <- nameLine
27
          return (id,name)
28
29
tagLine :: GenParser Char st String 
30
tagLine = do result <- (between firstPart lastPart id)
31
             eol
32
             return result
33
             where
34
                firstPart = string "any_"
35
                id = many digit
36
                lastPart = string "_shape"
37
38
nameLine :: GenParser Char st String
39
nameLine = do name <- (many $ noneOf "\n")
40
              eol
41
              return name
42
43
eol :: GenParser Char st Char
44
eol = char '\n'