about summary refs log tree commit diff
path: root/pkg/lang/scanner
diff options
context:
space:
mode:
authorMel <einebeere@gmail.com>2022-08-08 23:46:09 +0000
committerMel <einebeere@gmail.com>2022-08-08 23:46:09 +0000
commit7717384414926eaa5821f04a08ee0d198f7b786f (patch)
tree0b667518eba4c8d023d39a70fecf153a795a7f9c /pkg/lang/scanner
parente0161c493867e788ad9db208247f3275e2d057dc (diff)
downloadjinx-7717384414926eaa5821f04a08ee0d198f7b786f.tar.zst
jinx-7717384414926eaa5821f04a08ee0d198f7b786f.zip
Produce (slightly) better parser errors
Diffstat (limited to 'pkg/lang/scanner')
-rw-r--r--pkg/lang/scanner/token/token.go72
1 files changed, 71 insertions, 1 deletions
diff --git a/pkg/lang/scanner/token/token.go b/pkg/lang/scanner/token/token.go
index a39df8a..9fee730 100644
--- a/pkg/lang/scanner/token/token.go
+++ b/pkg/lang/scanner/token/token.go
@@ -1,6 +1,9 @@
 package token
 
-import "jinx/pkg/libs/source"
+import (
+	"fmt"
+	"jinx/pkg/libs/source"
+)
 
 type Token struct {
 	Kind TokenKind
@@ -31,3 +34,70 @@ func (t Token) CanEndStmt() bool {
 		return false
 	}
 }
+
+func (t Token) String() string {
+	switch t.Kind {
+	case EOF, EOL:
+		return t.Kind.String()
+
+	case KwVar,
+		KwFn,
+		KwType,
+		KwIf,
+		KwElif,
+		KwElse,
+		KwFor,
+		KwTry,
+		KwCatch,
+		KwFinally,
+		KwReturn,
+		KwContinue,
+		KwBreak,
+		KwThrow,
+		KwIn,
+		KwNull,
+		KwTrue,
+		KwFalse,
+		KwThis,
+		KwUse,
+		KwFrom,
+		KwBy,
+		KwGlobal:
+		return fmt.Sprintf("keyword '%v'", t.Kind)
+
+	case Ident:
+		return fmt.Sprintf("identifier '%v'", t.Data)
+	case Int:
+		return fmt.Sprintf("integer '%v'", t.Data)
+	case Float:
+		return fmt.Sprintf("float '%v'", t.Data)
+	case String:
+		return fmt.Sprintf("string '%v'", t.Data)
+
+	case Assign,
+		Plus,
+		Minus,
+		Star,
+		Slash,
+		Percent,
+		Bang,
+		Eq,
+		Neq,
+		Lt,
+		Gt,
+		Lte,
+		Gte,
+		LParen,
+		RParen,
+		LBrace,
+		RBrace,
+		LBracket,
+		RBracket,
+		Comma,
+		Dot,
+		SemiColon:
+		return fmt.Sprintf("'%v'", t.Kind)
+	default:
+		return "unknown token"
+	}
+}