优化词法分析,分析时增加类型
This commit is contained in:
parent
aea79b341c
commit
db0f851aff
28
define.go
28
define.go
@ -7,17 +7,20 @@
|
||||
// Date : 2022-07-04 18:02
|
||||
package filter
|
||||
|
||||
import "fmt"
|
||||
|
||||
// jsonNode json语法树节点定义
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 18:06 2022/7/4
|
||||
type jsonNode struct {
|
||||
Name string // 节点名称
|
||||
Parent *jsonNode // 父节点
|
||||
Son *jsonNode // 子节点
|
||||
Brother *jsonNode // 兄弟节点
|
||||
Val interface{} // 节点的值
|
||||
Name string // 节点名称
|
||||
Parent *jsonNode // 父节点
|
||||
Son *jsonNode // 子节点
|
||||
PreBrother *jsonNode // 前一个兄弟节点
|
||||
NextBrother *jsonNode // 下一个兄弟节点
|
||||
Val interface{} // 节点的值
|
||||
}
|
||||
|
||||
// lexicalNode 词法分析的节点
|
||||
@ -26,6 +29,17 @@ type jsonNode struct {
|
||||
//
|
||||
// Date : 18:02 2022/7/4
|
||||
type lexicalNode struct {
|
||||
Val string // 词法分析出来的词
|
||||
IsToken bool // 是否为关键字
|
||||
Val interface{} // 词法分析出来的词
|
||||
Type string // 值得类型
|
||||
Show bool // 这个值是否对外呈现
|
||||
IsToken bool // 是否为关键字
|
||||
}
|
||||
|
||||
// ValStr 值转为字符串
|
||||
//
|
||||
// Author : go_developer@163.com<白茶清欢>
|
||||
//
|
||||
// Date : 14:10 2022/7/5
|
||||
func (l *lexicalNode) ValStr() string {
|
||||
return fmt.Sprintf("%v", l.Val)
|
||||
}
|
||||
|
42
lexical.go
42
lexical.go
@ -150,7 +150,7 @@ func (l *lexical) inputCharIsToken(inputChar string, tmpStr string, tmpStrType s
|
||||
preNode = l.lexicalResult[len(l.lexicalResult)-1]
|
||||
}
|
||||
|
||||
if inputChar == colonToken && nil != preNode && preNode.Val == keyLeftRightToken && l.keyLeftRightTokenCnt > 0 && l.keyLeftRightTokenCnt%2 == 0 {
|
||||
if inputChar == colonToken && nil != preNode && preNode.ValStr() == keyLeftRightToken && l.keyLeftRightTokenCnt > 0 && l.keyLeftRightTokenCnt%2 == 0 {
|
||||
// : 必须出现在偶数 " 之后才是关键字
|
||||
return true
|
||||
}
|
||||
@ -163,13 +163,13 @@ func (l *lexical) inputCharIsToken(inputChar string, tmpStr string, tmpStrType s
|
||||
// [true,false,true]
|
||||
if inputChar == commaToken && len(tmpStr) == 0 && (
|
||||
// 对应 {"name":"zhangsan", "age":"18"}
|
||||
(nil != preNode && preNode.Val == keyLeftRightToken) ||
|
||||
(nil != preNode && preNode.ValStr() == keyLeftRightToken) ||
|
||||
// 对应[{"name":"zhangsan", "age":"18"}, {"name":"zhangsan", "age":"18"}]
|
||||
(nil != preNode && preNode.Val == objectRightToken) ||
|
||||
(nil != preNode && preNode.ValStr() == objectRightToken) ||
|
||||
// 对应[[],[]]
|
||||
(nil != preNode && preNode.Val == listRightToken) ||
|
||||
(nil != preNode && preNode.ValStr() == listRightToken) ||
|
||||
// 对应 [true,false,true] / [1,2,3] / [1,true,2,false]
|
||||
(nil != preNode && (preNode.Val == listLeftToken || preNode.Val == commaToken) && (tmpStrType == "number" || tmpStr == "bool"))) { // 对应
|
||||
(nil != preNode && (preNode.ValStr() == listLeftToken || preNode.ValStr() == commaToken) && (tmpStrType == "number" || tmpStr == "bool"))) { // 对应
|
||||
return true
|
||||
}
|
||||
|
||||
@ -179,9 +179,9 @@ func (l *lexical) inputCharIsToken(inputChar string, tmpStr string, tmpStrType s
|
||||
// {"person": {}}
|
||||
if inputChar == objectLeftToken && len(tmpStr) == 0 &&
|
||||
(nil == preNode || // 对应 {}
|
||||
(nil != preNode && preNode.Val == listLeftToken) || // 对应 [{}]
|
||||
(nil != preNode && preNode.Val == colonToken) || // 对应 {"person": {}}
|
||||
(nil != preNode && preNode.Val == commaToken)) { // 对应 [{}, {}]
|
||||
(nil != preNode && preNode.ValStr() == listLeftToken) || // 对应 [{}]
|
||||
(nil != preNode && preNode.ValStr() == colonToken) || // 对应 {"person": {}}
|
||||
(nil != preNode && preNode.ValStr() == commaToken)) { // 对应 [{}, {}]
|
||||
// { 是关键字
|
||||
return true
|
||||
}
|
||||
@ -197,15 +197,15 @@ func (l *lexical) inputCharIsToken(inputChar string, tmpStr string, tmpStrType s
|
||||
// {"person_list": [{"like":1}]}
|
||||
if inputChar == objectRightToken && len(tmpStr) == 0 && (
|
||||
// 对应 {}, [{}]
|
||||
(nil != preNode && preNode.Val == objectLeftToken) ||
|
||||
(nil != preNode && preNode.ValStr() == objectLeftToken) ||
|
||||
// 对应 {"name":"zhangsan"}
|
||||
(nil != preNode && preNode.Val == keyLeftRightToken) ||
|
||||
(nil != preNode && preNode.ValStr() == keyLeftRightToken) ||
|
||||
// 对应 {"person": {"name":"zhangsan"}}
|
||||
(nil != preNode && preNode.Val == objectRightToken)) ||
|
||||
(nil != preNode && preNode.ValStr() == objectRightToken)) ||
|
||||
// 对应 {"person": {"work":true}} / {"person": {"like":1}}
|
||||
(nil != preNode && preNode.Val == colonToken && (tmpStr == "number" || tmpStr == "bool")) ||
|
||||
(nil != preNode && preNode.ValStr() == colonToken && (tmpStr == "number" || tmpStr == "bool")) ||
|
||||
// 对应 {"person_list": [{"like":1}]}
|
||||
(nil != preNode && preNode.Val == listRightToken) {
|
||||
(nil != preNode && preNode.ValStr() == listRightToken) {
|
||||
// } 是关键字
|
||||
return true
|
||||
}
|
||||
@ -215,8 +215,8 @@ func (l *lexical) inputCharIsToken(inputChar string, tmpStr string, tmpStrType s
|
||||
// [[],[]]
|
||||
// "a": []
|
||||
if inputChar == listLeftToken && len(tmpStr) == 0 && (nil == preNode || // 对应 []
|
||||
(nil != preNode && preNode.Val == listLeftToken) || // 对应 [[],[]]
|
||||
(nil != preNode && preNode.Val == colonToken)) { // 对应 "a": []
|
||||
(nil != preNode && preNode.ValStr() == listLeftToken) || // 对应 [[],[]]
|
||||
(nil != preNode && preNode.ValStr() == colonToken)) { // 对应 "a": []
|
||||
// [ 是关键字
|
||||
return true
|
||||
}
|
||||
@ -230,15 +230,15 @@ func (l *lexical) inputCharIsToken(inputChar string, tmpStr string, tmpStrType s
|
||||
// ["", "" ]
|
||||
if inputChar == listRightToken && len(tmpStr) == 0 && (
|
||||
//对应 []
|
||||
(nil != preNode && preNode.Val == listLeftToken) ||
|
||||
(nil != preNode && preNode.ValStr() == listLeftToken) ||
|
||||
// 对应 [[],[]]
|
||||
(nil != preNode && preNode.Val == listRightToken) ||
|
||||
(nil != preNode && preNode.ValStr() == listRightToken) ||
|
||||
// [true, false] /
|
||||
(nil != preNode && preNode.Val == objectRightToken) ||
|
||||
(nil != preNode && preNode.ValStr() == objectRightToken) ||
|
||||
// 对应 [{}, {}] / [1,2,3]
|
||||
(nil != preNode && (tmpStrType == "number" || tmpStrType == "bool")) ||
|
||||
// 对应 ["", "" ]
|
||||
(nil != preNode && preNode.Val == keyLeftRightToken)) {
|
||||
(nil != preNode && preNode.ValStr() == keyLeftRightToken)) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
@ -251,7 +251,7 @@ func (l *lexical) getTmpStrType(tmpStr string) string {
|
||||
}
|
||||
|
||||
// 数字只有一个场景 {"age": 18},多以若是数字, 则 前一次解析必为关键字 :
|
||||
if nil != preNode && preNode.Val == colonToken {
|
||||
if nil != preNode && preNode.ValStr() == colonToken {
|
||||
// 判断是否可转数字
|
||||
var floatVal float64
|
||||
if err := util.ConvertAssign(&floatVal, tmpStr); nil == err {
|
||||
@ -261,7 +261,7 @@ func (l *lexical) getTmpStrType(tmpStr string) string {
|
||||
|
||||
// 判断是否为 bool
|
||||
// bool 只有一个场景 {"work": true/false},多以若是数字, 则 前一次解析必为关键字 :
|
||||
if nil != preNode && preNode.Val == colonToken {
|
||||
if nil != preNode && preNode.ValStr() == colonToken {
|
||||
// 判断是否可转数字
|
||||
var boolVal bool
|
||||
if err := util.ConvertAssign(&boolVal, tmpStr); nil == err {
|
||||
|
Loading…
Reference in New Issue
Block a user