about summary refs log tree commit diff
path: root/pkg
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-07-27 22:20:28 +0000
committerMel <einebeere@gmail.com>2022-07-27 22:50:42 +0000
commit4f23155ca7f8591cae0be6938610386513d24b7f (patch)
tree7a18b5297dc7d2a9304c802a429abf0869080a79 /pkg
parentbe281507daf2d1d7f66f32daa42ef78daa48c5dd (diff)
downloadjinx-4f23155ca7f8591cae0be6938610386513d24b7f.tar.zst
jinx-4f23155ca7f8591cae0be6938610386513d24b7f.zip
Put correct token strings in parser errors
Diffstat (limited to 'pkg')
-rw-r--r--pkg/lang/ast/stmt.go4
-rw-r--r--pkg/lang/compiler/compiler.go4
-rw-r--r--pkg/lang/parser/exprs.go4
-rw-r--r--pkg/lang/parser/parser.go2
-rw-r--r--pkg/lang/parser/stmts.go8
-rw-r--r--pkg/lang/scanner/scanner.go4
-rw-r--r--pkg/lang/scanner/token/kind.go122
7 files changed, 134 insertions, 14 deletions
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"
+	}
+}