github.com/NeowayLabs/nash@v0.2.2-0.20200127205349-a227041ffd50/token/token.go (about)

     1  package token
     2  
     3  import "strconv"
     4  
     5  type (
     6  	Token int
     7  
     8  	FileInfo struct {
     9  		line, column int
    10  	}
    11  )
    12  
    13  const (
    14  	Illegal Token = iota + 1 // error ocurred
    15  	EOF
    16  	Comment
    17  
    18  	literal_beg
    19  
    20  	Ident
    21  	String // "<string>"
    22  	Number // [0-9]+
    23  	Arg
    24  
    25  	literal_end
    26  
    27  	operator_beg
    28  
    29  	Assign    // =
    30  	AssignCmd // <=
    31  	Equal     // ==
    32  	NotEqual  // !=
    33  	Plus      // +
    34  	Minus     // -
    35  	Gt        // >
    36  	Lt        // <
    37  
    38  	Colon     // ,
    39  	Semicolon // ;
    40  
    41  	operator_end
    42  
    43  	LBrace // {
    44  	RBrace // }
    45  	LParen // (
    46  	RParen // )
    47  	LBrack // [
    48  	RBrack // ]
    49  	Pipe
    50  
    51  	Comma
    52  	Dotdotdot
    53  
    54  	Variable
    55  
    56  	keyword_beg
    57  
    58  	Import
    59  	SetEnv
    60  	ShowEnv
    61  	BindFn // "bindfn <fn> <cmd>
    62  	Dump   // "dump" [ file ]
    63  	Return
    64  	If
    65  	Else
    66  	For
    67  	Rfork
    68  	Fn
    69  	Var
    70  
    71  	keyword_end
    72  )
    73  
    74  var tokens = [...]string{
    75  	Illegal: "ILLEGAL",
    76  	EOF:     "EOF",
    77  	Comment: "COMMENT",
    78  
    79  	Ident:  "IDENT",
    80  	String: "STRING",
    81  	Number: "NUMBER",
    82  	Arg:    "ARG",
    83  
    84  	Assign:    "=",
    85  	AssignCmd: "<=",
    86  	Equal:     "==",
    87  	NotEqual:  "!=",
    88  	Plus:      "+",
    89  	Minus:     "-",
    90  	Gt:        ">",
    91  	Lt:        "<",
    92  
    93  	Colon:     ",",
    94  	Semicolon: ";",
    95  
    96  	LBrace: "{",
    97  	RBrace: "}",
    98  	LParen: "(",
    99  	RParen: ")",
   100  	LBrack: "[",
   101  	RBrack: "]",
   102  	Pipe:   "|",
   103  
   104  	Comma:     ",",
   105  	Dotdotdot: "...",
   106  
   107  	Variable: "VARIABLE",
   108  
   109  	Import:  "import",
   110  	SetEnv:  "setenv",
   111  	ShowEnv: "showenv",
   112  	BindFn:  "bindfn",
   113  	Dump:    "dump",
   114  	Return:  "return",
   115  	If:      "if",
   116  	Else:    "else",
   117  	For:     "for",
   118  	Rfork:   "rfork",
   119  	Fn:      "fn",
   120  	Var:     "var",
   121  }
   122  
   123  var keywords map[string]Token
   124  
   125  func init() {
   126  	keywords = make(map[string]Token)
   127  	for i := keyword_beg + 1; i < keyword_end; i++ {
   128  		keywords[tokens[i]] = i
   129  	}
   130  }
   131  
   132  func Lookup(ident string) Token {
   133  	if tok, isKeyword := keywords[ident]; isKeyword {
   134  		return tok
   135  	}
   136  
   137  	return Ident
   138  }
   139  
   140  func IsKeyword(t Token) bool {
   141  	if t > keyword_beg && t < keyword_end {
   142  		return true
   143  	}
   144  
   145  	return false
   146  }
   147  
   148  func NewFileInfo(l, c int) FileInfo { return FileInfo{l, c} }
   149  func (info FileInfo) Line() int     { return info.line }
   150  func (info FileInfo) Column() int   { return info.column }
   151  
   152  func (tok Token) String() string {
   153  	s := ""
   154  
   155  	if 0 < tok && tok < Token(len(tokens)) {
   156  		s = tokens[tok]
   157  	}
   158  	if s == "" {
   159  		s = "token(" + strconv.Itoa(int(tok)) + ")"
   160  	}
   161  	return s
   162  }