如何使用 FParsec 解析 SQL 运算符

How to parse SQL operators using FParsec

提问人:lamg 提问时间:9/19/2023 更新时间:9/19/2023 访问量:16

问:

我正在解析 SQL 表达式,并且一直在看这个例子。到目前为止,我专注于布尔运算符,如 、 、 和 。前四个似乎很容易实现,但是我不确定该怎么做:ANDORNOTINNOT INNOT IN

type BinaryExpr = {left: SqlExpr; right: SqlExpr}
and SqlExpr = 
    And of BinaryExpr 
    | Or of BinaryExpr 
    | Not of SqlExpr 
    | In of BinaryExpr 
    | NotIn of BinaryExpr
    | Identifier of string

let parser =
    let opp = OperatorPrecedenceParser<SqlExpr, unit, unit>()
    let ws = spaces
    let ws1 = nextCharSatisfiesNot isLetter >>. ws
    let expr = opp.ExpressionParser
    
    opp.TermParser <- identifier <|> expr
    let buildAnd x y = And { left = x; right = y }
    let buildOr x y = Or { left = x; right = y }
    let buildIn x y = In { left = x; right = y }
    let buildNotIn x y = NotIn { left = x; right = y }
    opp.AddOperator(InfixOperator("OR", ws1, 1, Associativity.Left, buildOr))
    opp.AddOperator(InfixOperator("AND", ws1, 2, Associativity.Left, buildAnd))
    opp.AddOperator(PrefixOperator("NOT", ws1, 3, false, Not))
    opp.AddOperator(InfixOperator("IN", ws1, 4, Associativity.None, buildIn))
    opp.AddOperator(InfixOperator("NOT IN", ws1, 4, Associativity.None, buildNotIn))
    
    ws >>. expr .>> eof

我想要的是:

  • 处理“NOT”和“IN”之间的多个空格
  • 将“NOT IN”解析为二进制运算符

目前我在第一点上失败了。

我假设它在语义上是一个二元运算符,因此我创建了类型变体。NOT INNotIn

fparsec sql-parser

评论


答: 暂无答案