Number tokenizing functions use one digit conversion functions
This commit is contained in:
parent
8813928b68
commit
9e4684dbed
108
lexer/lexer.go
108
lexer/lexer.go
@ -58,114 +58,6 @@ func (lexer *LexingOperation) tokenize () (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
// tokenizeSymbolBeginning lexes a token that starts with a number.
|
||||
func (lexer *LexingOperation) tokenizeNumberBeginning (negative bool) (err error) {
|
||||
var number uint64
|
||||
|
||||
if lexer.char == '0' {
|
||||
lexer.nextRune()
|
||||
|
||||
if lexer.char == 'x' {
|
||||
lexer.nextRune()
|
||||
number, err = lexer.tokenizeHexidecimalNumber()
|
||||
} else if lexer.char == 'b' {
|
||||
lexer.nextRune()
|
||||
number, err = lexer.tokenizeBinaryNumber()
|
||||
} else if lexer.char == '.' {
|
||||
number, err = lexer.tokenizeDecimalNumber()
|
||||
} else if lexer.char >= '0' && lexer.char <= '9' {
|
||||
number, err = lexer.tokenizeOctalNumber()
|
||||
} else {
|
||||
return file.NewError (
|
||||
lexer.file.Location(), 1,
|
||||
"unexpected character in number literal",
|
||||
file.ErrorKindError)
|
||||
}
|
||||
} else {
|
||||
number, err = lexer.tokenizeDecimalNumber()
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
// tokenizeHexidecimalNumber Reads and tokenizes a hexidecimal number.
|
||||
func (lexer *LexingOperation) tokenizeHexidecimalNumber () (number uint64, err error) {
|
||||
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 }
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// tokenizeBinaryNumber Reads and tokenizes a binary number.
|
||||
func (lexer *LexingOperation) tokenizeBinaryNumber () (number uint64, err error) {
|
||||
for {
|
||||
if lexer.char == '0' {
|
||||
number *= 2
|
||||
} else if lexer.char == '1' {
|
||||
number *= 2
|
||||
number += 1
|
||||
} else {
|
||||
break
|
||||
}
|
||||
|
||||
err = lexer.nextRune()
|
||||
if err != nil { return }
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// tokenizeDecimalNumber Reads and tokenizes a decimal number.
|
||||
func (lexer *LexingOperation) tokenizeDecimalNumber () (number uint64, err error) {
|
||||
for lexer.char >= '0' && lexer.char <= '9' {
|
||||
number *= 10
|
||||
number += uint64(lexer.char - '0')
|
||||
|
||||
err = lexer.nextRune()
|
||||
if err != nil { return }
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// tokenizeOctalNumber Reads and tokenizes an octal number.
|
||||
func (lexer *LexingOperation) tokenizeOctalNumber () (number uint64, err error) {
|
||||
for lexer.char >= '0' && lexer.char <= '7' {
|
||||
number *= 8
|
||||
number += uint64(lexer.char - '0')
|
||||
|
||||
err = lexer.nextRune()
|
||||
if err != nil { return }
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func (lexer *LexingOperation) tokenizeAlphaBeginning () (err error) {
|
||||
got := ""
|
||||
|
||||
|
127
lexer/numbers.go
Normal file
127
lexer/numbers.go
Normal file
@ -0,0 +1,127 @@
|
||||
package lexer
|
||||
|
||||
import "github.com/sashakoshka/arf/file"
|
||||
|
||||
// tokenizeSymbolBeginning lexes a token that starts with a number.
|
||||
func (lexer *LexingOperation) tokenizeNumberBeginning (negative bool) (err error) {
|
||||
var number uint64
|
||||
|
||||
if lexer.char == '0' {
|
||||
lexer.nextRune()
|
||||
|
||||
if lexer.char == 'x' {
|
||||
lexer.nextRune()
|
||||
number, err = lexer.tokenizeHexidecimalNumber()
|
||||
} else if lexer.char == 'b' {
|
||||
lexer.nextRune()
|
||||
number, err = lexer.tokenizeBinaryNumber()
|
||||
} else if lexer.char == '.' {
|
||||
number, err = lexer.tokenizeDecimalNumber()
|
||||
} else if lexer.char >= '0' && lexer.char <= '9' {
|
||||
number, err = lexer.tokenizeOctalNumber()
|
||||
} else {
|
||||
return file.NewError (
|
||||
lexer.file.Location(), 1,
|
||||
"unexpected character in number literal",
|
||||
file.ErrorKindError)
|
||||
}
|
||||
} else {
|
||||
number, err = lexer.tokenizeDecimalNumber()
|
||||
}
|
||||
|
||||
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 runeToDigit (char rune, radix uint64) (digit uint64, worked bool) {
|
||||
worked = true
|
||||
|
||||
if char >= '0' && char <= '9' {
|
||||
digit = uint64(char - '0')
|
||||
} else if char >= 'A' && char <= 'F' {
|
||||
digit = uint64(char - 'A' + 9)
|
||||
} else if char >= 'a' && char <= 'f' {
|
||||
digit = uint64(char - 'a' + 9)
|
||||
} else {
|
||||
worked = false
|
||||
}
|
||||
|
||||
if digit >= radix {
|
||||
worked = false
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// tokenizeHexidecimalNumber Reads and tokenizes a hexidecimal number.
|
||||
func (lexer *LexingOperation) tokenizeHexidecimalNumber () (number uint64, err error) {
|
||||
for {
|
||||
digit, worked := runeToDigit(lexer.char, 16)
|
||||
if !worked { break }
|
||||
|
||||
number *= 16
|
||||
number += digit
|
||||
|
||||
err = lexer.nextRune()
|
||||
if err != nil { return }
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// tokenizeBinaryNumber Reads and tokenizes a binary number.
|
||||
func (lexer *LexingOperation) tokenizeBinaryNumber () (number uint64, err error) {
|
||||
for {
|
||||
digit, worked := runeToDigit(lexer.char, 2)
|
||||
if !worked { break }
|
||||
|
||||
number *= 2
|
||||
number += digit
|
||||
|
||||
err = lexer.nextRune()
|
||||
if err != nil { return }
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// tokenizeDecimalNumber Reads and tokenizes a decimal number.
|
||||
func (lexer *LexingOperation) tokenizeDecimalNumber () (number uint64, err error) {
|
||||
for {
|
||||
digit, worked := runeToDigit(lexer.char, 10)
|
||||
if !worked { break }
|
||||
|
||||
number *= 10
|
||||
number += digit
|
||||
|
||||
err = lexer.nextRune()
|
||||
if err != nil { return }
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// tokenizeOctalNumber Reads and tokenizes an octal number.
|
||||
func (lexer *LexingOperation) tokenizeOctalNumber () (number uint64, err error) {
|
||||
for {
|
||||
digit, worked := runeToDigit(lexer.char, 8)
|
||||
if !worked { break }
|
||||
|
||||
number *= 8
|
||||
number += digit
|
||||
|
||||
err = lexer.nextRune()
|
||||
if err != nil { return }
|
||||
}
|
||||
return
|
||||
}
|
Reference in New Issue
Block a user