优化词法分析,分析时增加类型

This commit is contained in:
白茶清欢 2022-07-05 14:13:28 +08:00
parent aea79b341c
commit db0f851aff
2 changed files with 42 additions and 28 deletions

View File

@ -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)
}

View File

@ -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 {