TryParsec 0.1.0

TryParsec 0.1.0

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布上次发布2016年3月
SPM支持 SPM

Yasuhiro Inami 维护。



TryParsec 0.1.0

  • Yasuhiro Inami

TryParsec

try! Swift 优化的 Monadic 解析器组合子。

  • 灵感来源于 Haskell 的 AttoparsecAeson,以及 Swift 的 Argo
  • 支持 CSV、XML、JSON (以及映射)
  • 不使用 try,但请尝试 :)

注意:此库仍在早期开发阶段。请参阅 TODO & FIXME

快速试用

打开 Examples/TryParsecPlayground.playground

$ sudo gem install fastlane
$ fastlane play   # prepares Xcode Playground

如何使用

// Simple Arithmetic
let ans = parseArithmetic(" ( 12 + 3 )         * 4+5").value
expect(ans) == 65

// CSV
let csv = parseCSV("foo,bar,baz\r\n1,22,333\r\n").value
expect(csv) == [["foo", "bar", "baz"], ["1", "22", "333"]]

// XML
let xmlString = "<p class=\"welcome\"><a href=\"underground.html\" target=\"_blank\">Hello</a><?php echo ' Cruel'; ?> World<!-- 💀 --><![CDATA[💣->😇]]></p>"
let xml = parseXML(xmlString).value
expect(xml) == [.Element("p", [XML.Attribute("class", "welcome")], [.Element("a", [XML.Attribute("href", "underground.html"), XML.Attribute("target", "_blank")], [.Text("Hello")]), .ProcessingInstruction("php echo ' Cruel'; "), .Text(" World"), .Comment(" 💀 "), .Text("💣->😇")])]

// JSON
let jsonString = "{ \"string\" : \"hello\", \"array\" : [1, \"two\", [true, null]] }"
let json = parseJSON(jsonString).value
expect(json) == JSON.Object([
    "string" : .String("hello"),
    "array" : .Array([.Number(1), .String("two"), .Array([.Bool(true), .Null])])
])

JSON 解码和编码

import Curry

struct Model: FromJSON, ToJSON
{
    let string: String
    let array: [Any]?

    static func fromJSON(json: JSON) -> Result<Model, JSON.ParseError>
    {
        return fromJSONObject(json) {
            curry(self.init)
                <^> $0 !! "string"
                <*> $0 !? "array"
        }
    }

    static func toJSON(model: Model) -> JSON
    {
        return toJSONObject([
            "string" ~ model.string,
            "array" ~ model.array
        ])
    }
}

let jsonString = "{ \"string\" : \"hello\", \"array\" : [1, \"two\", [true, null]] }"

// JSON String -> Model
let decoded: Result<Model, JSON.ParseError> = decode(jsonString)

// Model -> JSON String
let encoded: String = encode(decoded.value!)

关于更多信息,请查看 thoughtbot/Curry

支持的功能

  • 基本运算符: >>-, <^>, <*>, *>, <*, <|>, <?>
  • 组合子: zeroOrOne, many, many1, manyTill, skipMany, skipMany1, sepBy, sepBy1, sepEndBy, sepEndBy1, count, chainl, chainl1, chainr, chainr1
  • 文本(UnicodeScalarView): peek, endOfInput, satisfy, skip, skipWhile, take, takeWhile, any, char, not, string, asciiCI, oneOf, noneOf, digit, hexDigit, lowerAlphabet, upperAlphabet, alphabet, alphaNum, space, skipSpaces, endOfLine, number

TODO & FIXME

  • 提高整体性能
    • 当前的 JSON 解析速度比 NSJSONSerialization 慢 70 倍(即使在模块级优化的情况下)

  • 改进错误报告
  • 支持缩进解析器(例如 YAML)
  • 一旦 apple/swift 支持 高阶类型...
    • 支持增量输入
    • 移除工作区,例如基于反射的 JSON 编码

致谢

本库深受以下开发者和库的启发:

  • 布莱恩·奥沙利文:Attoparsec 及 Aeson(Haskell)的作者 Attoparsec & Aeson
  • 达安·利延:Parsec(Haskell)的作者 Parsec
  • thoughtbot:Argo(Swift JSON 解码库)的作者 Argo

参考文献

许可证

MIT