summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Tews <git@tews.dev>2024-06-19 06:07:54 +0200
committerMichael Tews <michael@tews.dev>2026-04-12 11:11:02 +0200
commit88a76bb57b07cb15e546f787d4a63dad75106c10 (patch)
treec669fede2b5e135b275b6667d0e8ec753a672ca1
parentac4b6cd3d5a9ae58134a160671ae0730104ec62d (diff)
feat(lexer): added new tokens
added == and !=
-rw-r--r--ast/ast.go48
-rw-r--r--lexer/repl/repl.go31
-rw-r--r--main.go11
-rw-r--r--parser/parser.go32
4 files changed, 122 insertions, 0 deletions
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
+}