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' |