Created
August 23, 2010 21:09
-
-
Save showstopper/546339 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import io/Reader | |
import math | |
import structs/ArrayList | |
import text/[Buffer,StringReader] | |
TokenType: enum { | |
None | |
Number | |
Operator | |
} | |
Token: class { | |
val: String | |
type: TokenType | |
init: func { | |
type = TokenType None | |
} | |
clone: func -> This { | |
toRet := Token new() | |
toRet val = val | |
toRet type = type | |
toRet | |
} | |
toString: func -> String { | |
"TokenType = %d, value = %s" format(type, val) | |
} | |
} | |
findNumber: func(reader: Reader) -> Int { | |
reader rewind(1) | |
beginning := reader mark() | |
chr: Char | |
while(reader hasNext?()) { | |
chr = reader read() | |
if(!chr digit?()) | |
break | |
} | |
end := reader mark() | |
reader reset(beginning) | |
(end - beginning) as SizeT | |
} | |
getToken: func(reader: Reader) -> Token { | |
token := Token new() | |
if (!reader hasNext?()) return token | |
reader skipWhile(' ') | |
//skipMany(reader, |c| c whitespace?()) | |
c := reader read() | |
match c { | |
case '+' || '-' || '*' || '/' => { | |
token val = c toString() | |
token type = TokenType Operator | |
} | |
case => { | |
if (c digit?()) { | |
length := findNumber(reader) | |
length toString() println() | |
s := String new(length) | |
reader read(s, 0, length) | |
token val = s | |
token type = TokenType Number | |
} | |
} | |
} | |
token | |
} | |
skipMany: func(reader: Reader, f: Func(Char) -> Bool) { | |
chr := reader read() | |
while(f(chr)) { | |
if(!reader hasNext?()) | |
return | |
chr = reader read() | |
} | |
reader rewind(1) | |
} | |
tokenize: func(str: String) -> ArrayList<Token> { | |
reader := StringReader new(str) | |
list := ArrayList<Token> new() | |
token := getToken(reader) | |
while (token type != TokenType None) { | |
list add(token clone()) | |
token = getToken(reader) | |
} | |
list | |
} | |
main: func { | |
str := "1+2" | |
tokenize(str) each(|t| t toString() println()) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment