50 lines
1.1 KiB
Go
50 lines
1.1 KiB
Go
package lexpr
|
|
|
|
import (
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
digits = "0123456789"
|
|
alpha = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM"
|
|
chars = "+-*/=<>@&|:!."
|
|
)
|
|
|
|
// scanNumber simplest scanner that accepts decimal int and float.
|
|
func scanNumber(l *lex) bool {
|
|
l.acceptWhile(digits, false)
|
|
if l.atStart() {
|
|
// not found any digit
|
|
return false
|
|
}
|
|
l.accept(".")
|
|
l.acceptWhile(digits, false)
|
|
return !l.atStart()
|
|
}
|
|
|
|
// scanWord returns true if next input token contains alphanum sequence that not starts from digit and not contains.
|
|
// spaces or special characters.
|
|
func scanWord(l *lex) bool {
|
|
if !l.accept(alpha) {
|
|
return false
|
|
}
|
|
l.acceptWhile(alpha+digits, false)
|
|
return true
|
|
}
|
|
|
|
func scanOps(l *lex) bool {
|
|
return l.acceptWhile(chars, false)
|
|
}
|
|
|
|
// scanQuotedString returns true if next input tokens is quoted string. Can be used with any type of quotes.
|
|
func scanQuotedString(l *lex, quote string) bool {
|
|
start := l.pos
|
|
if !strings.ContainsRune(quote, l.next()) {
|
|
l.pos = start
|
|
return false
|
|
}
|
|
if l.acceptWhileNot(quote, true) {
|
|
l.next()
|
|
}
|
|
return !l.atStart()
|
|
}
|