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