Straighten out Characters and CharacterSets

This commit is contained in:
Eryn Wells 2016-12-19 08:57:59 -08:00
parent 35a5cf1dc8
commit 59e55a39e4
3 changed files with 66 additions and 34 deletions

View file

@ -9,6 +9,7 @@
/* Begin PBXBuildFile section */
C0496EB51E04533D0000E33E /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0496EB41E04533D0000E33E /* main.swift */; };
C0496EBC1E04534F0000E33E /* Lexer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0496EBB1E04534F0000E33E /* Lexer.swift */; };
C0C60EC11E084631004C1559 /* Characters.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0C60EC01E084631004C1559 /* Characters.swift */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
@ -27,6 +28,7 @@
C0496EB11E04533D0000E33E /* Sibil */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Sibil; sourceTree = BUILT_PRODUCTS_DIR; };
C0496EB41E04533D0000E33E /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; };
C0496EBB1E04534F0000E33E /* Lexer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Lexer.swift; sourceTree = "<group>"; };
C0C60EC01E084631004C1559 /* Characters.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Characters.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -61,6 +63,7 @@
children = (
C0496EB41E04533D0000E33E /* main.swift */,
C0496EBB1E04534F0000E33E /* Lexer.swift */,
C0C60EC01E084631004C1559 /* Characters.swift */,
);
path = Sibil;
sourceTree = "<group>";
@ -124,6 +127,7 @@
buildActionMask = 2147483647;
files = (
C0496EBC1E04534F0000E33E /* Lexer.swift in Sources */,
C0C60EC11E084631004C1559 /* Characters.swift in Sources */,
C0496EB51E04533D0000E33E /* main.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
@ -254,6 +258,7 @@
C0496EBA1E04533D0000E33E /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};

60
Sibil/Characters.swift Normal file
View file

@ -0,0 +1,60 @@
//
// Characters.swift
// Sibil
//
// Created by Eryn Wells on 12/19/16.
// Copyright © 2016 Eryn Wells. All rights reserved.
//
import Foundation
extension CharacterSet {
static let asciiLetters: CharacterSet = {
return CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
}()
static let asciiDigits: CharacterSet = {
return CharacterSet(charactersIn: "1234567890")
}()
static let identifierInitials: CharacterSet = {
let letters = CharacterSet.asciiLetters
let extras = CharacterSet(charactersIn: "!$%&*/:<=>?~_^")
let initials = letters.union(extras)
return initials
}()
static let identifierSubsequents: CharacterSet = {
let initials = CharacterSet.identifierInitials
let digits = CharacterSet.asciiDigits
let extras = CharacterSet(charactersIn: ".+-")
let subsequents = initials.union(digits).union(extras)
return subsequents
}()
func contains(_ char: Character) -> Bool {
let cSet = CharacterSet(charactersIn: String(char))
let isSuperset = self.isSuperset(of: cSet)
return isSuperset
}
}
extension Character {
var isLeftParen: Bool {
return self == "("
}
var isRightParen: Bool {
return self == ")"
}
var isIdentifierInitial: Bool {
return false
}
var isIdentifierSubsequent: Bool {
return CharacterSet.identifierSubsequents.contains(self)
}
}

View file

@ -93,7 +93,7 @@ extension Lexer: Sequence, IteratorProtocol {
toState(.Identifier)
}
case .Identifier:
if c.isIdentifierSubsequent
break
case .Emit:
// Nothing to do for this state
break
@ -103,36 +103,3 @@ extension Lexer: Sequence, IteratorProtocol {
return token
}
}
extension Character {
static let identifierInitialSet: CharacterSet = {
let letters = CharacterSet.letters
let extras = CharacterSet(charactersIn: "!$%&*/:<=>?~_^")
let initials = letters.union(extras)
return initials
}()
static let identifierSubsequentSet: CharacterSet = {
let initials = Character.identifierInitialSet
let digits = CharacterSet.decimalDigits
let extras = CharacterSet(charactersIn: ".+-")
let subsequents = initials.union(digits).union(extras)
return subsequents
}()
var isLeftParen: Bool {
return self == "("
}
var isRightParen: Bool {
return self == ")"
}
var isIdentifierInitial: Bool {
return false
}
var isIdentifierSubsequent: Bool {
Character.identifierSubsequentSet.contains(<#T##member: UnicodeScalar##UnicodeScalar#>)
}
}