SwiftLex

一个简单的、可扩展的词法分析器,灵感来源于 Rouge 中的 RegexLexer

安装

您可以通过将以下行添加到您软件包的依赖项中来安装此软件包

.package(url: "https://github.com/Zollerboy1/SwiftLex.git", from: "1.0.0")

然后,您可以将 SwiftLex 产品添加到您目标的依赖项中。

用法

导入 SwiftLex 模块。

现在,您可以通过使一个类型遵循 Lexer 协议来创建您自己的词法分析器

enum MyTokenType: LexerTokenType {
    case text
    case number
    case identifier
    case equals
    case error
}

struct MyLexer: Lexer {
    typealias TokenType = MyTokenType

    init() {}

    var root: State<Self> {
        Mixin(rulesOf: \.whitespace)

        Match(regex: /[0-9]+/, tokenType: .number)
        Match(regex: /[a-zA-Z_][a-zA-Z0-9_]*/, tokenType: .identifier, nextState: \.assignment)
    }

    @StateBuilder<Self>
    var whitespace: State<Self> {
        Match(regex: /[\s\n]+/, tokenType: .text)
    }

    @StateBuilder<Self>
    var assignment: State<Self> {
        Match(regex: /(\s*)(=)(\s*)([0-9]+)/) { context, match in
            context.appendTokens(forCapturesOf: match, withTypes: .text, .equals, .text, .number)
            context.popState()
        }
    }
}

此词法分析器将接受顶层空白、简单的变量赋值和数字

let string = """
a = 4
b = 5
6

c=8
"""

let tokens = SwiftLex.tokenize(string: string, using: MyLexer.self)
// tokens is an array of 'Token<MyTokenType>'s.

有关更多分词示例,请查看 Tests/SwiftLexTests/SwiftLexTests.swift