Skip to content

Commit

Permalink
lexer delimiters completed and tested
Browse files Browse the repository at this point in the history
  • Loading branch information
54L1M committed Jan 24, 2024
1 parent a032577 commit 773b873
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 0 deletions.
60 changes: 60 additions & 0 deletions lexer/lexer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package lexer

import "github.com/54L1m/mil-lang/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.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)}
}
41 changes: 41 additions & 0 deletions lexer/lexer_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package lexer

import (
"testing"

"github.com/54L1m/mil-lang/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, ""},
}

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)
}
}

}

0 comments on commit 773b873

Please sign in to comment.