From 09a83f74fa7ac00d6f8ed203632a757ba64fe7af Mon Sep 17 00:00:00 2001 From: shylinux Date: Mon, 21 Jun 2021 10:22:21 +0800 Subject: [PATCH] opt yac --- base/lex/matrix.go | 6 ++--- base/yac/matrix.go | 55 ++++++++++++++++++++++++++++++---------------- base/yac/yac.go | 36 ++++++++++++++++-------------- 3 files changed, 58 insertions(+), 39 deletions(-) diff --git a/base/lex/matrix.go b/base/lex/matrix.go index 5f951a61..692d86dc 100644 --- a/base/lex/matrix.go +++ b/base/lex/matrix.go @@ -344,8 +344,8 @@ func init() { }, Commands: map[string]*ice.Command{ MATRIX: {Name: "matrix hash npage text auto", Help: "魔方矩阵", Action: map[string]*ice.Action{ - mdb.CREATE: {Name: "create nlang=32 ncell=256", Help: "创建", Hand: func(m *ice.Message, arg ...string) { - mat := NewMatrix(m, kit.Int(kit.Select("32", m.Option(NLANG))), kit.Int(kit.Select("256", m.Option(NCELL)))) + mdb.CREATE: {Name: "create nlang=32 ncell=128", Help: "创建", Hand: func(m *ice.Message, arg ...string) { + mat := NewMatrix(m, kit.Int(kit.Select("32", m.Option(NLANG))), kit.Int(kit.Select("128", m.Option(NCELL)))) h := m.Rich(m.Prefix(MATRIX), "", kit.Data(kit.MDB_TIME, m.Time(), MATRIX, mat, NLANG, mat.nlang, NCELL, mat.ncell)) switch cb := m.Optionv(kit.Keycb(MATRIX)).(type) { case func(string, *Matrix): @@ -376,7 +376,7 @@ func init() { mat, _ := value[MATRIX].(*Matrix) hash, word, rest := mat.Parse(m, m.Option(NPAGE), []byte(m.Option(kit.MDB_TEXT))) - m.Push(NHASH, mat.word[hash]) + m.Push(NHASH, kit.Select(kit.Format("%d", hash), mat.word[hash])) m.Push("word", string(word)) m.Push("rest", string(rest)) }) diff --git a/base/yac/matrix.go b/base/yac/matrix.go index 234b33bf..f56611c3 100644 --- a/base/yac/matrix.go +++ b/base/yac/matrix.go @@ -45,7 +45,7 @@ func NewMatrix(m *ice.Message, nlang, ncell int) *Matrix { mat.word = map[int]string{} m.Option("matrix.cb", func(key string, lex *lex.Matrix) { mat.lex, mat.lex_key = lex, key }) - key := m.Cmdx("lex.matrix", mdb.CREATE, 32, 256) + key := m.Cmdx("lex.matrix", mdb.CREATE, 32) m.Cmd("lex.matrix", mdb.INSERT, key, "space", "space", "[\t \n]") mat.mat = make([][]*State, nlang) @@ -87,7 +87,7 @@ func (mat *Matrix) isVoid(page int) bool { return false } } - return false + return true } func (mat *Matrix) train(m *ice.Message, page, hash int, word []string, level int) (int, []*Point, []*Point) { m.Debug("%s %s\\%d page: %v hash: %v word: %v", TRAIN, strings.Repeat("#", level), level, page, hash, word) @@ -175,14 +175,11 @@ func (mat *Matrix) train(m *ice.Message, page, hash int, word []string, level in } trans := map[int]int{page: page} -loop: for i := mat.nlang; i < len(mat.mat); i++ { // 去空 m.Debug("what %v %v", len(mat.mat[i]), mat.mat[i]) - for j := 1; j < len(mat.mat[i]); j++ { - if mat.mat[i][j] != nil { - trans[i] = i - continue loop - } + if !mat.isVoid(i) { + trans[i] = i + continue } for j := i + 1; j < len(mat.mat); j++ { @@ -215,7 +212,7 @@ loop: } func (mat *Matrix) Parse(m *ice.Message, rewrite Rewrite, page int, line []byte, level int) (hash int, word []string, rest []byte) { - // m.Debug("%s %s\\%d %s(%d): %s", PARSE, strings.Repeat("#", level), level, mat.name(page), page, string(line)) + m.Debug("%s %s\\%d %s(%d): %s", PARSE, strings.Repeat("#", level), level, mat.name(page), page, string(line)) rest = line h, w, r := 0, []byte{}, []byte{} @@ -225,7 +222,10 @@ func (mat *Matrix) Parse(m *ice.Message, rewrite Rewrite, page int, line []byte, // 解析单词 h, w, r = mat.lex.Parse(m, mat.name(i), r) // 解析状态 - s := mat.mat[i][h] + var s *State + if h < len(mat.mat[i]) { + s = mat.mat[i][h] + } if s != nil { // 全局语法检查 if hh, ww, _ := mat.lex.Parse(m, "key", rest); hh == 0 || len(ww) <= len(w) { @@ -236,7 +236,7 @@ func (mat *Matrix) Parse(m *ice.Message, rewrite Rewrite, page int, line []byte, } if s == nil { // 嵌套语法递归解析 - for j := 0; j < mat.ncell; j++ { + for j := 1; j < len(mat.mat[i]); j++ { if n := mat.mat[i][j]; j < mat.nlang && n != nil { if _, w, r := mat.Parse(m, rewrite, j, rest, level+1); len(r) != len(rest) { s, word, rest = n, append(word, w...), r @@ -245,7 +245,7 @@ func (mat *Matrix) Parse(m *ice.Message, rewrite Rewrite, page int, line []byte, } } } else { - // m.Debug("%s %s|%d GET \033[33m%s\033[0m", PARSE, strings.Repeat("#", level), level, w) + m.Debug("%s %s|%d GET \033[33m%s\033[0m %#v", PARSE, strings.Repeat("#", level), level, w, s) } //语法切换 @@ -262,7 +262,7 @@ func (mat *Matrix) Parse(m *ice.Message, rewrite Rewrite, page int, line []byte, hash, word, rest = rewrite(m, mat.hand[hash], hash, word, rest) } - // m.Debug("%s %s/%d %s(%d): %v %v", PARSE, strings.Repeat("#", level), level, mat.hand[hash], hash, word, rest) + m.Debug("%s %s/%d %s(%d): %v %v", PARSE, strings.Repeat("#", level), level, mat.hand[hash], hash, word, rest) return hash, word, rest } func (mat *Matrix) show(m *ice.Message) { @@ -276,7 +276,7 @@ func (mat *Matrix) show(m *ice.Message) { } for i := 1; i < len(mat.mat); i++ { - if len(mat.mat[i]) == 0 { // 无效行 + if mat.isVoid(i) { // 无效行 continue } @@ -351,7 +351,7 @@ func init() { mat.mat[page] = make([]*State, mat.ncell) } - mat.train(m, page, hash, kit.Split(m.Option(kit.MDB_TEXT)), 1) + mat.train(m, page, hash, kit.Split(m.Option(kit.MDB_TEXT), " ", " ", " "), 1) m.Grow(m.Prefix(MATRIX), kit.Keys(kit.MDB_HASH, key), kit.Dict( kit.MDB_TIME, m.Time(), NPAGE, m.Option(NPAGE), NHASH, m.Option(NHASH), kit.MDB_TEXT, m.Option(kit.MDB_TEXT), )) @@ -363,11 +363,27 @@ func init() { mdb.REMOVE: {Name: "create", Help: "删除", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.DELETE, m.Prefix(MATRIX), "", mdb.HASH, kit.MDB_NAME, m.Option(kit.MDB_NAME)) }}, - "show": {Name: "show", Help: "矩阵", Hand: func(m *ice.Message, arg ...string) { + PARSE: {Name: "parse name npage text=123", Help: "解析", Hand: func(m *ice.Message, arg ...string) { m.Richs(m.Prefix(MATRIX), "", m.Option(kit.MDB_NAME), func(key string, value map[string]interface{}) { value = kit.GetMeta(value) mat, _ := value[MATRIX].(*Matrix) - mat.show(m) + + hash, word, rest := mat.Parse(m, func(m *ice.Message, nhash string, hash int, word []string, rest []byte) (int, []string, []byte) { + m.Debug("\033[32mrun --- %v %v %v\033[0m", nhash, word, rest) + return hash, word, rest + }, mat.index(m, NPAGE, m.Option(NPAGE)), []byte(m.Option(kit.MDB_TEXT)), 1) + + m.Push(kit.MDB_TIME, m.Time()) + m.Push(kit.MDB_HASH, mat.word[hash]) + m.Push("word", kit.Format(word)) + m.Push("rest", string(rest)) + }) + m.ProcessInner() + }}, + "show": {Name: "show", Help: "矩阵", Hand: func(m *ice.Message, arg ...string) { + m.Richs(m.Prefix(MATRIX), "", kit.Select(m.Option(kit.MDB_NAME), arg, 0), func(key string, value map[string]interface{}) { + value = kit.GetMeta(value) + value[MATRIX].(*Matrix).show(m) }) m.ProcessInner() }}, @@ -375,13 +391,14 @@ func init() { if m.Action(mdb.CREATE); len(arg) == 0 { // 矩阵列表 m.Fields(len(arg) == 0, "time,name,npage,nhash") m.Cmdy(mdb.SELECT, m.Prefix(MATRIX), "", mdb.HASH) - m.PushAction("show", mdb.INSERT, mdb.REMOVE) + m.PushAction(mdb.INSERT, "show", mdb.REMOVE) return } - if m.Action(mdb.INSERT); len(arg) == 1 { // 词法列表 + if m.Action(mdb.INSERT, "show"); len(arg) == 1 { // 词法列表 m.Fields(len(arg) == 1, "time,npage,nhash,text") m.Cmdy(mdb.SELECT, m.Prefix(MATRIX), kit.Keys(kit.MDB_HASH, kit.Hashs(arg[0])), mdb.LIST) + m.PushAction(PARSE) return } diff --git a/base/yac/yac.go b/base/yac/yac.go index d5601120..7e2a309c 100644 --- a/base/yac/yac.go +++ b/base/yac/yac.go @@ -5,28 +5,30 @@ import ( kit "github.com/shylinux/toolkits" ) +func _yac_load(m *ice.Message) { + m.Richs(m.Prefix(MATRIX), "", kit.MDB_FOREACH, func(key string, value map[string]interface{}) { + value = kit.GetMeta(value) + + mat := NewMatrix(m, kit.Int(kit.Select("32", value[NLANG])), kit.Int(kit.Select("32", value[NCELL]))) + m.Grows(m.Prefix(MATRIX), kit.Keys(kit.MDB_HASH, key), "", "", func(index int, value map[string]interface{}) { + page := mat.index(m, NPAGE, kit.Format(value[NPAGE])) + hash := mat.index(m, NHASH, kit.Format(value[NHASH])) + if mat.mat[page] == nil { + mat.mat[page] = make([]*State, mat.ncell) + } + + mat.train(m, page, hash, kit.Simple(value[kit.MDB_TEXT]), 1) + }) + value[MATRIX] = mat + }) +} + const YAC = "yac" var Index = &ice.Context{Name: YAC, Help: "语法模块", Commands: map[string]*ice.Command{ ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { - return - m.Load() - m.Richs(m.Prefix(MATRIX), "", kit.MDB_FOREACH, func(key string, value map[string]interface{}) { - value = kit.GetMeta(value) - - mat := NewMatrix(m, kit.Int(kit.Select("32", value[NLANG])), kit.Int(kit.Select("32", value[NCELL]))) - m.Grows(m.Prefix(MATRIX), kit.Keys(kit.MDB_HASH, key), "", "", func(index int, value map[string]interface{}) { - page := mat.index(m, NPAGE, kit.Format(value[NPAGE])) - hash := mat.index(m, NHASH, kit.Format(value[NHASH])) - if mat.mat[page] == nil { - mat.mat[page] = make([]*State, mat.ncell) - } - - mat.train(m, page, hash, kit.Simple(value[kit.MDB_TEXT]), 1) - }) - value[MATRIX] = mat - }) + _yac_load(m.Load()) }}, ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, key string, arg ...string) { m.Save()