В настоящее время я анализирую некоторые файлы Gherkin вместе с соответствующими файлами определений шагов. Мне интересно, как лучше всего было бы извлечь RegEx внутри шага вместе с кодом. Например, у меня есть следующие функции:
this.Given(/^I create an SNS topic with name "([^"]*)"$/, function(name, callback) {
var world = this;
this.request(null, 'createTopic', {Name: name}, callback, function (resp) {
world.topicArn = resp.data.TopicArn;
});
});
this.Given(/^I list the SNS topics$/, function(callback) {
this.request(null, 'listTopics', {}, callback);
});
Я хочу извлечь как регулярное выражение ^I create an SNS topic with name "([^"]*)"$, так и код функции:
var world = this;
this.request(null, 'createTopic', {Name: name}, callback, function (resp) {
world.topicArn = resp.data.TopicArn;
});
Мне удалось извлечь регулярное выражение, используя следующее регулярное выражение: 'this.(?:Given|Then|When)(/(.+?)/'
Однако извлечь код функции гораздо сложнее. Как я могу указать для функции извлечение всего, от первого { до последнего }? Есть ли лучший способ сделать это, например, библиотека, которая автоматически сможет его извлечь?
пример, который в общем случае неверен, но может работать, если ваши файлы имеют стандартный формат и не имеют вложенных блоков this.Given(...): разделите файл на строки, начинающиеся с this.Given(, возьмите все, что находится между this.Given( и последним }); в вашем блоке, в качестве тело функции.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Регулярные выражения не подходят для правильного анализа общих программ(1). Вместо этого вам следует использовать парсер javascript.
Другой способ — выбрать прокси; например:
this.Given(,this.Given( и последним });, который вы видите в фрагменте, как «тело функции»у этого упрощенного подхода есть несколько очевидных «слепых зон» (поэтому я назвал его «прокси»):
он не будет работать, если у вас есть вложенные операторы this.Given(, он будет неправильно улавливать финальный }); в строке комментария, он будет неправильно включать код из другого объявления функции (если у вас есть такие, которые объявлены между двумя операторами this.Given( ), ...
но если ваш код имеет регулярную структуру, это может быть быстрее реализовать, чем использование полного синтаксического анализатора JavaScript.
(1): языки программирования обычно относятся к «контекстно-свободным» или «контекстно-зависимым» языковым классам, тогда как регулярные выражения могут анализировать только «обычные» языки.
Регулярные выражения имеют ограничения и не могут точно проанализировать общий блок кода программирования на таком языке, как javascript. Правильный способ: использовать парсер javascript.