Initial commit
This commit is contained in:
Executable
+148
@@ -0,0 +1,148 @@
|
||||
|
||||
package token
|
||||
|
||||
import(
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type Token struct {
|
||||
Type
|
||||
Lit []byte
|
||||
Pos
|
||||
}
|
||||
|
||||
type Type int
|
||||
|
||||
const(
|
||||
INVALID Type = iota
|
||||
EOF
|
||||
)
|
||||
|
||||
type Pos struct {
|
||||
Offset int
|
||||
Line int
|
||||
Column int
|
||||
}
|
||||
|
||||
func (this Pos) String() string {
|
||||
return fmt.Sprintf("Pos(offset=%d, line=%d, column=%d)", this.Offset, this.Line, this.Column)
|
||||
}
|
||||
|
||||
type TokenMap struct {
|
||||
typeMap []string
|
||||
idMap map[string]Type
|
||||
}
|
||||
|
||||
func (this TokenMap) Id(tok Type) string {
|
||||
if int(tok) < len(this.typeMap) {
|
||||
return this.typeMap[tok]
|
||||
}
|
||||
return "unknown"
|
||||
}
|
||||
|
||||
func (this TokenMap) Type(tok string) Type {
|
||||
if typ, exist := this.idMap[tok]; exist {
|
||||
return typ
|
||||
}
|
||||
return INVALID
|
||||
}
|
||||
|
||||
func (this TokenMap) TokenString(tok *Token) string {
|
||||
//TODO: refactor to print pos & token string properly
|
||||
return fmt.Sprintf("%s(%d,%s)", this.Id(tok.Type), tok.Type, tok.Lit)
|
||||
}
|
||||
|
||||
func (this TokenMap) StringType(typ Type) string {
|
||||
return fmt.Sprintf("%s(%d)", this.Id(typ), typ)
|
||||
}
|
||||
|
||||
var TokMap = TokenMap{
|
||||
typeMap: []string{
|
||||
"INVALID",
|
||||
"$",
|
||||
"word",
|
||||
"number",
|
||||
"=",
|
||||
"&&",
|
||||
"||",
|
||||
"!",
|
||||
"|",
|
||||
"(",
|
||||
")",
|
||||
"for",
|
||||
"in",
|
||||
"name",
|
||||
"case",
|
||||
"esac",
|
||||
";;",
|
||||
"if",
|
||||
"then",
|
||||
"fi",
|
||||
"elif",
|
||||
"else",
|
||||
"while",
|
||||
"until",
|
||||
"{",
|
||||
"}",
|
||||
"do",
|
||||
"done",
|
||||
"<",
|
||||
"<&",
|
||||
">",
|
||||
">&",
|
||||
">>",
|
||||
"<>",
|
||||
">|",
|
||||
"<<",
|
||||
"<<-",
|
||||
"\n",
|
||||
"nothing",
|
||||
"&",
|
||||
";",
|
||||
},
|
||||
|
||||
idMap: map[string]Type {
|
||||
"INVALID": 0,
|
||||
"$": 1,
|
||||
"word": 2,
|
||||
"number": 3,
|
||||
"=": 4,
|
||||
"&&": 5,
|
||||
"||": 6,
|
||||
"!": 7,
|
||||
"|": 8,
|
||||
"(": 9,
|
||||
")": 10,
|
||||
"for": 11,
|
||||
"in": 12,
|
||||
"name": 13,
|
||||
"case": 14,
|
||||
"esac": 15,
|
||||
";;": 16,
|
||||
"if": 17,
|
||||
"then": 18,
|
||||
"fi": 19,
|
||||
"elif": 20,
|
||||
"else": 21,
|
||||
"while": 22,
|
||||
"until": 23,
|
||||
"{": 24,
|
||||
"}": 25,
|
||||
"do": 26,
|
||||
"done": 27,
|
||||
"<": 28,
|
||||
"<&": 29,
|
||||
">": 30,
|
||||
">&": 31,
|
||||
">>": 32,
|
||||
"<>": 33,
|
||||
">|": 34,
|
||||
"<<": 35,
|
||||
"<<-": 36,
|
||||
"\n": 37,
|
||||
"nothing": 38,
|
||||
"&": 39,
|
||||
";": 40,
|
||||
},
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user