@Artem0071
Безработный mr. Junior

Как распарсить строку в структуру Go?

Может тут кто пользовался либой для парсинга строк?
сама либа -> https://github.com/alecthomas/participle

Нужно распарсить строку такого вида:
test(aaa("321") == bbb(123), ccc(["hello", 321 <> 123])) > 321


Я смог распарсить все, кроме сравнений (и массив, но главное со сравнениями разобраться):
type Rule struct {
	Value *Value `@@`
}

type Value struct {
	String *string  `( @String`
	Number *float64 `| @Number`
	Func   *Func    `| @@ )`
	//Condition *Condition `| @@ )`
}

type Func struct {
	Name       string   `@Ident`
	Parameters []*Value `( "(" [ @@ ( "," @@ )* ] ")" )`
}

type Condition struct {
	Left     *Value  `@@`
	Operator *string `@( "<>" | "<=" | ">=" | "<" | ">" | "!=" | "==" )`
	Right    *Value  `@@`
}


Сейчас при запуске - упираюсь в циклический парсинг, думаю что Func и Condition начинают конфликтовать за распаршивание
  • Вопрос задан
  • 474 просмотра
Пригласить эксперта
Ответы на вопрос 1
kvaks
@kvaks
рекомендую попробовать парсить регулярками, как то так
func main() {
    input := `test(aaa("321") == bbb(123), ccc(["hello", 321 <> 123])) > 321`
    parsed := parseString(input)
    fmt.Println(parsed)
}

func parseString(input string) []string {
    re := regexp.MustCompile(`[a-zA-Z]+(?:\([^()]*\))*`)
    matches := re.FindAllString(input, -1)
    var result []string
    for _, match := range matches {
        match = strings.TrimSpace(match)
        if match != "" {
            result = append(result, match)
        }
    }

    return result
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы