Алгоритм разбора строки

Регулярные выражения — хороший способ анализа обычных строк, но когда строки становятся более сложными, регулярное выражение становится в n² раз сложнее.

Каков общий подход к синтаксическому анализу строк?

Например. В настоящее время я определил синтаксис ({who}[{where}].{what} = {value}), который может или не может определять определенные компоненты. Это достаточно просто, чтобы его было легко понять, но достаточно сложно, чтобы потребовать большого регулярного выражения.

Как правило, некоторые компоненты можно опустить, однако есть определенные компоненты, которые зависят от других компонентов. Пример:

'key = value' => {
    who: null,
    where: null,
    what: 'key',
    value: 'value'
}

'me.key = value' => {
    who: 'me',
    where: null,
    what: 'key',
    value: 'value'
}

'me[here].key = value' => {
    who: 'me',
    where: 'here',
    what: 'key',
    value: 'value'
}

'me[here] = value' => 'Error! Need to specify *what*.'

'[here].key = value' => 'Error! Need to specify *who* if *where* is specified.'

person Manulaiko    schedule 20.03.2018    source источник
comment
Общий подход состоит в том, чтобы определить вашу грамматику, а затем написать для нее синтаксический анализатор. Для большинства языков доступны библиотеки синтаксических анализаторов или генераторы синтаксических анализаторов. Грамматика определит, какой парсер (например, LALR) вам нужен для ее анализа.   -  person Ian Mercer    schedule 20.03.2018
comment
Я не знаю, что вы называете большим регулярным выражением, но (реальный) шаблон для описания вашей грамматики прост и не очень длинный: regex101.com/r/OeQcUO/1   -  person Casimir et Hippolyte    schedule 20.03.2018
comment
Вы можете попытаться реализовать синтаксический анализ на основе нотации BNF, например здесь или здесь.   -  person omegastripes    schedule 20.03.2018