-
Notifications
You must be signed in to change notification settings - Fork 546
/
stack.go
84 lines (59 loc) · 1.46 KB
/
stack.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
package qlang
import (
"strconv"
"qlang.io/exec"
)
// -----------------------------------------------------------------------------
func (p *Compiler) pushInt(v int) {
p.code.Block(exec.Push(v))
}
func (p *Compiler) pushFloat(v float64) {
p.code.Block(exec.Push(v))
}
func (p *Compiler) pushByte(lit string) {
v, multibyte, tail, err := strconv.UnquoteChar(lit[1:len(lit)-1], '\'')
if err != nil {
panic("invalid char `" + lit + "`: " + err.Error())
}
if tail != "" || multibyte {
panic("invalid char: " + lit)
}
p.code.Block(exec.Push(byte(v)))
}
func (p *Compiler) pushString(lit string) {
v, err := strconv.Unquote(lit)
if err != nil {
panic("invalid string `" + lit + "`: " + err.Error())
}
p.code.Block(exec.Push(v))
}
func (p *Compiler) pushID(name string) {
p.code.Block(exec.Push(name))
}
// -----------------------------------------------------------------------------
func (p *Compiler) popArity() int {
if v, ok := p.gstk.Pop(); ok {
if arity, ok := v.(int); ok {
return arity
}
}
panic("no arity")
}
func (p *Compiler) popName() string {
if v, ok := p.gstk.Pop(); ok {
if name, ok := v.(string); ok {
return name
}
}
panic("no ident name")
}
func (p *Compiler) pushCode(code interface{}) {
p.gstk.Push(code)
}
func (p *Compiler) arity(arity int) {
p.gstk.Push(arity)
}
func (p *Compiler) pushName(name string) {
p.gstk.Push(name)
}
// -----------------------------------------------------------------------------