/
engine.go
47 lines (40 loc) · 1021 Bytes
/
engine.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
package ash
type contextDo struct {
parent *contextDo
named map[string]interface{}
last interface{}
}
type engineDo struct {
context *contextDo
parser func([]*tokenDo) *clauseDo
lexer func(string) ([]*tokenDo, int)
}
func newEngine() *engineDo {
do := new(engineDo)
do.context = new(contextDo)
do.context.parent = nil
do.context.named = make(map[string]interface{})
do.parser = buildParser()
do.lexer = buildLexer()
return do
}
func (do *engineDo) get(name string) interface{} {
return do.context.named[name]
}
func (do *engineDo) set(name string, value interface{}) {
do.context.named[name] = value
}
func (do *engineDo) executeString(code string) interface{} {
return do.executeCode(newFile("", code, true))
}
func (do *engineDo) executeCode(cdo *fileDo) interface{} {
clauses, err := parse(0, cdo.lines, do.lexer, do.parser)
if err != nil {
panic(err)
}
do.context.last = nil
for _, clause := range clauses {
do.context.last = clause.exec(do.context)
}
return do.context.last
}