[Swift] Make ATNDeserializationOptions a simple struct.
The previous code was ported from Java, which resulted in 70 lines of code to hold two bools. Use a struct instead.
This commit is contained in:
parent
f8e63d53c5
commit
b4f3a619fd
|
@ -12,7 +12,7 @@ import Foundation
|
||||||
/// This field maps from the serialized ATN string to the deserialized _org.antlr.v4.runtime.atn.ATN_ with
|
/// This field maps from the serialized ATN string to the deserialized _org.antlr.v4.runtime.atn.ATN_ with
|
||||||
/// bypass alternatives.
|
/// bypass alternatives.
|
||||||
///
|
///
|
||||||
/// - SeeAlso: org.antlr.v4.runtime.atn.ATNDeserializationOptions#isGenerateRuleBypassTransitions()
|
/// - SeeAlso: `ATNDeserializationOptions.generateRuleBypassTransitions`
|
||||||
///
|
///
|
||||||
private var bypassAltsAtnCache = [String: ATN]()
|
private var bypassAltsAtnCache = [String: ATN]()
|
||||||
|
|
||||||
|
@ -421,9 +421,9 @@ open class Parser: Recognizer<ParserATNSimulator> {
|
||||||
return cachedResult
|
return cachedResult
|
||||||
}
|
}
|
||||||
|
|
||||||
let deserializationOptions = ATNDeserializationOptions()
|
var opts = ATNDeserializationOptions()
|
||||||
try! deserializationOptions.setGenerateRuleBypassTransitions(true)
|
opts.generateRuleBypassTransitions = true
|
||||||
let result = try! ATNDeserializer(deserializationOptions).deserialize(Array(serializedAtn))
|
let result = try! ATNDeserializer(opts).deserialize(Array(serializedAtn))
|
||||||
bypassAltsAtnCache[serializedAtn] = result
|
bypassAltsAtnCache[serializedAtn] = result
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,8 +40,7 @@ public class ATN {
|
||||||
///
|
///
|
||||||
/// For lexer ATNs, this maps the rule index to the resulting token type.
|
/// For lexer ATNs, this maps the rule index to the resulting token type.
|
||||||
/// For parser ATNs, this maps the rule index to the generated bypass token
|
/// For parser ATNs, this maps the rule index to the generated bypass token
|
||||||
/// type if the
|
/// type if the `ATNDeserializationOptions.generateRuleBypassTransitions`
|
||||||
/// _org.antlr.v4.runtime.atn.ATNDeserializationOptions#isGenerateRuleBypassTransitions_
|
|
||||||
/// deserialization option was specified; otherwise, this is `null`.
|
/// deserialization option was specified; otherwise, this is `null`.
|
||||||
///
|
///
|
||||||
public final var ruleToTokenType: [Int]!
|
public final var ruleToTokenType: [Int]!
|
||||||
|
|
|
@ -4,73 +4,7 @@
|
||||||
/// can be found in the LICENSE.txt file in the project root.
|
/// can be found in the LICENSE.txt file in the project root.
|
||||||
///
|
///
|
||||||
|
|
||||||
|
public struct ATNDeserializationOptions {
|
||||||
|
public var verifyATN = true
|
||||||
///
|
public var generateRuleBypassTransitions = false
|
||||||
///
|
|
||||||
/// - Sam Harwell
|
|
||||||
///
|
|
||||||
|
|
||||||
public class ATNDeserializationOptions {
|
|
||||||
|
|
||||||
static let defaultOptions: ATNDeserializationOptions = {
|
|
||||||
|
|
||||||
let defaultOptions = ATNDeserializationOptions()
|
|
||||||
defaultOptions.makeReadOnly()
|
|
||||||
return defaultOptions
|
|
||||||
|
|
||||||
}()
|
|
||||||
|
|
||||||
|
|
||||||
private var readOnly: Bool = false
|
|
||||||
private var verifyATN: Bool
|
|
||||||
private var generateRuleBypassTransitions: Bool
|
|
||||||
|
|
||||||
public init() {
|
|
||||||
self.verifyATN = true
|
|
||||||
self.generateRuleBypassTransitions = false
|
|
||||||
}
|
|
||||||
|
|
||||||
public init(_ options: ATNDeserializationOptions) {
|
|
||||||
self.verifyATN = options.verifyATN
|
|
||||||
self.generateRuleBypassTransitions = options.generateRuleBypassTransitions
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static func getDefaultOptions() -> ATNDeserializationOptions {
|
|
||||||
return defaultOptions
|
|
||||||
}
|
|
||||||
|
|
||||||
public final func isReadOnly() -> Bool {
|
|
||||||
return readOnly
|
|
||||||
}
|
|
||||||
|
|
||||||
public final func makeReadOnly() {
|
|
||||||
readOnly = true
|
|
||||||
}
|
|
||||||
|
|
||||||
public final func isVerifyATN() -> Bool {
|
|
||||||
return verifyATN
|
|
||||||
}
|
|
||||||
|
|
||||||
public final func setVerifyATN(_ verifyATN: Bool) throws {
|
|
||||||
try throwIfReadOnly()
|
|
||||||
self.verifyATN = verifyATN
|
|
||||||
}
|
|
||||||
|
|
||||||
public final func isGenerateRuleBypassTransitions() -> Bool {
|
|
||||||
return generateRuleBypassTransitions
|
|
||||||
}
|
|
||||||
|
|
||||||
public final func setGenerateRuleBypassTransitions(_ generateRuleBypassTransitions: Bool) throws {
|
|
||||||
try throwIfReadOnly()
|
|
||||||
self.generateRuleBypassTransitions = generateRuleBypassTransitions
|
|
||||||
}
|
|
||||||
|
|
||||||
internal func throwIfReadOnly() throws {
|
|
||||||
if isReadOnly() {
|
|
||||||
throw ANTLRError.illegalState(msg: "This object is readonly")
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,7 +60,7 @@ public class ATNDeserializer {
|
||||||
private let deserializationOptions: ATNDeserializationOptions
|
private let deserializationOptions: ATNDeserializationOptions
|
||||||
|
|
||||||
public init(_ deserializationOptions: ATNDeserializationOptions? = nil) {
|
public init(_ deserializationOptions: ATNDeserializationOptions? = nil) {
|
||||||
self.deserializationOptions = deserializationOptions ?? ATNDeserializationOptions.getDefaultOptions()
|
self.deserializationOptions = deserializationOptions ?? ATNDeserializationOptions()
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
|
@ -667,13 +667,13 @@ public class ATNDeserializer {
|
||||||
|
|
||||||
private func finalizeATN(_ atn: ATN) throws {
|
private func finalizeATN(_ atn: ATN) throws {
|
||||||
markPrecedenceDecisions(atn)
|
markPrecedenceDecisions(atn)
|
||||||
if deserializationOptions.isVerifyATN() {
|
if deserializationOptions.verifyATN {
|
||||||
try verifyATN(atn)
|
try verifyATN(atn)
|
||||||
}
|
}
|
||||||
if deserializationOptions.isGenerateRuleBypassTransitions() && atn.grammarType == ATNType.parser {
|
if deserializationOptions.generateRuleBypassTransitions && atn.grammarType == ATNType.parser {
|
||||||
try generateRuleBypassTransitions(atn)
|
try generateRuleBypassTransitions(atn)
|
||||||
|
|
||||||
if deserializationOptions.isVerifyATN() {
|
if deserializationOptions.verifyATN {
|
||||||
// reverify after modification
|
// reverify after modification
|
||||||
try verifyATN(atn)
|
try verifyATN(atn)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue