簡體   English   中英

Haskell 解析查詢(Parsec)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM