lexer test pass

This commit is contained in:
Tyrel Souza 2021-11-30 14:45:39 -05:00
parent 7d8967403d
commit d93f87c889
3 changed files with 94 additions and 32 deletions

2
go.mod
View File

@ -1,3 +1,3 @@
module monkey module gitlab.com/Tyrel/monkey
go 1.17 go 1.17

View File

@ -1 +1,61 @@
package lexer 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)}
}

View File

@ -1,38 +1,40 @@
package lexer package lexer
import ( import (
"testing" "testing"
"monkey/token"
"gitlab.com/Tyrel/monkey/token"
) )
func TestNextToken(t *testing.T) { func TestNextToken(t *testing.T) {
input := `=+(){},;` input := `=+(){},;`
tests := []struct{ tests := []struct {
expectedType token.TokenType expectedType token.TokenType
expectedLiteral string expectedLiteral string
}{ }{
{token.ASSIGN, "="}, {token.ASSIGN, "="},
{token.PLUS, "+"}, {token.PLUS, "+"},
{token.LPAREN, "("}, {token.LPAREN, "("},
{token.RPAREN, ")"}, {token.RPAREN, ")"},
{token.LBRACE, "{"}, {token.LBRACE, "{"},
{token.RBRACE, "}"}, {token.RBRACE, "}"},
{token.COMMA, ","}, {token.COMMA, ","},
{token.SEMICOLON, ";"}, {token.SEMICOLON, ";"},
{token.EOF, ""}, {token.EOF, ""},
} }
l := New(input) l := New(input)
for i, tt := range tests { for i, tt := range tests {
tok := l.NextToken() tok := l.NextToken()
if tok.Type != tt.expectedType { if tok.Type != tt.expectedType {
t.Fatalf("tests[%d] - tokentype wrong. expected=%q, got %q", t.Fatalf("tests[%d] - tokentype wrong. expected=%q, got %q",
i, tt.expectedType, tok.Type) i, tt.expectedType, tok.Type)
} }
if tok.Literal != tt.expectedLiteral { if tok.Literal != tt.expectedLiteral {
t.Fatalf("tests[%d] - literal wrong. expected=%q, got %q", t.Fatalf("tests[%d] - literal wrong. expected=%q, got %q",
i, tt.expectedLiteral, tok.Literal) i, tt.expectedLiteral, tok.Literal)
} }
} }
} }