diff --git a/define.go b/define.go index 723714d..e175c03 100644 --- a/define.go +++ b/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) } diff --git a/lexical.go b/lexical.go index 569c0ae..593379c 100644 --- a/lexical.go +++ b/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 {