| @ -0,0 +1,229 @@ | |||||
| package scanner | |||||
| 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 | |||||
| } | |||||