一个用于 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)