1
0
mirror of https://shylinux.com/x/ContextOS synced 2025-06-27 02:17:31 +08:00
This commit is contained in:
shaoying 2019-07-26 02:06:01 +08:00
parent 081dfe0795
commit b6050a5816
7 changed files with 89 additions and 79 deletions

View File

@ -38,8 +38,9 @@ syn match shyCommand "\(^\|\t\| \|$(\)[a-zA-Z0-9_\.]\+\>"
call Keys("Operator", ["new"]) call Keys("Operator", ["new"])
call Keys("Statment", ["config", "cache"]) call Keys("Statment", ["config", "cache"])
call Keys("Statment", ["return", "source"]) call Keys("Statment", ["return", "source"])
call Keys("Statment", ["if", "else", "else if", "for", "fun", "end"])
call Keys("Statment", ["let", "var"]) call Keys("Statment", ["let", "var"])
call Keys("Statment", ["if", "else", "else if", "for", "fun", "end"])
call Keys("Statment", ["label", "goto"])
" context nfs " context nfs
call Keys("SubCommand", ["import", "export", "load", "save"]) call Keys("SubCommand", ["import", "export", "load", "save"])

View File

@ -4,5 +4,5 @@ var version = struct {
host string host string
self int self int
}{ }{
"2019-07-24 17:59:29", "ZYB-20190522USI", 242, "2019-07-26 01:59:19", "ZYB-20190522USI", 257,
} }

View File

@ -405,7 +405,7 @@ func (m *Message) Free(cbs ...func(msg *Message) (done bool)) *Message {
return m return m
} }
func (m *Message) Goshy(input []string, index int, stack *kit.Stack) *kit.Stack { func (m *Message) Goshy(input []string, index int, stack *kit.Stack, cb func(*Message)) bool {
if stack == nil { if stack == nil {
stack = &kit.Stack{} stack = &kit.Stack{}
stack.Push("source", true, 0) stack.Push("source", true, 0)
@ -419,6 +419,14 @@ func (m *Message) Goshy(input []string, index int, stack *kit.Stack) *kit.Stack
// 执行语句 // 执行语句
msg := m.Cmd("yac.parse", line+"\n") msg := m.Cmd("yac.parse", line+"\n")
if cb != nil {
cb(msg)
}
// 切换模块
if v := msg.Optionv("bio.ctx"); v != nil {
m.Optionv("bio.ctx", v)
}
// 跳转语句 // 跳转语句
if msg.Appends("bio.pos0") { if msg.Appends("bio.pos0") {
@ -430,8 +438,8 @@ func (m *Message) Goshy(input []string, index int, stack *kit.Stack) *kit.Stack
if msg.Appends("bio.end") { if msg.Appends("bio.end") {
m.Copy(msg, "append").Copy(msg, "result") m.Copy(msg, "append").Copy(msg, "result")
msg.Appends("bio.end", "") msg.Appends("bio.end", "")
break return true
} }
} }
return stack return false
} }

View File

@ -675,6 +675,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心", Server: &CTX{},
cs = append(cs, msg.target) cs = append(cs, msg.target)
return false return false
}) })
msg = m.Spawn()
for _, v := range cs { for _, v := range cs {
if msg.target = v; v == nil { if msg.target = v; v == nil {

View File

@ -326,7 +326,8 @@ func (nfs *NFS) Start(m *ctx.Message, arg ...string) bool {
stack := &kit.Stack{} stack := &kit.Stack{}
stack.Push(m.Option("stack.key", "source"), m.Options("stack.run", true), m.Optioni("stack.pos", 0)) stack.Push(m.Option("stack.key", "source"), m.Options("stack.run", true), m.Optioni("stack.pos", 0))
m.Optionv("bio.ctx", m.Target()) m.Optionv("bio.ctx", m.Target())
m.Optionv("bio.stack", stack)
input := make([]string, 0, 128)
line, bio := "", bufio.NewScanner(nfs) line, bio := "", bufio.NewScanner(nfs)
for nfs.prompt(); ; nfs.prompt() { for nfs.prompt(); ; nfs.prompt() {
@ -348,35 +349,13 @@ func (nfs *NFS) Start(m *ctx.Message, arg ...string) bool {
m.Log("debug", "%s %d %d [%s]", "input", m.Capi("ninput", 1), len(line), line) m.Log("debug", "%s %d %d [%s]", "input", m.Capi("ninput", 1), len(line), line)
m.Confv("input", -2, map[string]interface{}{"time": time.Now().Unix(), "line": line}) m.Confv("input", -2, map[string]interface{}{"time": time.Now().Unix(), "line": line})
// 解析数据 if input = append(input, line); m.Goshy(input, len(input)-1, stack, func(msg *ctx.Message) {
for i := m.Capi("ninput") - 1; i < m.Capi("ninput"); i++ { if m.Confs("term", "use") {
line = m.Conf("input", []interface{}{i, "line"}) nfs.print(m.Conf("prompt"), line)
m.Optionv("input", m.Confv("input")) }
m.Optioni("stack.pos", i)
// 执行语句
msg := m.Cmd("yac.parse", line+"\n")
nfs.print(m.Conf("prompt"), line)
nfs.print(msg.Meta["result"]...) nfs.print(msg.Meta["result"]...)
}) {
// 切换模块 break
if v := msg.Optionv("bio.ctx"); v != nil {
m.Optionv("bio.ctx", v)
}
// 跳转语句
if msg.Appends("bio.pos0") {
i = int(msg.Appendi("bio.pos0")) - 1
msg.Append("bio.pos0", "")
}
// 结束脚本
if msg.Appends("bio.end") {
m.Copy(msg, "append")
m.Copy(msg, "result")
msg.Appends("bio.end", "")
return true
}
} }
line = "" line = ""
} }

View File

@ -334,6 +334,9 @@ var Index = &ctx.Context{Name: "yac", Help: "语法中心",
map[string]interface{}{"page": "stm", "hash": "fun", "word": []interface{}{"fun", "key", "rep{", "key", "}"}}, map[string]interface{}{"page": "stm", "hash": "fun", "word": []interface{}{"fun", "key", "rep{", "key", "}"}},
map[string]interface{}{"page": "stm", "hash": "else", "word": []interface{}{"else", "opt{", "if", "exp", "}"}}, map[string]interface{}{"page": "stm", "hash": "else", "word": []interface{}{"else", "opt{", "if", "exp", "}"}},
map[string]interface{}{"page": "stm", "hash": "end", "word": []interface{}{"end"}}, map[string]interface{}{"page": "stm", "hash": "end", "word": []interface{}{"end"}},
map[string]interface{}{"page": "stm", "hash": "label", "word": []interface{}{"label", "key"}},
map[string]interface{}{"page": "stm", "hash": "goto", "word": []interface{}{"goto", "key"}},
/* /*
map[string]interface{}{"page": "op1", "hash": "op1", "word": []interface{}{"mul{", "-z", "-n", "}"}}, map[string]interface{}{"page": "op1", "hash": "op1", "word": []interface{}{"mul{", "-z", "-n", "}"}},
@ -350,8 +353,6 @@ var Index = &ctx.Context{Name: "yac", Help: "语法中心",
map[string]interface{}{"page": "stm", "hash": "for", "word": []interface{}{"for", "opt{", "exp", ";", "}", "exp"}}, map[string]interface{}{"page": "stm", "hash": "for", "word": []interface{}{"for", "opt{", "exp", ";", "}", "exp"}},
map[string]interface{}{"page": "stm", "hash": "for", "word": []interface{}{"for", "index", "exp", "opt{", "exp", "}", "exp"}}, map[string]interface{}{"page": "stm", "hash": "for", "word": []interface{}{"for", "index", "exp", "opt{", "exp", "}", "exp"}},
map[string]interface{}{"page": "stm", "hash": "label", "word": []interface{}{"label", "exp"}},
map[string]interface{}{"page": "stm", "hash": "goto", "word": []interface{}{"goto", "exp", "opt{", "exp", "}", "exp"}},
*/ */
@ -543,6 +544,12 @@ var Index = &ctx.Context{Name: "yac", Help: "语法中心",
msg := m.Spawn(m.Optionv("bio.ctx")) msg := m.Spawn(m.Optionv("bio.ctx"))
switch arg[0] { switch arg[0] {
case "$": case "$":
if stack, ok := m.Optionv("bio.stack").(*kit.Stack); ok {
if v, ok := stack.Hash(arg[1]); ok {
m.Echo("%v", v)
break
}
}
m.Echo(msg.Cap(arg[1])) m.Echo(msg.Cap(arg[1]))
case "@": case "@":
value := msg.Option(arg[1]) value := msg.Option(arg[1])
@ -933,33 +940,25 @@ var Index = &ctx.Context{Name: "yac", Help: "语法中心",
}}, }},
"var": &ctx.Command{Name: "var a [= exp]", Help: "定义变量, a: 变量名, exp: 表达式", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { "var": &ctx.Command{Name: "var a [= exp]", Help: "定义变量, a: 变量名, exp: 表达式", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
if m.Cap(arg[1], arg[1], "", "临时变量"); len(arg) > 1 { if stack, ok := m.Optionv("bio.stack").(*kit.Stack); ok {
switch arg[2] { m.Log("stack", "%v = %v", arg[1], arg[3])
case "=": stack.Peek().Hash[arg[1]] = arg[3]
m.Cap(arg[1], arg[3])
case "<-":
m.Cap(arg[1], m.Cap("last_msg"))
}
} }
m.Echo(m.Cap(arg[1]))
return return
}}, }},
"let": &ctx.Command{Name: "let a = exp", Help: "设置变量, a: 变量名, exp: 表达式", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { "let": &ctx.Command{Name: "let a = exp", Help: "设置变量, a: 变量名, exp: 表达式", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
switch arg[2] { if stack, ok := m.Optionv("bio.stack").(*kit.Stack); ok {
case "=": m.Log("stack", "%v = %v", arg[1], arg[3])
m.Cap(arg[1], arg[3]) stack.Hash(arg[1], arg[3])
m.Log("stack", "let %v = %v", arg[1], arg[3])
case "<-":
m.Cap(arg[1], m.Cap("last_msg"))
} }
m.Echo(m.Cap(arg[1]))
return return
}}, }},
"if": &ctx.Command{Name: "if exp", Help: "条件语句, exp: 表达式", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { "if": &ctx.Command{Name: "if exp", Help: "条件语句, exp: 表达式", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
stack := m.Optionv("bio.stack").(*kit.Stack) stack := m.Optionv("bio.stack").(*kit.Stack)
p := stack.Push(arg[0], stack.Peek().Run && kit.Right(arg[1]), m.Optioni("stack.pos")) o := stack.Peek()
p := stack.Push(arg[0], o.Run && kit.Right(arg[1]), m.Optioni("stack.pos"))
m.Log("stack", "push %v", p.String("\\")) m.Log("stack", "push %v", p.String("\\"))
if p.Run { if !o.Run || p.Run {
p.Done = true p.Done = true
} }
return return
@ -1034,8 +1033,7 @@ var Index = &ctx.Context{Name: "yac", Help: "语法中心",
self := &ctx.Command{Name: strings.Join(arg[1:], " "), Help: []string{"pwd", "ls"}} self := &ctx.Command{Name: strings.Join(arg[1:], " "), Help: []string{"pwd", "ls"}}
self.Hand = func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { self.Hand = func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
m.Goshy(self.Help.([]string), 0, nil, nil)
m.Goshy(self.Help.([]string), 0, nil)
return return
} }
m.Target().Commands[arg[1]] = self m.Target().Commands[arg[1]] = self
@ -1045,7 +1043,7 @@ var Index = &ctx.Context{Name: "yac", Help: "语法中心",
"else": &ctx.Command{Name: "else", Help: "条件语句", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { "else": &ctx.Command{Name: "else", Help: "条件语句", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
p := m.Optionv("bio.stack").(*kit.Stack).Peek() p := m.Optionv("bio.stack").(*kit.Stack).Peek()
p.Run = !p.Done && !p.Run && (len(arg) == 1 || kit.Right(arg[2])) p.Run = !p.Done && !p.Run && (len(arg) == 1 || kit.Right(arg[2]))
m.Log("stack", "set: run = %v", p.Run) m.Log("stack", "set: %v", p.String("|"))
if p.Run { if p.Run {
p.Done = true p.Done = true
} }
@ -1063,10 +1061,9 @@ var Index = &ctx.Context{Name: "yac", Help: "语法中心",
end := m.Optioni("stack.pos") end := m.Optioni("stack.pos")
self := p.Data.(*ctx.Command) self := p.Data.(*ctx.Command)
help := []string{} help := []string{}
for i, v := range m.Optionv("input").([]interface{}) { for i, v := range m.Optionv("bio.input").([]string) {
if p.Pos < i && i < end { if p.Pos < i && i < end {
val := v.(map[string]interface{}) help = append(help, v)
help = append(help, val["line"].(string))
} }
} }
self.Help = help self.Help = help
@ -1076,22 +1073,19 @@ var Index = &ctx.Context{Name: "yac", Help: "语法中心",
}}, }},
"label": &ctx.Command{Name: "label name", Help: "记录当前脚本的位置, name: 位置名", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { "label": &ctx.Command{Name: "label name", Help: "记录当前脚本的位置, name: 位置名", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
if cli, ok := m.Target().Server.(*YAC); m.Assert(ok) { p := m.Optionv("bio.stack").(*kit.Stack).Peek()
if cli.label == nil { if p.Label == nil {
cli.label = map[string]string{} p.Label = map[string]int{}
}
cli.label[arg[1]] = m.Option("file_pos")
} }
m.Log("stack", "%v <= %v", arg[1], m.Optioni("stack.pos")+1)
p.Label[arg[1]] = m.Optioni("stack.pos") + 1
return return
}}, }},
"goto": &ctx.Command{Name: "goto label [exp] condition", Help: "向上跳转到指定位置, label: 跳转位置, condition: 跳转条件", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) { "goto": &ctx.Command{Name: "goto label [exp] condition", Help: "向上跳转到指定位置, label: 跳转位置, condition: 跳转条件", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) (e error) {
if cli, ok := m.Target().Server.(*YAC); m.Assert(ok) { stack := m.Optionv("bio.stack").(*kit.Stack)
if pos, ok := cli.label[arg[1]]; ok { if i, ok := stack.Label(arg[1]); ok {
if !kit.Right(arg[len(arg)-1]) { m.Log("stack", "%v => %v", arg[1], i)
return m.Append("bio.pos0", i)
}
m.Append("file_pos0", pos)
}
} }
return return
}}, }},

View File

@ -6,13 +6,15 @@ import (
) )
type Frame struct { type Frame struct {
Key string Key string
Run bool Run bool
Pos int Pos int
deep int
// list []string deep int
Done bool Done bool
Data interface{} Data interface{}
Hash map[string]interface{}
Label map[string]int
} }
func (f *Frame) String(meta string) string { func (f *Frame) String(meta string) string {
@ -27,7 +29,7 @@ type Stack struct {
} }
func (s *Stack) Push(key string, run bool, pos int) *Frame { func (s *Stack) Push(key string, run bool, pos int) *Frame {
s.fs = append(s.fs, &Frame{Key: key, Run: run, Pos: pos, deep: len(s.fs)}) s.fs = append(s.fs, &Frame{Key: key, Run: run, Pos: pos, deep: len(s.fs), Hash: map[string]interface{}{}})
return s.fs[len(s.fs)-1] return s.fs[len(s.fs)-1]
} }
func (s *Stack) Peek() *Frame { func (s *Stack) Peek() *Frame {
@ -44,3 +46,28 @@ func (s *Stack) Pop() *Frame {
s.fs = s.fs[:len(s.fs)-1] s.fs = s.fs[:len(s.fs)-1]
return f return f
} }
func (s *Stack) Hash(key string, val ...interface{}) (interface{}, bool) {
for i := len(s.fs) - 1; i >= 0; i-- {
if v, ok := s.fs[i].Hash[key]; ok {
if len(val) > 0 {
s.fs[i].Hash[key] = val[0]
}
return v, ok
}
}
if len(val) > 0 {
s.fs[len(s.fs)-1].Hash[key] = val[0]
return val[0], true
}
return nil, false
}
func (s *Stack) Label(key string) (int, bool) {
for i := len(s.fs) - 1; i >= 0; i-- {
if v, ok := s.fs[i].Label[key]; ok {
s.fs = s.fs[:i+1]
return v, ok
}
}
return -1, false
}