mirror of
https://shylinux.com/x/ContextOS
synced 2025-04-26 01:04:06 +08:00
mac pro lex
This commit is contained in:
parent
8345bca7c7
commit
0b446010cf
@ -140,6 +140,7 @@ func (cli *CLI) Start(m *ctx.Message, arg ...string) bool { // {{{
|
|||||||
}
|
}
|
||||||
|
|
||||||
m.Options("scan_end", false)
|
m.Options("scan_end", false)
|
||||||
|
m.Optionv("ps_target", cli.target)
|
||||||
m.Option("prompt", m.Conf("prompt"))
|
m.Option("prompt", m.Conf("prompt"))
|
||||||
m.Cap("stream", m.Spawn(yac.Target()).Call(func(cmd *ctx.Message) *ctx.Message {
|
m.Cap("stream", m.Spawn(yac.Target()).Call(func(cmd *ctx.Message) *ctx.Message {
|
||||||
if !m.Caps("parse") {
|
if !m.Caps("parse") {
|
||||||
@ -160,6 +161,7 @@ func (cli *CLI) Start(m *ctx.Message, arg ...string) bool { // {{{
|
|||||||
m.Options("scan_end", true)
|
m.Options("scan_end", true)
|
||||||
m.Target().Close(m.Spawn())
|
m.Target().Close(m.Spawn())
|
||||||
}
|
}
|
||||||
|
m.Optionv("ps_target", cli.target)
|
||||||
return nil
|
return nil
|
||||||
}, "parse", arg[1]).Target().Name)
|
}, "parse", arg[1]).Target().Name)
|
||||||
|
|
||||||
@ -235,6 +237,10 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
|
|||||||
}},
|
}},
|
||||||
"target": &ctx.Command{Name: "target module", Help: "设置当前模块, module: 模块全名", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
"target": &ctx.Command{Name: "target module", Help: "设置当前模块, module: 模块全名", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
if cli, ok := m.Target().Server.(*CLI); m.Assert(ok) { // {{{
|
if cli, ok := m.Target().Server.(*CLI); m.Assert(ok) { // {{{
|
||||||
|
if len(arg) == 0 {
|
||||||
|
m.Echo("%s", m.Cap("ps_target"))
|
||||||
|
return
|
||||||
|
}
|
||||||
if msg := m.Find(arg[0]); msg != nil {
|
if msg := m.Find(arg[0]); msg != nil {
|
||||||
cli.target = msg.Target()
|
cli.target = msg.Target()
|
||||||
m.Cap("ps_target", cli.target.Name)
|
m.Cap("ps_target", cli.target.Name)
|
||||||
@ -726,10 +732,6 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
|
|||||||
}
|
}
|
||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"demo": &ctx.Command{Name: "demo word", Help: "", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
|
||||||
m.Append("hi", "hello", "world")
|
|
||||||
m.Echo("nice")
|
|
||||||
}},
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -225,50 +225,7 @@ func (lex *LEX) train(page int, hash int, seed []byte) int { // {{{
|
|||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
func (lex *LEX) parse(page int, line []byte) (hash int, rest []byte, word []byte) { // {{{
|
func (lex *LEX) parse(m *ctx.Message, page int, line []byte) (hash int, rest []byte, word []byte) { // {{{
|
||||||
|
|
||||||
pos := 0
|
|
||||||
for star, s := 0, page; s != 0 && pos < len(line); pos++ {
|
|
||||||
|
|
||||||
c := line[pos]
|
|
||||||
if c == '\\' && pos < len(line)-1 { //跳过转义
|
|
||||||
pos++
|
|
||||||
c = lex.charset(line[pos])[0]
|
|
||||||
}
|
|
||||||
if c > 127 { //跳过中文
|
|
||||||
word = append(word, c)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
state := lex.mat[s][c]
|
|
||||||
lex.Log("debug", nil, "(%d,%d): %v", s, c, state)
|
|
||||||
if state == nil {
|
|
||||||
s, star, pos = star, 0, pos-1
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
word = append(word, c)
|
|
||||||
|
|
||||||
if state.star {
|
|
||||||
star = s
|
|
||||||
} else if x, ok := lex.mat[star][c]; !ok || !x.star {
|
|
||||||
star = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
if s, hash = state.next, state.hash; s == 0 {
|
|
||||||
s, star = star, 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if hash == 0 {
|
|
||||||
pos, word = 0, word[:0]
|
|
||||||
}
|
|
||||||
rest = line[pos:]
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// }}}
|
|
||||||
func (lex *LEX) scan(m *ctx.Message, page int, line []byte) (hash int, rest []byte, word []byte) { // {{{
|
|
||||||
|
|
||||||
pos := 0
|
pos := 0
|
||||||
for star, s := 0, page; s != 0 && pos < len(line); pos++ {
|
for star, s := 0, page; s != 0 && pos < len(line); pos++ {
|
||||||
@ -378,7 +335,6 @@ func (lex *LEX) Close(m *ctx.Message, arg ...string) bool { // {{{
|
|||||||
case m.Target():
|
case m.Target():
|
||||||
case m.Source():
|
case m.Source():
|
||||||
}
|
}
|
||||||
return false
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -415,19 +371,7 @@ var Index = &ctx.Context{Name: "lex", Help: "词法中心",
|
|||||||
page = lex.index("npage", arg[1])
|
page = lex.index("npage", arg[1])
|
||||||
}
|
}
|
||||||
|
|
||||||
hash, rest, word := lex.parse(page, []byte(arg[0]))
|
hash, rest, word := lex.parse(m, page, []byte(arg[0]))
|
||||||
m.Result(0, hash, string(rest), string(word))
|
|
||||||
lex.Log("debug", nil, "\033[31m[%v]\033[0m %d [%v]", string(word), hash, string(rest))
|
|
||||||
} // }}}
|
|
||||||
}},
|
|
||||||
"scan": &ctx.Command{Name: "scan line [page]", Help: "解析单词", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
|
||||||
if lex, ok := m.Target().Server.(*LEX); m.Assert(ok) { // {{{
|
|
||||||
page := 1
|
|
||||||
if len(arg) > 1 {
|
|
||||||
page = lex.index("npage", arg[1])
|
|
||||||
}
|
|
||||||
|
|
||||||
hash, rest, word := lex.scan(m, page, []byte(arg[0]))
|
|
||||||
m.Result(0, hash, string(rest), string(word))
|
m.Result(0, hash, string(rest), string(word))
|
||||||
} // }}}
|
} // }}}
|
||||||
}},
|
}},
|
||||||
@ -449,9 +393,9 @@ var Index = &ctx.Context{Name: "lex", Help: "词法中心",
|
|||||||
}
|
}
|
||||||
|
|
||||||
rest := []byte(arg[0])
|
rest := []byte(arg[0])
|
||||||
_, _, rest = lex.parse(help, []byte(rest))
|
_, _, rest = lex.parse(m, help, []byte(rest))
|
||||||
_, _, rest = lex.parse(void, []byte(rest))
|
_, _, rest = lex.parse(m, void, []byte(rest))
|
||||||
hash, word, rest := lex.parse(page, []byte(rest))
|
hash, word, rest := lex.parse(m, page, []byte(rest))
|
||||||
m.Add("result", fmt.Sprintf("%d", hash), string(word), string(rest))
|
m.Add("result", fmt.Sprintf("%d", hash), string(word), string(rest))
|
||||||
} // }}}
|
} // }}}
|
||||||
}},
|
}},
|
||||||
@ -502,11 +446,6 @@ var Index = &ctx.Context{Name: "lex", Help: "词法中心",
|
|||||||
} // }}}
|
} // }}}
|
||||||
}},
|
}},
|
||||||
},
|
},
|
||||||
Index: map[string]*ctx.Context{
|
|
||||||
"void": &ctx.Context{Name: "void", Help: "void",
|
|
||||||
Commands: map[string]*ctx.Command{"parse": &ctx.Command{}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -3,11 +3,11 @@ package nfs // {{{
|
|||||||
import ( // {{{
|
import ( // {{{
|
||||||
"contexts"
|
"contexts"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
|
||||||
"github.com/nsf/termbox-go"
|
"github.com/nsf/termbox-go"
|
||||||
"github.com/skip2/go-qrcode"
|
"github.com/skip2/go-qrcode"
|
||||||
|
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
@ -25,11 +25,12 @@ import ( // {{{
|
|||||||
var FileNotExist = errors.New("file not exist")
|
var FileNotExist = errors.New("file not exist")
|
||||||
|
|
||||||
type NFS struct {
|
type NFS struct {
|
||||||
in *os.File
|
in *os.File
|
||||||
out *os.File
|
out *os.File
|
||||||
history []string
|
history []string
|
||||||
pages []string
|
pages []string
|
||||||
width, height int
|
width int
|
||||||
|
height int
|
||||||
|
|
||||||
paths []string
|
paths []string
|
||||||
|
|
||||||
@ -470,8 +471,7 @@ func (nfs *NFS) Read(p []byte) (n int, err error) { // {{{
|
|||||||
|
|
||||||
case termbox.KeyCtrlK:
|
case termbox.KeyCtrlK:
|
||||||
if len(rest) > 0 {
|
if len(rest) > 0 {
|
||||||
back = back[:0]
|
back = append([]rune{}, rest...)
|
||||||
back = append(back, rest...)
|
|
||||||
}
|
}
|
||||||
rest = rest[:0]
|
rest = rest[:0]
|
||||||
|
|
||||||
@ -487,16 +487,17 @@ func (nfs *NFS) Read(p []byte) (n int, err error) { // {{{
|
|||||||
if len(tab) == 0 {
|
if len(tab) == 0 {
|
||||||
tabi = 0
|
tabi = 0
|
||||||
prefix := string(buf)
|
prefix := string(buf)
|
||||||
msg := nfs.Message.Spawn(nfs.cli.Target())
|
target := nfs.Message.Target()
|
||||||
target := msg.Cmd("target").Data["target"].(*ctx.Context)
|
nfs.Message.Target(nfs.Optionv("ps_target").(*ctx.Context))
|
||||||
msg.Spawn(target).BackTrace(func(msg *ctx.Message) bool {
|
nfs.Message.BackTrace(func(m *ctx.Message) bool {
|
||||||
for k, _ := range msg.Target().Commands {
|
for k, _ := range m.Target().Commands {
|
||||||
if strings.HasPrefix(k, prefix) {
|
if strings.HasPrefix(k, prefix) {
|
||||||
tab = append(tab, k[len(prefix):])
|
tab = append(tab, k[len(prefix):])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
|
nfs.Message.Target(target)
|
||||||
}
|
}
|
||||||
|
|
||||||
if tabi >= 0 && tabi < len(tab) {
|
if tabi >= 0 && tabi < len(tab) {
|
||||||
@ -619,8 +620,7 @@ func (nfs *NFS) Start(m *ctx.Message, arg ...string) bool { // {{{
|
|||||||
nfs.print(v)
|
nfs.print(v)
|
||||||
}
|
}
|
||||||
if msg.Append("file_pos0") != "" {
|
if msg.Append("file_pos0") != "" {
|
||||||
i = msg.Appendi("file_pos0")
|
i = msg.Appendi("file_pos0") - 1
|
||||||
i--
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
line = ""
|
line = ""
|
||||||
@ -1401,18 +1401,6 @@ var Index = &ctx.Context{Name: "nfs", Help: "存储中心",
|
|||||||
} // }}}
|
} // }}}
|
||||||
}},
|
}},
|
||||||
},
|
},
|
||||||
Index: map[string]*ctx.Context{
|
|
||||||
"void": &ctx.Context{Name: "void",
|
|
||||||
Commands: map[string]*ctx.Command{
|
|
||||||
"scan": &ctx.Command{},
|
|
||||||
"open": &ctx.Command{},
|
|
||||||
"save": &ctx.Command{},
|
|
||||||
"load": &ctx.Command{},
|
|
||||||
"genqr": &ctx.Command{},
|
|
||||||
"write": &ctx.Command{},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -192,7 +192,7 @@ func (yac *YAC) parse(m *ctx.Message, out *ctx.Message, page int, void int, line
|
|||||||
for star, s := 0, page; s != 0 && len(line) > 0; {
|
for star, s := 0, page; s != 0 && len(line) > 0; {
|
||||||
//解析空白
|
//解析空白
|
||||||
lex := m.Sesss("lex")
|
lex := m.Sesss("lex")
|
||||||
lex.Cmd("scan", line, yac.name(void))
|
lex.Cmd("parse", line, yac.name(void))
|
||||||
if lex.Result(0) == "-1" {
|
if lex.Result(0) == "-1" {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -200,7 +200,7 @@ func (yac *YAC) parse(m *ctx.Message, out *ctx.Message, page int, void int, line
|
|||||||
//解析单词
|
//解析单词
|
||||||
line = lex.Result(1)
|
line = lex.Result(1)
|
||||||
lex = m.Sesss("lex")
|
lex = m.Sesss("lex")
|
||||||
lex.Cmd("scan", line, yac.name(s))
|
lex.Cmd("parse", line, yac.name(s))
|
||||||
if lex.Result(0) == "-1" {
|
if lex.Result(0) == "-1" {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -257,7 +257,6 @@ func (yac *YAC) parse(m *ctx.Message, out *ctx.Message, page int, void int, line
|
|||||||
|
|
||||||
func (yac *YAC) Spawn(m *ctx.Message, c *ctx.Context, arg ...string) ctx.Server { // {{{
|
func (yac *YAC) Spawn(m *ctx.Message, c *ctx.Context, arg ...string) ctx.Server { // {{{
|
||||||
yac.Message = m
|
yac.Message = m
|
||||||
|
|
||||||
c.Caches = map[string]*ctx.Cache{}
|
c.Caches = map[string]*ctx.Cache{}
|
||||||
c.Configs = map[string]*ctx.Config{}
|
c.Configs = map[string]*ctx.Config{}
|
||||||
|
|
||||||
@ -357,9 +356,7 @@ func (yac *YAC) Start(m *ctx.Message, arg ...string) (close bool) { // {{{
|
|||||||
func (yac *YAC) Close(m *ctx.Message, arg ...string) bool { // {{{
|
func (yac *YAC) Close(m *ctx.Message, arg ...string) bool { // {{{
|
||||||
switch yac.Context {
|
switch yac.Context {
|
||||||
case m.Target():
|
case m.Target():
|
||||||
return true
|
|
||||||
case m.Source():
|
case m.Source():
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -373,15 +370,15 @@ var Index = &ctx.Context{Name: "yac", Help: "语法中心",
|
|||||||
Configs: map[string]*ctx.Config{
|
Configs: map[string]*ctx.Config{
|
||||||
"ncell": &ctx.Config{Name: "词法上限", Value: "128", Help: "词法集合的最大数量"},
|
"ncell": &ctx.Config{Name: "词法上限", Value: "128", Help: "词法集合的最大数量"},
|
||||||
"nlang": &ctx.Config{Name: "语法上限", Value: "32", Help: "语法集合的最大数量"},
|
"nlang": &ctx.Config{Name: "语法上限", Value: "32", Help: "语法集合的最大数量"},
|
||||||
"name": &ctx.Config{Name: "name", Value: "parse", Help: "模块名", Hand: func(m *ctx.Message, x *ctx.Config, arg ...string) string {
|
"label": &ctx.Config{Name: "嵌套标记", Value: "####################", Help: "嵌套层级日志的标记"},
|
||||||
|
"yac_name": &ctx.Config{Name: "yac_name", Value: "parse", Help: "模块名", Hand: func(m *ctx.Message, x *ctx.Config, arg ...string) string {
|
||||||
if len(arg) > 0 { // {{{
|
if len(arg) > 0 { // {{{
|
||||||
return arg[0]
|
return arg[0]
|
||||||
}
|
}
|
||||||
return fmt.Sprintf("%s%d", x.Value, m.Capi("nparse", 1))
|
return fmt.Sprintf("%s%d", x.Value, m.Capi("nparse", 1))
|
||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"help": &ctx.Config{Name: "help", Value: "解析模块", Help: "模块帮助"},
|
"yac_help": &ctx.Config{Name: "yac_help", Value: "解析模块", Help: "模块帮助"},
|
||||||
"label": &ctx.Config{Name: "嵌套标记", Value: "####################", Help: "嵌套层级日志的标记"},
|
|
||||||
},
|
},
|
||||||
Commands: map[string]*ctx.Command{
|
Commands: map[string]*ctx.Command{
|
||||||
"init": &ctx.Command{Name: "init [ncell [nlang]]", Help: "初始化语法矩阵", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
"init": &ctx.Command{Name: "init [ncell [nlang]]", Help: "初始化语法矩阵", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
@ -455,22 +452,17 @@ var Index = &ctx.Context{Name: "yac", Help: "语法中心",
|
|||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"parse": &ctx.Command{
|
"parse": &ctx.Command{
|
||||||
Name: "parse filename [name [help]] [line line] [void void]",
|
Name: "parse filename [yac_name [help]] [line line] [void void]",
|
||||||
Help: "解析文件, filename: name:模块名, help:模块帮助, 文件名, line: 默认语法, void: 默认空白",
|
Help: "解析文件, filename: yac_name:模块名, yac_help:模块帮助, 文件名, line: 默认语法, void: 默认空白",
|
||||||
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
if yac, ok := m.Target().Server.(*YAC); m.Assert(ok) { // {{{
|
if yac, ok := m.Target().Server.(*YAC); m.Assert(ok) { // {{{
|
||||||
m.Optioni("page", yac.page["line"])
|
m.Optioni("page", yac.page["line"])
|
||||||
m.Optioni("void", yac.page["void"])
|
m.Optioni("void", yac.page["void"])
|
||||||
m.Start(m.Confx("name", arg, 1), m.Confx("help", arg, 2), key, arg[0])
|
m.Start(m.Confx("yac_name", arg, 1), m.Confx("yac_help", arg, 2), key, arg[0])
|
||||||
}
|
}
|
||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
},
|
},
|
||||||
Index: map[string]*ctx.Context{
|
|
||||||
"void": &ctx.Context{Name: "void", Help: "void",
|
|
||||||
Commands: map[string]*ctx.Command{"parse": &ctx.Command{}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user