12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- /*
- Lexer only supports single-byte character sets like ASCII.
- @TODO convert to Unicode / UTF-8.
- */
- package lexer
- import (
- "fgm/waiig15/token"
- )
- type Lexer struct {
- input string
- position int // current position in input (points to current char)
- readPosition int // current reading position in input (after current char)
- ch byte // current char under examination
- }
- func New(input string) *Lexer {
- l := &Lexer{input: input}
- l.readChar()
- return l
- }
- // Give us the next character and advance our position in the input string.
- func (l *Lexer) readChar() {
- if l.readPosition >= len(l.input) {
- l.ch = 0
- } else {
- l.ch = l.input[l.readPosition]
- }
- l.position = l.readPosition
- l.readPosition += 1
- }
- func (l *Lexer) NextToken() token.Token {
- var tok token.Token
- switch l.ch {
- case '=':
- tok = newToken(token.ASSIGN, l.ch)
- case ';':
- tok = newToken(token.SEMICOLON, l.ch)
- case '(':
- tok = newToken(token.LPAREN, l.ch)
- case ')':
- tok = newToken(token.RPAREN, l.ch)
- case ',':
- tok = newToken(token.COMMA, l.ch)
- case '+':
- tok = newToken(token.PLUS, l.ch)
- case '{':
- tok = newToken(token.LBRACE, l.ch)
- case '}':
- tok = newToken(token.RBRACE, l.ch)
- case 0:
- tok.Literal = ""
- tok.Type = token.EOF
- }
- l.readChar()
- return tok
- }
- func newToken(tokenType token.TokenType, ch byte) token.Token {
- return token.Token{ Type: tokenType, Literal: string(ch) }
- }
|