[英]Haskell parsing queries (Parsec)
我正在嘗試在 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 ";"
換句話說,它似乎只嘗試了第一個邏輯。 我究竟做錯了什么?
任何幫助將非常感激!
發生這種情況是因為SELECT FROM
替代方案已成功並返回其結果,解析從未嘗試過SELECT FROM WHERE
替代方案。
在這種特定情況下,我只會顛倒他們的順序:首先嘗試SELECT FROM WHERE
,如果這不起作用,請回SELECT FROM
。 您還需要將其包裝在try
中,以便解析器回滾到查詢的開頭。
或者,您可以使WHERE
解析SELECT FROM
解析器的條件部分,如下所示:
do
reserved "SELECT"
select <- sequenceOfExpr
reserved "FROM"
table <- identifier
whereQ <- try (reserved "WHERE" *> bExpression) <|> (pure $ BoolConst True)
semi
return $ Select select table whereQ
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.