summaryrefslogtreecommitdiff
path: root/lang/token.go
diff options
context:
space:
mode:
authorMarc Vertes <marc.vertes@tendermint.com>2023-10-12 10:51:58 +0200
committerGitHub <noreply@github.com>2023-10-12 10:51:58 +0200
commit37b9da32d3b911091deb254f6cba2a137c471287 (patch)
treeb4451de0fa0473a937a77d39fd1f8a4f87c8f60d /lang/token.go
parenta21b9b12ad865a19ff687645082f9093c4101039 (diff)
move to a direct byte code compiler (#8)
* chore: refactor to keep only the new parser and bytecode vm * scanner: remove Token.value field * scanner: remove scanner.kind field * chore: move language specification in lang package This avoid a cyclic dependency in scanner_test which can now use the golang/GoSpec language specification for Go. * clean code * scanner: export scanner fields Also parser now generate function calls, including externals. * chore: fix lint issues * parser: handle strings * wip * parser: implement support for 'if, else, else if' statements Resolving labels in the compiler still in progress. * parser: support if statements, improve compiler * improve handling of functions * improve support of local variables * scanner: trim leading and trailing spaces * fixes to make fibonacci work * parser: improve README, fix function parameters parsing
Diffstat (limited to 'lang/token.go')
-rw-r--r--lang/token.go110
1 files changed, 110 insertions, 0 deletions
diff --git a/lang/token.go b/lang/token.go
new file mode 100644
index 0000000..3a980a4
--- /dev/null
+++ b/lang/token.go
@@ -0,0 +1,110 @@
+package lang
+
+type TokenId int
+
+const (
+ Illegal = iota
+ Comment
+ Ident
+ Int
+ Float
+ Imag
+ Char
+ String
+
+ // Operators
+ Add
+ Sub
+ Mul
+ Quo
+ Rem
+ And
+ Or
+ Xor
+ Shl // <<
+ Shr // >>
+ AndNot //
+
+ AddAssign
+ SubAssign
+ MulAssign
+ QuoAssign
+ RemAssign
+ AndAssign
+ OrAssign
+ XorAssign
+ ShlAssign
+ ShrAssign
+ AndNotAssign
+
+ Land
+ Lor
+ Arrow
+ Inc
+ Dec
+ Equal
+ Less
+ Greater
+ Assign
+ Not
+ Plus // unitary +
+ Minus // unitary -
+ Address // unitary &
+ Deref // unitary *
+ NotEqual
+ LessEqual
+ GreaterEqual
+ Define
+ Ellipsis
+ Period
+ Tilde
+
+ // Separators
+ Comma
+ Semicolon
+ Colon
+
+ // Block tokens
+ ParenBlock // (..)
+ BracketBlock // [..]
+ BraceBlock // {..}
+
+ // Reserved keywords
+ Break
+ Case
+ Chan
+ Const
+ Continue
+ Default
+ Defer
+ Else
+ Fallthrough
+ For
+ Func
+ Go
+ Goto
+ If
+ Import
+ Interface
+ Map
+ Package
+ Range
+ Return
+ Select
+ Struct
+ Switch
+ Type
+ Var
+
+ // Internal tokens (no corresponding keyword)
+ Call
+ CallX
+ Label
+ JumpFalse
+ Enter // entering in function context
+ Exit // exiting from function context
+)
+
+func (t TokenId) IsKeyword() bool { return t >= Break && t <= Var }
+func (t TokenId) IsOperator() bool { return t >= Add && t <= Tilde }
+func (t TokenId) IsBlock() bool { return t >= ParenBlock && t <= BraceBlock }