From 4f23155ca7f8591cae0be6938610386513d24b7f Mon Sep 17 00:00:00 2001 From: Mel Date: Wed, 27 Jul 2022 22:20:28 +0000 Subject: Put correct token strings in parser errors --- pkg/lang/ast/stmt.go | 4 +- pkg/lang/compiler/compiler.go | 4 +- pkg/lang/parser/exprs.go | 4 +- pkg/lang/parser/parser.go | 2 +- pkg/lang/parser/stmts.go | 8 +-- pkg/lang/scanner/scanner.go | 4 +- pkg/lang/scanner/token/kind.go | 122 ++++++++++++++++++++++++++++++++++++++++- 7 files changed, 134 insertions(+), 14 deletions(-) (limited to 'pkg') diff --git a/pkg/lang/ast/stmt.go b/pkg/lang/ast/stmt.go index 65b2532..8a538f2 100644 --- a/pkg/lang/ast/stmt.go +++ b/pkg/lang/ast/stmt.go @@ -8,7 +8,7 @@ const ( StmtKindEmpty StmtKind = iota StmtKindUse StmtKindFnDecl - StmtKindObjectDecl + StmtKindTypeDecl StmtKindVarDecl StmtKindIf StmtKindForCond @@ -41,7 +41,7 @@ type StmtFnDecl struct { Body BlockNode } -type StmtObjectDecl struct{} +type StmtTypeDecl struct {} type StmtVarDecl struct { Name IdentNode diff --git a/pkg/lang/compiler/compiler.go b/pkg/lang/compiler/compiler.go index 9dbfd12..9c4bda4 100644 --- a/pkg/lang/compiler/compiler.go +++ b/pkg/lang/compiler/compiler.go @@ -51,8 +51,8 @@ func (comp *Compiler) compileStmt(t *code.Builder, stmt ast.Stmt) error { case ast.StmtKindFnDecl: fnDeclStmt := stmt.Value.(ast.StmtFnDecl) err = comp.compileFnDeclStmt(t, fnDeclStmt) - case ast.StmtKindObjectDecl: - panic("object declaration statements not implemented") + case ast.StmtKindTypeDecl: + panic("type declaration statements not implemented") case ast.StmtKindVarDecl: decl := stmt.Value.(ast.StmtVarDecl) err = comp.compileVarDeclStmt(t, decl) diff --git a/pkg/lang/parser/exprs.go b/pkg/lang/parser/exprs.go index 56904a1..d0725f6 100644 --- a/pkg/lang/parser/exprs.go +++ b/pkg/lang/parser/exprs.go @@ -176,7 +176,7 @@ func (p *Parser) parseUnitExpr() (ast.Expr, error) { case token.KwTrue, token.KwFalse, token.KwNull, token.KwThis: return p.parseValueLitExpr() default: - panic(fmt.Errorf("unexpected token %+v, wanted unit expression start", p.peek())) + panic(fmt.Errorf("unexpected token '%v', wanted unit expression start", p.peek())) } } @@ -371,6 +371,6 @@ func (p *Parser) parseValueLitExpr() (ast.Expr, error) { Value: ast.ExprThis{}, }, nil default: - panic(fmt.Errorf("unexpected token %+v, wanted value literal", tok)) + panic(fmt.Errorf("unexpected token '%v', wanted value literal", tok)) } } diff --git a/pkg/lang/parser/parser.go b/pkg/lang/parser/parser.go index 1a9d1d0..0ff4b09 100644 --- a/pkg/lang/parser/parser.go +++ b/pkg/lang/parser/parser.go @@ -88,7 +88,7 @@ func (p *Parser) next() token.Token { func (p *Parser) expect(kind token.TokenKind) (token.Token, error) { tok := p.next() if tok.Kind != kind { - return token.Token{}, fmt.Errorf("expected %v, got %v", kind, tok.Kind) + return token.Token{}, fmt.Errorf("expected '%v', got '%v'", kind, tok.Kind) } return tok, nil diff --git a/pkg/lang/parser/stmts.go b/pkg/lang/parser/stmts.go index 713b1aa..7d10e61 100644 --- a/pkg/lang/parser/stmts.go +++ b/pkg/lang/parser/stmts.go @@ -12,8 +12,8 @@ func (p *Parser) parseStmt() (ast.Stmt, error) { return p.parseUseStmt() case token.KwFn: return p.parseFnDeclStmt() - case token.KwObject: - return p.parseObjectDeclStmt() + case token.KwType: + return p.parseTypeDeclStmt() case token.KwVar: return p.parseVarDeclStmt() case token.KwIf: @@ -110,7 +110,7 @@ func (p *Parser) parseFnParams() ([]ast.IdentNode, error) { return params, nil } -func (p *Parser) parseObjectDeclStmt() (ast.Stmt, error) { +func (p *Parser) parseTypeDeclStmt() (ast.Stmt, error) { panic("not implemented") } @@ -438,7 +438,7 @@ func (p *Parser) parseEmptyStmt() (ast.Stmt, error) { func (p *Parser) parseStmtEnd() error { tok := p.peek() if !tok.CanEndStmt() { - panic(fmt.Errorf("wanted statement end, received: %+v", tok)) + panic(fmt.Errorf("wanted statement end, received: '%v'", tok)) } p.next() return nil diff --git a/pkg/lang/scanner/scanner.go b/pkg/lang/scanner/scanner.go index b01e22f..ca307db 100644 --- a/pkg/lang/scanner/scanner.go +++ b/pkg/lang/scanner/scanner.go @@ -212,8 +212,8 @@ func (s *Scanner) scanIdentifierOrKeyword() (token.Token, error) { kind = token.KwVar case "fn": kind = token.KwFn - case "object": - kind = token.KwObject + case "type": + kind = token.KwType case "if": kind = token.KwIf diff --git a/pkg/lang/scanner/token/kind.go b/pkg/lang/scanner/token/kind.go index e24ce2f..bedbada 100644 --- a/pkg/lang/scanner/token/kind.go +++ b/pkg/lang/scanner/token/kind.go @@ -9,7 +9,7 @@ const ( // Keywords KwVar KwFn - KwObject + KwType KwIf KwElif @@ -69,3 +69,123 @@ const ( Dot SemiColon ) + +func (tk TokenKind) String() string { + switch tk { + case EOF: + return "EOF" + case EOL: + return "EOL" + + case KwVar: + return "var" + case KwFn: + return "fn" + case KwType: + return "type" + + case KwIf: + return "if" + case KwElif: + return "elif" + case KwElse: + return "else" + case KwFor: + return "for" + case KwTry: + return "try" + case KwCatch: + return "catch" + case KwFinally: + return "finally" + + case KwReturn: + return "return" + case KwContinue: + return "continue" + case KwBreak: + return "break" + case KwThrow: + return "throw" + + case KwIn: + return "in" + + case KwNull: + return "null" + case KwTrue: + return "true" + case KwFalse: + return "false" + + case KwThis: + return "this" + + case KwUse: + return "use" + case KwFrom: + return "from" + case KwBy: + return "by" + + case Ident: + return "ident" + case Int: + return "int" + case Float: + return "float" + case String: + return "string" + + case Assign: + return "=" + case Plus: + return "+" + case Minus: + return "-" + case Star: + return "*" + case Slash: + return "/" + case Percent: + return "%" + case Bang: + return "!" + + case Eq: + return "==" + case Neq: + return "!=" + case Lt: + return "<" + case Gt: + return ">" + case Lte: + return "<=" + case Gte: + return ">=" + + case LParen: + return "(" + case RParen: + return ")" + case LBrace: + return "{" + case RBrace: + return "}" + case LBracket: + return "[" + case RBracket: + return "]" + + case Comma: + return "," + case Dot: + return "." + case SemiColon: + return ";" + + default: + return "unknown" + } +} -- cgit 1.4.1