Build Status

解析器组合子

一个用于 Swift 的 解析器组合子 库。

解析器本质上是函数,它们接受任何类型的输入,例如字符串或自定义数据结构,并返回一个输出。

解析器组合子是高阶函数,它们允许解析器的组合,以创建更具表现力的解析器。

示例

例如,一个使用 BNF 语法的简单计算器可以如下实现

<expr>   ::= <term> <addop> <term>     | <term>
<term>   ::= <factor> <mulop> <factor> | <factor>
<factor> ::= '(' <expr> ')' | <num>
<digit>  ::= '0' | '1' | ...
<num>    ::= <digit> | <num> <digit>
<addop>  ::= '+' | '-'
<mulop>  ::= '*' | '/'
import ParserCombinators
import ParserCombinatorOperators

typealias Op = (Int, Int) -> Int
typealias OpParser = Parser<Op, Character>

let addOp: OpParser =
    char("+") ^^^ (+) ||
    char("-") ^^^ (-)

let mulOp: OpParser =
    char("*") ^^^ (*) ||
    char("/") ^^^ (/)

let digit = `in`(.decimalDigits, kind: "digit")
let num = digit.rep(min: 1) ^^ { Int(String($0))! }

let expr: Parser<Int, Character> =
    Parser.recursive { expr in
        let factor = (char("(") ~> expr) <~ char(")")
            || num

        let term = factor.chainLeft(
            separator: mulOp,
            min: 1
        ).map { $0 ?? 0 }

        return term.chainLeft(
            separator: addOp,
            min: 1
        ).map { $0 ?? 0 }
    }

let r = CollectionReader(collection: "(23+42)*3")

guard case .success(let value, _) = expr.parse(r) else {
    fatalError()
}

assert(value == 195)