From 88a76bb57b07cb15e546f787d4a63dad75106c10 Mon Sep 17 00:00:00 2001 From: Michael Tews Date: Wed, 19 Jun 2024 06:07:54 +0200 Subject: feat(lexer): added new tokens added == and != --- ast/ast.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ lexer/repl/repl.go | 31 +++++++++++++++++++++++++++++++ main.go | 11 +++++++++++ parser/parser.go | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 122 insertions(+) create mode 100644 ast/ast.go create mode 100644 lexer/repl/repl.go create mode 100644 main.go create mode 100644 parser/parser.go diff --git a/ast/ast.go b/ast/ast.go new file mode 100644 index 0000000..033005f --- /dev/null +++ b/ast/ast.go @@ -0,0 +1,48 @@ +package ast + +import ( + "github.com/mewsen/interpreter/token" +) + +type Node interface { + TokenLiteral() string +} + +type Statement interface { + Node + statementNode() +} + +type Expression interface { + Node + expressionNode() +} + +type Program struct { + Statements []Statement +} + +func (p *Program) TokenLiteral() string { + if len(p.Statements) > 0 { + return p.Statements[0].TokenLiteral() + } else { + return "" + } +} + +type LetStatement struct { + Token token.Token + Name *Identifier + Value Expression +} + +func (ls *LetStatement) statementNode() {} +func (ls *LetStatement) TokenLiteral() string { return ls.Token.Literal } + +type Identifier struct { + Token token.Token + Value string +} + +func (i *Identifier) expressionNode() {} +func (i *Identifier) TokenLiteral() string { return i.Token.Literal } diff --git a/lexer/repl/repl.go b/lexer/repl/repl.go new file mode 100644 index 0000000..ef3d418 --- /dev/null +++ b/lexer/repl/repl.go @@ -0,0 +1,31 @@ +package repl + +import ( + "bufio" + "fmt" + "io" + + "github.com/mewsen/interpreter/lexer" + "github.com/mewsen/interpreter/token" +) + +const PROMPT = ">> " + +func Start(in io.Reader, out io.Writer) { + scanner := bufio.NewScanner(in) + + for { + fmt.Fprintf(out, PROMPT) + scanned := scanner.Scan() + if !scanned { + return + } + + line := scanner.Text() + l := lexer.New(line) + + for tok := l.NextToken(); tok.Type != token.EOF; tok = l.NextToken() { + fmt.Fprintf(out, "%+v\n", tok) + } + } +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..b759ba9 --- /dev/null +++ b/main.go @@ -0,0 +1,11 @@ +package main + +import ( + "os" + + "github.com/mewsen/interpreter/lexer/repl" +) + +func main() { + repl.Start(os.Stdin, os.Stdout) +} diff --git a/parser/parser.go b/parser/parser.go new file mode 100644 index 0000000..5840f0a --- /dev/null +++ b/parser/parser.go @@ -0,0 +1,32 @@ +package parser + +import ( + "github.com/mewsen/interpreter/ast" + "github.com/mewsen/interpreter/lexer" + "github.com/mewsen/interpreter/token" +) + +type Parser struct { + l *lexer.Lexer + + curToken token.Token + peekToken token.Token +} + +func (p *Parser) NextToken() { + p.curToken = p.peekToken + p.peekToken = p.l.NextToken() +} + +func New(l *lexer.Lexer) *Parser { + p := &Parser{l: l} + + p.NextToken() + p.NextToken() + + return p +} + +func (p *Parser) ParseProgram() *ast.Program { + return nil +} -- cgit v1.0