пробелы в гибких шаблонах приводят к «нераспознанному правилу» - PullRequest
0 голосов
/ 24 октября 2018

Руководство по гибкой информации позволяет использовать пробелы в регулярных выражениях с использованием модификатора "x" в форме (?r-s:pattern).В частности, предлагается простой пример (без пробелов)

(?:foo)         same as  (foo)

, но следующая программа не может скомпилировать с ошибкой «нераспознанное правило»:

BAD (?:foo)
%%
{BAD} {}

Я не могу найти любую форму (?, что приемлемо как правило.Это руководство по ошибке или я неправильно понял?

1 Ответ

0 голосов
/ 24 октября 2018

Пример в вашем вопросе, похоже, не отражает сам вопрос, поскольку не показывает ни пробелов, ни флага x.Итак, я собираюсь предположить, что шаблон, который вам не подходит, это что-то вроде

BAD      (?x:two | lines | 
             of | words)
%%
{BAD}    { }

И, действительно, это не сработает.Хотя вы можете использовать расширенный формат в шаблоне, вы можете использовать его только в определении, если он не содержит перевода строки.Определение заканчивается на последнем непробельном символе в строке определения.

В любом случае определения используются слишком много.Вы могли бы написать выше как

%%
(?x:two | lines |
    of | words )     { }

, что избавляет любого, кто читает ваш код, от необходимости искать определение.

Я понимаю, что вы можете использовать очень длинный шаблон вправило, что неудобно, особенно если вы хотите использовать его дважды.Независимо от проблемы с символами новой строки, это приводит к проблемам с ограничением длины определения Flex (2047 символов).Мой подход состоял в том, чтобы разбить очень длинный шаблон на серию определений, а затем определить другой символ, объединяющий фрагменты.

До версии 2.6 Flex не удалял пробелы из конца строки определения,что также приводит к таинственным ошибкам "непризнанного правила".Руководство по-прежнему отражает поведение v2.5:

Определение начинается с первого непробельного символа после имени и продолжается до конца строки.

...