diff options
| author | Mel <einebeere@gmail.com> | 2022-07-12 00:29:56 +0200 |
|---|---|---|
| committer | Mel <einebeere@gmail.com> | 2022-07-12 00:29:56 +0200 |
| commit | e5ae4ea1288a555c4019dad43ee27e960eec46b9 (patch) | |
| tree | b0c92bae8bd7d58be9c5b42dc0b06081f4a1d780 /pkg/lang/compiler/scope/symbol.go | |
| parent | 74dd678dfd1aae9e655fd13cb65278ea9ba307e2 (diff) | |
| download | jinx-e5ae4ea1288a555c4019dad43ee27e960eec46b9.tar.zst jinx-e5ae4ea1288a555c4019dad43ee27e960eec46b9.zip | |
Extract scopes and scope chain from compiler
Diffstat (limited to 'pkg/lang/compiler/scope/symbol.go')
| -rw-r--r-- | pkg/lang/compiler/scope/symbol.go | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/pkg/lang/compiler/scope/symbol.go b/pkg/lang/compiler/scope/symbol.go new file mode 100644 index 0000000..df91899 --- /dev/null +++ b/pkg/lang/compiler/scope/symbol.go @@ -0,0 +1,65 @@ +package scope + +import "jinx/pkg/lang/vm/code" + +type SymbolID struct { + symbolKind SymbolKind + scopeID ScopeID + indexInScope int +} + +func (id SymbolID) SymbolKind() SymbolKind { + return id.symbolKind +} + +type SymbolKind int + +const ( + SymbolKindVariable SymbolKind = iota + SymbolKindFunction +) + +func (s SymbolKind) String() string { + switch s { + case SymbolKindVariable: + return "variable" + case SymbolKindFunction: + return "function" + default: + panic("unknown symbol kind") + } +} + +type Symbol[D SymbolData] struct { + name string + data D +} + +func (s Symbol[D]) Data() D { + return s.data +} + +type SymbolData interface { + SymbolVariable | SymbolFunction +} + +type SymbolVariable struct { + localIndex int +} + +func (sv SymbolVariable) LocalIndex() int { + return sv.localIndex +} + +type SymbolFunction struct { + marker code.Marker + args uint +} + +func (sf SymbolFunction) Marker() code.Marker { + return sf.marker +} + +func (sf SymbolFunction) Args() uint { + return sf.args +} |
