From c5dc2927c78d28f39bf6a52eabe592df8a5449ab Mon Sep 17 00:00:00 2001 From: shaoying Date: Mon, 5 Aug 2019 09:09:24 +0800 Subject: [PATCH] opt yac.lex --- bin/user.sh | 0 bin/zone.sh | 0 src/contexts/cli/version.go | 2 +- src/contexts/ctx/core.go | 21 +++++++++++++----- src/contexts/ctx/ctx.go | 41 +++++++++++++++++++++++++++++++++--- src/contexts/lex/lex.go | 4 ++++ src/contexts/ssh/ssh.go | 2 +- src/contexts/yac/yac.go | 28 ++++++++++++------------ src/plugin/context/index.shy | 2 +- 9 files changed, 76 insertions(+), 24 deletions(-) mode change 100644 => 100755 bin/user.sh mode change 100644 => 100755 bin/zone.sh diff --git a/bin/user.sh b/bin/user.sh old mode 100644 new mode 100755 diff --git a/bin/zone.sh b/bin/zone.sh old mode 100644 new mode 100755 diff --git a/src/contexts/cli/version.go b/src/contexts/cli/version.go index 07e4e6c7..20401e01 100644 --- a/src/contexts/cli/version.go +++ b/src/contexts/cli/version.go @@ -4,5 +4,5 @@ var version = struct { host string self int }{ - "2019-08-02 22:20:17", "ZYB-20190522USI", 367, + "2019-08-02 23:49:50", "com.mac", 370, } diff --git a/src/contexts/ctx/core.go b/src/contexts/ctx/core.go index 34071639..ca32a975 100644 --- a/src/contexts/ctx/core.go +++ b/src/contexts/ctx/core.go @@ -244,20 +244,22 @@ func (m *Message) Gos(msg *Message, hand ...func(msg *Message)) *Message { func (m *Message) Spawn(arg ...interface{}) *Message { temp := false c := m.target - if len(arg) > 0 { - switch v := arg[0].(type) { + for i := 0; i < len(arg); i++ { + switch v := arg[i].(type) { case *Context: c = v case *Message: c = v.target case string: temp = kit.Right(v) + case bool: + temp = v } } msg := &Message{ time: time.Now(), - code: m.Capi("nmessage", 1), + code: -1, source: m.target, target: c, message: m, @@ -268,6 +270,7 @@ func (m *Message) Spawn(arg ...interface{}) *Message { return msg } + msg.code = m.Capi("nmessage", 1) m.messages = append(m.messages, msg) return msg } @@ -317,10 +320,18 @@ func (m *Message) Sess(key string, arg ...interface{}) *Message { } } + temp := false + if len(arg) > 0 { + switch v := arg[0].(type) { + case bool: + temp, arg = v, arg[1:] + } + } + for msg := m; msg != nil; msg = msg.message { if x, ok := msg.Sessions[key]; ok { if spawn { - x = m.Spawn(x.target) + x = m.Spawn(x.target, temp) x.callback = func(sub *Message) *Message { return sub } } return x @@ -530,7 +541,7 @@ func (m *Message) Goshy(input []string, index int, stack *kit.Stack, cb func(*Me m.Optioni("stack.pos", i) // 执行语句 - msg := m.Sess("yac").Cmd("parse", line+"\n") + msg := m.Sess("yac", true, true).Cmd("parse", line+"\n") if cb != nil { cb(msg) } diff --git a/src/contexts/ctx/ctx.go b/src/contexts/ctx/ctx.go index 47f0c6bb..d20ca820 100644 --- a/src/contexts/ctx/ctx.go +++ b/src/contexts/ctx/ctx.go @@ -743,9 +743,28 @@ var Index = &Context{Name: "ctx", Help: "模块中心", Server: &CTX{}, } m.Optionv("bio.msg", msg) + m.Log("fuck", "what %v", arg) if len(arg) == 0 { - // m.Format("summary", msg, "deep") - // msg.CopyTo(m) + ms := []*Message{msg.message, msg} + for i := 0; i < len(ms); i++ { + if ms[i] == nil { + continue + } + if m.Push("code", ms[i].code); ms[i].message != nil { + m.Push("message", ms[i].message.code) + } else { + m.Push("message", 0) + } + + m.Push("time", ms[i].Time()) + m.Push("source", ms[i].source.Name) + m.Push("target", ms[i].target.Name) + m.Push("detail", kit.Format(ms[i].Meta["detail"])) + if i > 0 { + ms = append(ms, ms[i].messages...) + } + } + m.Table() return } @@ -786,6 +805,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心", Server: &CTX{}, }}, "copy": &Command{Name: "copy", Help: "查看或添加选项", Hand: func(m *Message, c *Context, key string, arg ...string) (e error) { msg := m.Optionv("bio.msg").(*Message) + // 去年尾参 for i := len(arg) - 1; i >= 0; i-- { if arg[i] == "" { arg = arg[:i] @@ -793,7 +813,22 @@ var Index = &Context{Name: "ctx", Help: "模块中心", Server: &CTX{}, break } } - msg.Cmdy(arg) + // 默认参数 + args := make([]string, 0, len(arg)) + for i, j := 0, 1; i < len(arg); i++ { + if strings.HasPrefix(arg[i], "__") { + if j < len(msg.Meta["detail"]) { + args = append(args, msg.Meta["detail"][j:]...) + } + j = len(msg.Meta["detail"]) + } else if strings.HasPrefix(arg[i], "_") { + args = append(args, kit.Select(arg[i][1:], msg.Detail(j))) + j++ + } else { + args = append(args, arg[i]) + } + } + msg.Cmdy(args) return }}, "table": &Command{Name: "table", Help: "查看或添加选项", Hand: func(m *Message, c *Context, key string, arg ...string) (e error) { diff --git a/src/contexts/lex/lex.go b/src/contexts/lex/lex.go index 8320799e..6e22237b 100644 --- a/src/contexts/lex/lex.go +++ b/src/contexts/lex/lex.go @@ -275,6 +275,10 @@ func (lex *LEX) parse(m *ctx.Message, page int, line []byte) (hash int, rest []b m.Log("debug", "%s %s hash: %v word: %v rest: %v", "parse", "lex", hash, word, rest) return } +func (lex *LEX) Parse(m *ctx.Message, line []byte, page string) (hash int, rest []byte, word []byte) { + hash, rest, word = lex.parse(m, lex.index(m, "npage", page), line) + return hash, rest, word +} func (lex *LEX) Spawn(m *ctx.Message, c *ctx.Context, arg ...string) ctx.Server { return &LEX{Context: c} diff --git a/src/contexts/ssh/ssh.go b/src/contexts/ssh/ssh.go index cacb1c2e..41d35888 100644 --- a/src/contexts/ssh/ssh.go +++ b/src/contexts/ssh/ssh.go @@ -347,7 +347,7 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心", m.Push("help", value["componet_help"]) m.Push("view", value["componet_view"]) if kit.Right(value["componet_init"]) { - script := m.Cmdx("nfs.load", path.Join(m.Conf("cli.publish", "path"), arg[0], kit.Format(value["componet_init"])), -1) + script := m.Cmdx("nfs.load", path.Join(m.Conf("cli.project", "plugin.path"), arg[0], kit.Format(value["componet_init"])), -1) if script == "" { script = m.Cmdx("nfs.load", path.Join("usr/librarys/plugin", kit.Format(value["componet_init"])), -1) } diff --git a/src/contexts/yac/yac.go b/src/contexts/yac/yac.go index 2b66a6f0..ef9e4d69 100644 --- a/src/contexts/yac/yac.go +++ b/src/contexts/yac/yac.go @@ -41,6 +41,9 @@ type YAC struct { label map[string]string *ctx.Context } +type Parser interface { + Parse(m *ctx.Message, line []byte, page string) (hash int, rest []byte, word []byte) +} func (yac *YAC) name(page int) string { if name, ok := yac.word[page]; ok { @@ -193,30 +196,29 @@ func (yac *YAC) train(m *ctx.Message, page, hash int, word []string, level int) m.Log("debug", "%s %s/%d word: %d point: %d end: %d", "train", strings.Repeat("#", level), level, len(word), len(points), len(ends)) return len(word), points, ends } -func (yac *YAC) parse(m *ctx.Message, msg *ctx.Message, stack *kit.Stack, page int, void int, line string, level int) (string, []string, int) { - m.Log("debug", "%s %s\\%d %s(%d): %s", "parse", strings.Repeat("#", level), level, yac.name(page), page, line) +func (yac *YAC) parse(m *ctx.Message, msg *ctx.Message, stack *kit.Stack, page int, void int, line []byte, level int) (rest []byte, word []string, hash int) { + m.Log("debug", "%s %s\\%d %s(%d): %s", "parse", strings.Repeat("#", level), level, yac.name(page), page, string(line)) + + h, r, w := 0, []byte{}, []byte{} + p, _ := yac.lex.Target().Server.(Parser) - lex, hash, word := yac.lex, 0, []string{} for star, s := 0, page; s != 0 && len(line) > 0; { //解析空白 - if lex = yac.lex.Spawn().Cmd("parse", line, yac.name(void)); lex.Result(0) == "-1" { + if h, r, _ = p.Parse(m, line, yac.name(void)); h == -1 { break } - line = lex.Result(1) - //解析单词 - if lex = yac.lex.Spawn().Cmd("parse", line, yac.name(s)); lex.Result(0) == "-1" { + if h, r, w = p.Parse(m, r, yac.name(s)); h == -1 { break } - result := append([]string{}, lex.Meta["result"]...) //解析状态 - state := yac.mat[s][byte(kit.Int(result[0]))] + state := yac.mat[s][byte(h)] //全局语法检查 if state != nil { - if key := yac.lex.Spawn().Cmd("parse", line, "key"); key.Result(0) == "0" || len(key.Result(2)) <= len(result[2]) { - line, word = result[1], append(word, result[2]) + if hh, _, ww := p.Parse(m, line, "key"); hh == 0 || len(ww) <= len(w) { + line, word = r, append(word, string(w)) } else { state = nil } @@ -225,7 +227,7 @@ func (yac *YAC) parse(m *ctx.Message, msg *ctx.Message, stack *kit.Stack, page i if state == nil { for i := 0; i < m.Confi("meta", "ncell"); i++ { if x := yac.mat[s][byte(i)]; i < m.Confi("meta", "nlang") && x != nil { - if l, w, _ := yac.parse(m, msg, stack, i, void, line, level+1); l != line { + if l, w, _ := yac.parse(m, msg, stack, i, void, line, level+1); len(l) != len(line) { line, word, state = l, append(word, w...), x break } @@ -443,7 +445,7 @@ var Index = &ctx.Context{Name: "yac", Help: "语法中心", m.Optioni("yac.page", yac.page[m.Conf("nline")]) m.Optioni("yac.void", yac.page[m.Conf("nvoid")]) - _, word, _ := yac.parse(m, m, stack, m.Optioni("yac.page"), m.Optioni("yac.void"), arg[0], 1) + _, word, _ := yac.parse(m, m, stack, m.Optioni("yac.page"), m.Optioni("yac.void"), []byte(arg[0]), 1) m.Result(word) } return diff --git a/src/plugin/context/index.shy b/src/plugin/context/index.shy index 0d3ea8e2..4105fd95 100644 --- a/src/plugin/context/index.shy +++ b/src/plugin/context/index.shy @@ -71,7 +71,7 @@ fun cmd "命令" "" "" \ text "pwd" \ button "执行" - copy ssh._route $1 context $2 command $3 + copy ssh._route _ context _ command __ end fun dir "目录" "" "" \