diff --git a/runtime/Swift/Sources/Antlr4/Parser.swift b/runtime/Swift/Sources/Antlr4/Parser.swift index c3d913fdd1..db27484554 100644 --- a/runtime/Swift/Sources/Antlr4/Parser.swift +++ b/runtime/Swift/Sources/Antlr4/Parser.swift @@ -14,7 +14,7 @@ import Foundation /// /// - SeeAlso: `ATNDeserializationOptions.generateRuleBypassTransitions` /// -private var bypassAltsAtnCache = [String: ATN]() +private var bypassAltsAtnCache : ATN? = nil /// /// mutex for bypassAltsAtnCache updates @@ -417,15 +417,15 @@ open class Parser: Recognizer { let serializedAtn = getSerializedATN() return bypassAltsAtnCacheMutex.synchronized { - if let cachedResult = bypassAltsAtnCache[serializedAtn] { + if let cachedResult = bypassAltsAtnCache { return cachedResult } var opts = ATNDeserializationOptions() opts.generateRuleBypassTransitions = true let result = try! ATNDeserializer(opts).deserialize(serializedAtn) - bypassAltsAtnCache[serializedAtn] = result - return result + bypassAltsAtnCache = result + return bypassAltsAtnCache! } } diff --git a/runtime/Swift/Sources/Antlr4/Recognizer.swift b/runtime/Swift/Sources/Antlr4/Recognizer.swift index bda3c257bd..4e3ff5d7f2 100644 --- a/runtime/Swift/Sources/Antlr4/Recognizer.swift +++ b/runtime/Swift/Sources/Antlr4/Recognizer.swift @@ -11,7 +11,7 @@ public protocol RecognizerProtocol { func getGrammarFileName() -> String func getParseInfo() -> ParseInfo? func getRuleNames() -> [String] - func getSerializedATN() -> String + func getSerializedATN() -> [Int] func getState() -> Int func getTokenType(_ tokenName: String) -> Int func getVocabulary() -> Vocabulary @@ -95,7 +95,7 @@ open class Recognizer: RecognizerProtocol { /// For interpreters, we don't know their serialized ATN despite having /// created the interpreter from it. /// - open func getSerializedATN() -> String { + open func getSerializedATN() -> [Int] { fatalError("there is no serialized ATN") } diff --git a/runtime/Swift/Sources/Antlr4/atn/ATNDeserializer.swift b/runtime/Swift/Sources/Antlr4/atn/ATNDeserializer.swift index 7c811d4159..96b176399f 100644 --- a/runtime/Swift/Sources/Antlr4/atn/ATNDeserializer.swift +++ b/runtime/Swift/Sources/Antlr4/atn/ATNDeserializer.swift @@ -4,13 +4,6 @@ /// can be found in the LICENSE.txt file in the project root. /// - - -/// -/// -/// - Sam Harwell -/// - import Foundation public class ATNDeserializer { @@ -22,8 +15,8 @@ public class ATNDeserializer { self.deserializationOptions = deserializationOptions ?? ATNDeserializationOptions() } - public func deserialize(_ str: String) throws -> ATN { - let data = str.utf16.map { element in Int(element) } + public func deserialize(_ data: [Int]) throws -> ATN { +// let data = str.utf16.map { element in Int(element) } var p = 0 let version = data[p] diff --git a/runtime/Swift/Sources/Antlr4/misc/InterpreterDataReader.swift b/runtime/Swift/Sources/Antlr4/misc/InterpreterDataReader.swift index 0a56c6743e..6857996f48 100644 --- a/runtime/Swift/Sources/Antlr4/misc/InterpreterDataReader.swift +++ b/runtime/Swift/Sources/Antlr4/misc/InterpreterDataReader.swift @@ -109,7 +109,7 @@ public class InterpreterDataReader { self.ruleNames = ruleNames self.channelNames = channelNames self.modeNames = modeNames - let atnSerialized = String(atnText.map{Character(UnicodeScalar(UInt16($0.trimmingCharacters(in:.whitespaces))!)!)}) + let atnSerialized = atnText.map{Int($0.trimmingCharacters(in:.whitespaces))!} atn = try ATNDeserializer().deserialize(atnSerialized) } diff --git a/tool/resources/org/antlr/v4/tool/templates/codegen/Swift/Swift.stg b/tool/resources/org/antlr/v4/tool/templates/codegen/Swift/Swift.stg index 40235c0f00..fdfeb0477f 100755 --- a/tool/resources/org/antlr/v4/tool/templates/codegen/Swift/Swift.stg +++ b/tool/resources/org/antlr/v4/tool/templates/codegen/Swift/Swift.stg @@ -274,7 +274,7 @@ Parser_(parser, funcs, atn, sempredFuncs, ctor, superClass) ::= << func getRuleNames() -> [String] { return .ruleNames } override - func getSerializedATN() -> String { return ._serializedATN } + func getSerializedATN() -> [Int] { return ._serializedATN } override func getATN() -> ATN { return ._ATN } @@ -1029,7 +1029,7 @@ Lexer(lexer, atn, actionFuncs, sempredFuncs, superClass) ::= << func getRuleNames() -> [String] { return .ruleNames } override - func getSerializedATN() -> String { return ._serializedATN } + func getSerializedATN() -> [Int] { return ._serializedATN } override func getChannelNames() -> [String] { return .channelNames } @@ -1049,9 +1049,9 @@ Lexer(lexer, atn, actionFuncs, sempredFuncs, superClass) ::= << >> SerializedATN(model) ::= << -static let _serializedATN: String = """ - }> - """ +static let _serializedATN:[Int] = [ + }; separator=",", wrap> +] >> /** Using a type to init value map, try to init a type; if not in table diff --git a/tool/src/org/antlr/v4/codegen/target/SwiftTarget.java b/tool/src/org/antlr/v4/codegen/target/SwiftTarget.java index 54ae117162..aee548b335 100644 --- a/tool/src/org/antlr/v4/codegen/target/SwiftTarget.java +++ b/tool/src/org/antlr/v4/codegen/target/SwiftTarget.java @@ -104,7 +104,7 @@ public String toString(Object o, String formatString, Locale locale) { @Override public boolean isATNSerializedAsInts() { - return false; + return true; } @Override