/
const.go
102 lines (90 loc) · 2.4 KB
/
const.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// Copyright 2018 Alexey Krivonogov. All rights reserved.
// Use of this source code is governed by a MIT license
// that can be found in the LICENSE file.
package compiler
import (
"github.com/gentee/gentee/core"
)
func coConst(cmpl *compiler) error {
token := getToken(cmpl.unit.Lexeme, cmpl.pos)
if !isCapital(token) {
return cmpl.Error(ErrConstName)
}
cmpl.curConst = token
return nil
}
func coConstEnum(cmpl *compiler) error {
coExpStart(cmpl)
cmd := core.CmdBlock{ID: core.StackBlock, CmdCommon: core.CmdCommon{TokenID: uint32(cmpl.pos)}}
cmpl.owners = append(cmpl.owners, &cmd)
cmpl.curIota = 0
cmpl.expConst = nil
return nil
}
func coConstEnumBack(cmpl *compiler) error {
if cmpl.expConst == nil {
owner := cmpl.curOwner()
cmpl.expConst = owner.Children[0]
cmpl.owners = cmpl.owners[:len(cmpl.owners)-1]
cmpl.dynamic = &cmState{tkToken, cmConstListStart, nil, nil, 0}
} else { // const finishes
cmpl.curIota = core.NotIota
}
return nil
}
func coConstExp(cmpl *compiler) error {
coExpStart(cmpl)
cmd := core.CmdBlock{ID: core.StackBlock, CmdCommon: core.CmdCommon{TokenID: uint32(cmpl.pos)}}
cmpl.owners = append(cmpl.owners, &cmd)
return nil
}
func coConstExpBack(cmpl *compiler) error {
owner := cmpl.curOwner()
constObj := &core.ConstObject{
Object: core.Object{
Name: cmpl.curConst,
Unit: cmpl.unit,
Pub: cmpl.unit.Pub != 0,
},
Redefined: false,
Exp: owner.Children[0],
Return: owner.Children[0].GetResult(),
Iota: core.NotIota,
}
if cmpl.unit.FindConst(cmpl.curConst) != nil {
return cmpl.ErrorPos(cmpl.pos-1, ErrConstDef, cmpl.curConst)
}
constObj.ObjID = int32(cmpl.appendObj(constObj))
cmpl.unit.AddConst(cmpl.curConst)
cmpl.owners = cmpl.owners[:len(cmpl.owners)-1]
return nil
}
func coConstBack(cmpl *compiler) error {
if cmpl.unit.Pub == core.PubOne {
cmpl.unit.Pub = 0
}
return nil
}
func coConstList(cmpl *compiler) error {
if err := coConst(cmpl); err != nil {
return err
}
constObj := &core.ConstObject{
Object: core.Object{
Name: cmpl.curConst,
Unit: cmpl.unit,
Pub: cmpl.unit.Pub != 0,
},
Redefined: false,
Exp: cmpl.expConst,
Return: cmpl.expConst.GetResult(),
Iota: cmpl.curIota,
}
cmpl.curIota++
constObj.ObjID = int32(cmpl.appendObj(constObj))
if cmpl.unit.FindConst(cmpl.curConst) != nil {
return cmpl.Error(ErrConstDef, cmpl.curConst)
}
cmpl.unit.AddConst(cmpl.curConst)
return nil
}