package parser
|
|
|
|
import "github.com/brettlangdon/gython/token"
|
|
|
|
func IsLetter(r rune) bool {
|
|
return (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z')
|
|
}
|
|
|
|
func IsDigit(r rune) bool {
|
|
return r >= '0' && r <= '9'
|
|
}
|
|
|
|
func IsXDigit(r rune) bool {
|
|
return IsDigit(r) || (r >= 65 && r <= 70) || (r >= 97 && r <= 102)
|
|
}
|
|
|
|
func IsAlphaNumeric(r rune) bool {
|
|
return IsLetter(r) || IsDigit(r)
|
|
}
|
|
|
|
func IsIdentifierStart(r rune) bool {
|
|
return IsLetter(r) || r == '_' || r >= 128
|
|
}
|
|
|
|
func IsIdentifierChar(r rune) bool {
|
|
return IsIdentifierStart(r) || IsDigit(r)
|
|
}
|
|
|
|
func IsQuote(r rune) bool {
|
|
return r == '"' || r == '\''
|
|
}
|
|
|
|
func GetTwoCharTokenID(curChar rune, nextChar rune) token.TokenID {
|
|
switch curChar {
|
|
case '=':
|
|
switch nextChar {
|
|
case '=':
|
|
return token.EQEQUAL
|
|
}
|
|
break
|
|
case '!':
|
|
switch nextChar {
|
|
case '=':
|
|
return token.NOTEQUAL
|
|
}
|
|
break
|
|
case '<':
|
|
switch nextChar {
|
|
case '>':
|
|
return token.NOTEQUAL
|
|
case '=':
|
|
return token.LESSEQUAL
|
|
case '<':
|
|
return token.LEFTSHIFT
|
|
}
|
|
break
|
|
case '>':
|
|
switch nextChar {
|
|
case '=':
|
|
return token.GREATEREQUAL
|
|
case '>':
|
|
return token.RIGHTSHIFT
|
|
}
|
|
break
|
|
case '+':
|
|
switch nextChar {
|
|
case '=':
|
|
return token.PLUSEQUAL
|
|
}
|
|
break
|
|
case '-':
|
|
switch nextChar {
|
|
case '=':
|
|
return token.MINEQUAL
|
|
case '>':
|
|
return token.RARROW
|
|
}
|
|
break
|
|
case '*':
|
|
switch nextChar {
|
|
case '*':
|
|
return token.DOUBLESTAR
|
|
case '=':
|
|
return token.STAREQUAL
|
|
}
|
|
break
|
|
case '/':
|
|
switch nextChar {
|
|
case '/':
|
|
return token.DOUBLESLASH
|
|
case '=':
|
|
return token.SLASHEQUAL
|
|
}
|
|
break
|
|
case '|':
|
|
switch nextChar {
|
|
case '=':
|
|
return token.VBAREQUAL
|
|
}
|
|
break
|
|
case '%':
|
|
switch nextChar {
|
|
case '=':
|
|
return token.PERCENTEQUAL
|
|
}
|
|
break
|
|
case '&':
|
|
switch nextChar {
|
|
case '=':
|
|
return token.AMPEREQUAL
|
|
}
|
|
break
|
|
case '^':
|
|
switch nextChar {
|
|
case '=':
|
|
return token.CIRCUMFLEXEQUAL
|
|
}
|
|
break
|
|
}
|
|
return token.OP
|
|
}
|
|
|
|
func GetThreeCharTokenID(curChar rune, nextChar rune, thirdChar rune) token.TokenID {
|
|
switch curChar {
|
|
case '<':
|
|
switch nextChar {
|
|
case '<':
|
|
switch thirdChar {
|
|
case '=':
|
|
return token.LEFTSHIFTEQUAL
|
|
}
|
|
break
|
|
}
|
|
break
|
|
case '>':
|
|
switch nextChar {
|
|
case '>':
|
|
switch thirdChar {
|
|
case '=':
|
|
return token.RIGHTSHIFTEQUAL
|
|
}
|
|
break
|
|
}
|
|
break
|
|
case '*':
|
|
switch nextChar {
|
|
case '*':
|
|
switch thirdChar {
|
|
case '=':
|
|
return token.DOUBLESTAREQUAL
|
|
}
|
|
break
|
|
}
|
|
break
|
|
case '/':
|
|
switch nextChar {
|
|
case '/':
|
|
switch thirdChar {
|
|
case '=':
|
|
return token.DOUBLESLASHEQUAL
|
|
}
|
|
break
|
|
}
|
|
break
|
|
case '.':
|
|
switch nextChar {
|
|
case '.':
|
|
switch thirdChar {
|
|
case '.':
|
|
return token.ELLIPSIS
|
|
}
|
|
break
|
|
}
|
|
break
|
|
}
|
|
return token.OP
|
|
}
|
|
|
|
func GetOneCharTokenID(curChar rune) token.TokenID {
|
|
switch curChar {
|
|
case '(':
|
|
return token.LPAR
|
|
case ')':
|
|
return token.RPAR
|
|
case '[':
|
|
return token.LSQB
|
|
case ']':
|
|
return token.RSQB
|
|
case ':':
|
|
return token.COLON
|
|
case ',':
|
|
return token.COMMA
|
|
case ';':
|
|
return token.SEMI
|
|
case '+':
|
|
return token.PLUS
|
|
case '-':
|
|
return token.MINUS
|
|
case '*':
|
|
return token.STAR
|
|
case '/':
|
|
return token.SLASH
|
|
case '|':
|
|
return token.VBAR
|
|
case '&':
|
|
return token.AMPER
|
|
case '<':
|
|
return token.LESS
|
|
case '>':
|
|
return token.GREATER
|
|
case '=':
|
|
return token.EQUAL
|
|
case '.':
|
|
return token.DOT
|
|
case '%':
|
|
return token.PERCENT
|
|
case '{':
|
|
return token.LBRACE
|
|
case '}':
|
|
return token.RBRACE
|
|
case '^':
|
|
return token.CIRCUMFLEX
|
|
case '~':
|
|
return token.TILDE
|
|
case '@':
|
|
return token.AT
|
|
}
|
|
return token.OP
|
|
}
|