Формат правил lex / flex - Должны ли Pattern и Action быть в одной строке? - PullRequest
0 голосов
/ 09 октября 2019

Я не нашел никакого объяснения (или пропустил его) относительно формата правил lex в отношении действий. Вот пример:

  %%
  ^([ \r\t])*[abcd][^=].* 
              {  
                 return TOKEN1;
              }
  %%

В отличие от:

  %%
  ^([ \r\t])*[abcd][^=].* {  
                 return TOKEN1;
              }
  %%

Я знаю, что %% должен начинаться с новой строки без пробела. Тем не менее, я хочу знать об части действия. Я нахожу, что иногда он жалуется, что «предупреждение, правило не может быть сопоставлено», когда действие и шаблон находятся в разных строках, как в приведенном выше примере. Это предупреждение появляется, когда они приведены в одной строке. Однако у меня есть подобное правило, которое не выдает предупреждение, даже когда действие начинается с новой строки.

Я использую с Bison, хотя этот факт не должен относиться к вопросу.

1 Ответ

2 голосов
/ 09 октября 2019

Из руководства Flex :

5.2 Формат раздела правил

Раздел правил ввода Flex содержит ряд правил вида:

pattern   action

, где шаблон должен быть с отступом, а действие должно начинаться с той же строки.


Если вы предпочитаете спецификацию Posix для lex , существует аналогичное требование:

Правила в исходных файлах lex - это таблица, в которой левый столбец содержит регулярные выражения, а правый столбец содержит действия (фрагменты программы на C), которые должны выполняться, когдавыражения распознаются.

ERE action
ERE action...

Часть строки расширенного регулярного выражения (ERE) должна отделяться от действия одним или несколькими <blank> символами.

<blank> определяется в объеме базовых определений как символ пробела или символа табуляции.


Posix запрещает строки правил, где нет действия, хотя Flex разрешит их, как если бы действие было ;. Строки с отступом в разделе правил обычно дословно вставляются в вывод, но если строки с отступом не предшествуют первому правилу, результат не определен. По крайней мере, Posix просто говорит, что результат не определен. Flex (и, как мне кажется, большинство реализаций lex) копирует строки в сгенерированный файл, где они упадут после оператора break; в конце предложения action case. Это не будет проблемой, если строки будут комментариями, что не редкость. Но фактический исполняемый код, вероятно, вызовет предупреждение «недоступный код», при условии, что вы компилируете с включенными предупреждениями.

Однако Flex также допускает блоки условий запуска, и внутри блока условий запуска вы можете делать отступы для шаблонов. ,В этом контексте размещение действия в строке само по себе заставит Flex рассматривать его как шаблон, а не как вставленный код.

...