diff options
| author | Marc Vertes <mvertes@free.fr> | 2023-11-15 11:59:15 +0100 |
|---|---|---|
| committer | Marc Vertes <mvertes@free.fr> | 2023-11-15 11:59:15 +0100 |
| commit | a4d7fb2da6a8390b818dae8d07391c7d76e365e9 (patch) | |
| tree | 166d1ed4bb07337ead19fd4f7ebc8d79885e2cfd /parser/symbol.go | |
| parent | 2eab5877e1c634db872b595dd2414f4031ae4eb5 (diff) | |
parser: hande const declarations
Only symbols are produced, no bytecode is emitted. The constant
expressions are evaluated at compile time using the stdlib package
go/constant. The parser handles implicit repetition of the last
non-empty expression list. The iota symbol is reset to 0 and
incremented for each line of a const block.
To be done in a next commit: type conversions.
Diffstat (limited to 'parser/symbol.go')
| -rw-r--r-- | parser/symbol.go | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/parser/symbol.go b/parser/symbol.go index d7c05f1..f707feb 100644 --- a/parser/symbol.go +++ b/parser/symbol.go @@ -2,6 +2,7 @@ package parser import ( "fmt" + "go/constant" "reflect" "strings" ) @@ -23,6 +24,7 @@ type symbol struct { kind symKind index int // address of symbol in frame value any + cval constant.Value Type reflect.Type local bool // if true address is relative to local frame, otherwise global used bool @@ -62,7 +64,7 @@ func initUniverse() map[string]*symbol { "string": {kind: symType, index: unsetAddr, Type: reflect.TypeOf((*string)(nil)).Elem()}, "nil": {index: unsetAddr}, - "iota": {index: unsetAddr, value: 0}, + "iota": {kind: symConst, index: unsetAddr}, "true": {index: unsetAddr, value: true, Type: reflect.TypeOf(true)}, "false": {index: unsetAddr, value: false, Type: reflect.TypeOf(false)}, |
