diff options
| author | Michael Tews <git@tews.dev> | 2024-06-19 06:07:54 +0200 |
|---|---|---|
| committer | Michael Tews <michael@tews.dev> | 2026-04-12 11:11:02 +0200 |
| commit | 88a76bb57b07cb15e546f787d4a63dad75106c10 (patch) | |
| tree | c669fede2b5e135b275b6667d0e8ec753a672ca1 | |
| parent | ac4b6cd3d5a9ae58134a160671ae0730104ec62d (diff) | |
feat(lexer): added new tokens
added == and !=
| -rw-r--r-- | ast/ast.go | 48 | ||||
| -rw-r--r-- | lexer/repl/repl.go | 31 | ||||
| -rw-r--r-- | main.go | 11 | ||||
| -rw-r--r-- | parser/parser.go | 32 |
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) + } + } +} @@ -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 +} |
