package parser
import (
)
type Parser struct {
b []byte
i int
}
func ( []byte) *Parser {
return &Parser{
b: ,
}
}
func ( string) *Parser {
return New(internal.StringToBytes())
}
func ( *Parser) () bool {
return .i < len(.b)
}
func ( *Parser) () []byte {
return .b[.i:]
}
func ( *Parser) () byte {
if .Valid() {
:= .b[.i]
.Advance()
return
}
return 0
}
func ( *Parser) () byte {
if .Valid() {
return .b[.i]
}
return 0
}
func ( *Parser) () {
.i++
}
func ( *Parser) ( byte) bool {
if .Peek() == {
.Advance()
return true
}
return false
}
func ( *Parser) ( []byte) bool {
if len() > len(.b[.i:]) {
return false
}
if !bytes.Equal(.b[.i:.i+len()], ) {
return false
}
.i += len()
return true
}
func ( *Parser) ( byte) ([]byte, bool) {
:= bytes.IndexByte(.b[.i:], )
if == -1 {
:= .b[.i:]
.i = len(.b)
return , false
}
:= .b[.i : .i+]
.i += + 1
return , true
}
func ( *Parser) () (string, bool) {
if .i < len(.b) && .b[.i] == '(' {
:= .i + 1
if := bytes.IndexByte(.b[:], ')'); != -1 {
:= .b[ : +]
.i = + + 1
return internal.BytesToString(), false
}
}
:= len(.b) - .i
var bool
for , := range .b[.i:] {
if isNum() {
continue
}
if isAlpha() || ( > 0 && && == '_') {
= true
continue
}
=
break
}
if == 0 {
return "", false
}
:= .b[.i : .i+]
.i +=
return internal.BytesToString(), !
}
func ( *Parser) () int {
:= len(.b) - .i
for , := range .b[.i:] {
if !isNum() {
=
break
}
}
if == 0 {
return 0
}
, := strconv.Atoi(string(.b[.i : .i+]))
if != nil {
panic()
}
.i +=
return
}
func ( byte) bool {
return >= '0' && <= '9'
}
func ( byte) bool {
return ( >= 'a' && <= 'z') || ( >= 'A' && <= 'Z')
}