So here in DevSketch I'm working on Swift parsing and I want turn a function declaration into its respective sections. So I want break apart
override func objectsForString(astring: String, inFilename headername: String) -> [AnyObject]
into
override func objectsForString
and
astring: String, inFilename headername: String
and
-> [AnyObject]
or at a more abstract level
somestuff func theName(theArguments) theReturnStuff
into ("somestuff func theName","theArguments","theReturnStuff") as part of a parsing pipeline.
So what I do is walk along the declaration phrase and break it apart on the outermost brackets.
static func lineToFunctionSentenceParts(line:String)->(String,String,String) {
enum PhrasePosition {
case Name
case Arguments
case Returnval
}
var position = PhrasePosition.Name
var bracketBalance = 0;
var name = ""
var arguments = ""
var returnval = ""
for xchar in line.characters {
let sChar = String(xchar)
let isBracket = adjustBracketBalance(sChar, bracketBalance: &bracketBalance)
switch(position) {
case .Name:
if isBracket {
position = .Arguments
} else {
name += sChar
}
case .Arguments:
if isBracket && bracketBalance == 0 {
position = .Returnval
} else {
arguments += sChar
}
case .Returnval:
returnval += sChar
}
}
return (name,arguments,returnval)
}
But the cool thing here is that i can describe to future me what i was doing with the locally scoped enum
enum PhrasePosition {
case Name
case Arguments
case Returnval
}
Sure I can do that in Objective-C but it would be
- Scoped to the entire m file.
- Up at the top where I can't see it.
This comment has been removed by the author.
ReplyDelete