«Произвольная грамматика» заставляет меня предложить вам посмотреть комментарий wberry.
Насколько сложны эти грамматики? Есть ли шаг ручного вмешательства?
Я сделаю попытку. Если бы я изменил ваш пример грамматики из:
S -> ASB | AB
A -> a
B -> b
для включения:
S' -> S | GS' | S'GS' | S'G
G -> sigma*
Так что G = мусор и S '- это много S-фрагментов с мусором между ними (возможно, я был небрежен с моими правилами производства. Вы поняли), я думаю, мы можем решить вашу проблему. Вам просто нужен анализатор, который будет соответствовать другим правилам до G. Возможно, вам придется изменить эти производственные правила на основе синтаксического анализатора. Я почти гарантирую, что будут изменения порядка правил в зависимости от парсера. Поскольку большинство библиотек синтаксического анализатора отделяют лексизм от синтаксического анализа, вам, вероятно, понадобится универсальная лексема с последующей модификацией G для включения всех возможных лексем. В зависимости от вашей специфики, это может быть не лучше (с точки зрения эффективности), чем просто начинать каждую попытку в каждой точке потока.
Но ... Предполагая, что мои производственные правила фиксированы (как для корректности, так и для конкретного вида синтаксического анализатора), это должно не только сопоставлять фрагменты в потоке, но и давать вам дерево разбора для всего потока. Вы заинтересованы только в поддеревьях с корнями в узлах типа S.