Added lexing hexidecimal numbers
This commit is contained in:
parent
040e14d27c
commit
77f3c590c6
@ -41,12 +41,12 @@ func (lexer *LexingOperation) tokenize () (err error) {
|
|||||||
|
|
||||||
if number {
|
if number {
|
||||||
// TODO: tokenize number begin
|
// TODO: tokenize number begin
|
||||||
lexer.nextRune()
|
err = lexer.tokenizeNumberBeginning(false)
|
||||||
|
if err != nil { return }
|
||||||
} else if lowercase || uppercase {
|
} else if lowercase || uppercase {
|
||||||
// TODO: tokenize alpha begin
|
|
||||||
err = lexer.tokenizeAlphaBeginning()
|
err = lexer.tokenizeAlphaBeginning()
|
||||||
if err != nil { return }
|
if err != nil { return }
|
||||||
} else {
|
} else if lexer.char >= '0' && lexer.char <= '9' {
|
||||||
err = lexer.tokenizeSymbolBeginning()
|
err = lexer.tokenizeSymbolBeginning()
|
||||||
if err != nil { return }
|
if err != nil { return }
|
||||||
}
|
}
|
||||||
@ -58,6 +58,72 @@ func (lexer *LexingOperation) tokenize () (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (lexer *LexingOperation) tokenizeNumberBeginning (negative bool) (err error) {
|
||||||
|
if lexer.char == '0' {
|
||||||
|
lexer.nextRune()
|
||||||
|
|
||||||
|
if lexer.char == 'x' {
|
||||||
|
lexer.nextRune()
|
||||||
|
err = lexer.tokenizeHexidecimalNumber(negative)
|
||||||
|
if err != nil { return }
|
||||||
|
} else if lexer.char == 'b' {
|
||||||
|
lexer.nextRune()
|
||||||
|
err = lexer.tokenizeBinaryNumber(negative)
|
||||||
|
if err != nil { return }
|
||||||
|
} else if lexer.char == '.' {
|
||||||
|
err = lexer.tokenizeDecimalNumber(negative)
|
||||||
|
if err != nil { return }
|
||||||
|
} else if lexer.char >= '0' && lexer.char <= '9' {
|
||||||
|
lexer.tokenizeOctalNumber(negative)
|
||||||
|
} else {
|
||||||
|
return file.NewError (
|
||||||
|
lexer.file.Location(), 1,
|
||||||
|
"unexpected character in number literal",
|
||||||
|
file.ErrorKindError)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
lexer.tokenizeDecimalNumber(negative)
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// tokenizeDecimalNumber Reads and tokenizes a hexidecimal number.
|
||||||
|
func (lexer *LexingOperation) tokenizeHexidecimalNumber (negative bool) (err error) {
|
||||||
|
var number uint64
|
||||||
|
|
||||||
|
for {
|
||||||
|
if lexer.char >= '0' && lexer.char <= '9' {
|
||||||
|
number *= 16
|
||||||
|
number += uint64(lexer.char - '0')
|
||||||
|
} else if lexer.char >= 'A' && lexer.char <= 'F' {
|
||||||
|
number *= 16
|
||||||
|
number += uint64(lexer.char - 'A' + 9)
|
||||||
|
} else if lexer.char >= 'a' && lexer.char <= 'f' {
|
||||||
|
number *= 16
|
||||||
|
number += uint64(lexer.char - 'a' + 9)
|
||||||
|
} else {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
err = lexer.nextRune()
|
||||||
|
if err != nil { return }
|
||||||
|
}
|
||||||
|
|
||||||
|
token := Token { }
|
||||||
|
|
||||||
|
if negative {
|
||||||
|
token.kind = TokenKindInt
|
||||||
|
token.value = int64(number) * -1
|
||||||
|
} else {
|
||||||
|
token.kind = TokenKindUInt
|
||||||
|
token.value = uint64(number)
|
||||||
|
}
|
||||||
|
|
||||||
|
lexer.addToken(token)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (lexer *LexingOperation) tokenizeAlphaBeginning () (err error) {
|
func (lexer *LexingOperation) tokenizeAlphaBeginning () (err error) {
|
||||||
got := ""
|
got := ""
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user