From d93f87c8893e23bcbb07ae356e85937ef72d4d9d Mon Sep 17 00:00:00 2001 From: Tyrel Souza <923113+tyrelsouza@users.noreply.github.com> Date: Tue, 30 Nov 2021 14:45:39 -0500 Subject: [PATCH] lexer test pass --- go.mod | 2 +- lexer/lexer.go | 60 ++++++++++++++++++++++++++++++++++++++++++ lexer/lexer_test.go | 64 +++++++++++++++++++++++---------------------- 3 files changed, 94 insertions(+), 32 deletions(-) diff --git a/go.mod b/go.mod index 1187b62..308c044 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ -module monkey +module gitlab.com/Tyrel/monkey go 1.17 diff --git a/lexer/lexer.go b/lexer/lexer.go index 9beaa38..441f7ed 100644 --- a/lexer/lexer.go +++ b/lexer/lexer.go @@ -1 +1,61 @@ package lexer + +import ( + "gitlab.com/Tyrel/monkey/token" +) + +type Lexer struct { + input string + position int + readPosition int + ch byte +} + +func New(input string) *Lexer { + l := &Lexer{input: input} + l.readChar() + return l +} + +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.PLUS, l.ch) + case '(': + tok = newToken(token.LPAREN, l.ch) + case ')': + tok = newToken(token.RPAREN, l.ch) + case '{': + tok = newToken(token.LBRACE, l.ch) + case '}': + tok = newToken(token.RBRACE, l.ch) + case ',': + tok = newToken(token.COMMA, l.ch) + case ';': + tok = newToken(token.SEMICOLON, 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)} +} diff --git a/lexer/lexer_test.go b/lexer/lexer_test.go index cf1b91d..12717b6 100644 --- a/lexer/lexer_test.go +++ b/lexer/lexer_test.go @@ -1,38 +1,40 @@ package lexer + import ( - "testing" - "monkey/token" + "testing" + + "gitlab.com/Tyrel/monkey/token" ) -func TestNextToken(t *testing.T) { - input := `=+(){},;` - - tests := []struct{ - expectedType token.TokenType - expectedLiteral string - }{ - {token.ASSIGN, "="}, - {token.PLUS, "+"}, - {token.LPAREN, "("}, - {token.RPAREN, ")"}, - {token.LBRACE, "{"}, - {token.RBRACE, "}"}, - {token.COMMA, ","}, - {token.SEMICOLON, ";"}, - {token.EOF, ""}, - } +func TestNextToken(t *testing.T) { + input := `=+(){},;` - l := New(input) - for i, tt := range tests { - tok := l.NextToken() + tests := []struct { + expectedType token.TokenType + expectedLiteral string + }{ + {token.ASSIGN, "="}, + {token.PLUS, "+"}, + {token.LPAREN, "("}, + {token.RPAREN, ")"}, + {token.LBRACE, "{"}, + {token.RBRACE, "}"}, + {token.COMMA, ","}, + {token.SEMICOLON, ";"}, + {token.EOF, ""}, + } - if tok.Type != tt.expectedType { - t.Fatalf("tests[%d] - tokentype wrong. expected=%q, got %q", - i, tt.expectedType, tok.Type) - } - if tok.Literal != tt.expectedLiteral { - t.Fatalf("tests[%d] - literal wrong. expected=%q, got %q", - i, tt.expectedLiteral, tok.Literal) - } - } + l := New(input) + for i, tt := range tests { + tok := l.NextToken() + + if tok.Type != tt.expectedType { + t.Fatalf("tests[%d] - tokentype wrong. expected=%q, got %q", + i, tt.expectedType, tok.Type) + } + if tok.Literal != tt.expectedLiteral { + t.Fatalf("tests[%d] - literal wrong. expected=%q, got %q", + i, tt.expectedLiteral, tok.Literal) + } + } }