Я пытаюсь сделать парсер запросов в Haskell, но не понимаю, как я должен разрешать разные дополнительные пути логики парсера. Моя попытка:
query :: Parser Query
query = do
-- add more queries
reserved "SELECT"
select <- sequenceOfExpr
reserved "FROM"
table <- identifier
semi
return $ Select select table (BoolConst True)
<|> do
reserved "SELECT"
select <- sequenceOfExpr
reserved "FROM"
table <- identifier
reserved "WHERE"
whereQ <- bExpression
semi
return $ Select select table whereQ
<|> do
reserved "INSERT"
insert <- sequenceOfExpr
reserved "INTO"
table <- identifier
semi
return $ Insert insert table
<|> do
reserved "REMOVE"
reserved "FROM"
table <- identifier
reserved "WHERE"
whereQ <- bExpression
semi
return $ Remove table whereQ
<|> do
reserved "CREATE"
table <- identifier
fields <- sequenceOfExpr
semi
return $ Create table fields
<|> do
reserved "DROP"
table <- identifier
semi
return $ Drop table
, которая работает при разборе строки, соответствующей первой структуре do stmt, например:
"SELECT testField FROM testTable;"
, но не для остальных. Например, при разборе:
"SELECT testField FROM testTable WHERE TRUE"
Вместо того, чтобы пробовать другие пути, он возвращает:
unexpected "W"
expecting ";"
Другими словами, кажется, что он пробует только первую логику. Что я делаю неправильно?
Любая помощь будет высоко ценится!