aboutsummaryrefslogtreecommitdiff
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
parentbe281507daf2d1d7f66f32daa42ef78daa48c5dd (diff)
downloadjinx-4f23155ca7f8591cae0be6938610386513d24b7f.tar.zst
jinx-4f23155ca7f8591cae0be6938610386513d24b7f.zip
Put correct token strings in parser errors
-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"
+ }
+}