一个简单的、可扩展的词法分析器,灵感来源于 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
。