Skip to content

Instantly share code, notes, and snippets.

@turanct
Created July 3, 2017 13:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save turanct/241b336fd2df0975c064748f14ce5240 to your computer and use it in GitHub Desktop.
Save turanct/241b336fd2df0975c064748f14ce5240 to your computer and use it in GitHub Desktop.
Query Parser
import Text.ParserCombinators.Parsec
data Query = And Query Query
| Or Query Query
| Not Query
| Statement String deriving (Show)
andParser = do
arg1 <- statementParser
string " AND "
arg2 <- statementParser
return (And arg1 arg2)
orParser = do
arg1 <- statementParser
string " OR "
arg2 <- statementParser
return (Or arg1 arg2)
notParser = do
char '-'
negation <- statementParser
return (Not negation)
subqueryParser = do
char '('
subquery <- queryParser
char ')'
return subquery
quotedStatementParser = do
char '"'
statement <- many (noneOf "\"")
char '"'
return (Statement statement)
singleStatementParser = do
statement <- many (noneOf " ()")
return (Statement statement)
statementParser = choice [
try (notParser),
try (subqueryParser),
try (quotedStatementParser),
singleStatementParser
]
queryParser = choice [
try (andParser),
try (orParser),
statementParser
]
main = putStrLn $ show $ parse queryParser "(unknown)" "(-foo AND -\"bar plezant\") AND (-bar OR foo)"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment