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

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#>)
}
}