forked from x/ContextOS
opt yac.lex
This commit is contained in:
parent
2efd17d4c7
commit
c5dc2927c7
0
bin/user.sh
Normal file → Executable file
0
bin/user.sh
Normal file → Executable file
0
bin/zone.sh
Normal file → Executable file
0
bin/zone.sh
Normal file → Executable file
@ -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,
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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}
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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 "目录" "" "" \
|
||||
|
Loading…
x
Reference in New Issue
Block a user