Straighten out Characters and CharacterSets
This commit is contained in:
parent
35a5cf1dc8
commit
59e55a39e4
3 changed files with 66 additions and 34 deletions
60
Sibil/Characters.swift
Normal file
60
Sibil/Characters.swift
Normal 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)
|
||||
}
|
||||
}
|
|
@ -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#>)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue