summaryrefslogtreecommitdiff
path: root/parser/symbol.go
diff options
context:
space:
mode:
authorMarc Vertes <mvertes@free.fr>2023-11-15 11:59:15 +0100
committerMarc Vertes <mvertes@free.fr>2023-11-15 11:59:15 +0100
commita4d7fb2da6a8390b818dae8d07391c7d76e365e9 (patch)
tree166d1ed4bb07337ead19fd4f7ebc8d79885e2cfd /parser/symbol.go
parent2eab5877e1c634db872b595dd2414f4031ae4eb5 (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.go4
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)},