json_filter/lexical.go

89 lines
1.9 KiB
Go
Raw Normal View History

// Package filter ...
//
// Description : JSON 词法分析
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 2022-07-04 17:52
package filter
2022-07-04 18:08:10 +08:00
import (
2022-07-04 18:39:29 +08:00
"strings"
"git.zhangdeman.cn/zhangdeman/util"
"github.com/pkg/errors"
)
// parseLexical 解析词法
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:11 2022/7/4
2022-07-04 18:35:32 +08:00
func parseLexical(jsonData string) ([]lexicalNode, error) {
2022-07-04 18:39:29 +08:00
jsonData = strings.ReplaceAll(strings.ReplaceAll(jsonData, "\n", ""), "\t", "")
// mt.Println(jsonData)
if len(jsonData) < 2 {
return nil, errors.New("input data is not json")
}
2022-07-04 18:35:32 +08:00
lexicalList := make([]lexicalNode, 0)
tmpStr := ""
for _, itemChar := range jsonData {
2022-07-04 18:35:32 +08:00
currentChar := string(itemChar)
preChar := "-1"
if len(lexicalList) > 0 {
preChar = lexicalList[len(lexicalList)-1].Val
if preChar == objectLeftToken && currentChar == " " {
// 无意义的空格
continue
}
2022-07-04 18:35:32 +08:00
}
if inputCharIsToken(currentChar, preChar) {
// 是关键词
if len(tmpStr) > 0 {
lexicalList = append(lexicalList, lexicalNode{
Val: tmpStr,
IsToken: false,
})
}
lexicalList = append(lexicalList, lexicalNode{
Val: currentChar,
IsToken: true,
})
2022-07-04 18:47:50 +08:00
tmpStr = ""
2022-07-04 18:35:32 +08:00
} else {
// 不是关键词, 继续向后走
tmpStr = tmpStr + currentChar
}
}
2022-07-04 18:39:29 +08:00
util.JSON.ConsoleOutput(lexicalList)
return nil, nil
}
// inputCharIsToken 输入字符是否为关键字
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:15 2022/7/4
2022-07-04 18:35:32 +08:00
func inputCharIsToken(inputChar string, preChar string) bool {
if preChar == escapeCharacterToken {
// 前一个是转义符, 当前不是关键字
return false
}
tokenCharList := []string{
listLeftToken,
listRightToken,
objectLeftToken,
objectRightToken,
2022-07-04 18:35:32 +08:00
keyLeftRightToken,
kvPairSplitToken,
escapeCharacterToken,
}
for _, itemChar := range tokenCharList {
if itemChar == inputChar {
return true
}
}
return false
}