Да, есть правила форматирования в lex/flex, и вы нарушаете их.
Подведем итоги. Существует три основных раздела программы ввода lex/flex, которые разделены разделителем %%
в первой колонке (в начале строки). Последний раздел является необязательным. Первый раздел предназначен для лексических объявлений; в этом разделе могут быть названы регулярные выражения. Во втором разделе указаны действия, которые должны выполняться для шаблонов, а третий (необязательный) раздел используется для (C) кода, который должен быть транскрибирован выходному файлу. Он используется для определения функций, используемых в разделе действия.
Стандартный формат для первой секции (Lex декларация) является:
name pattern
В случае, если имя должно начинаться в колонке одной (начало строки) и образец отделяется на той же линии белым пространство.
Формат для второй секции (действий) аналогичен:
pattern action
В случае, если шаблон должен начинаться в колонке одной (начало строки) и действие разделены на ту же строке пробела , Шаблон может быть продолжен более чем на одной строке, но должен быть отступом от белого пробела, иначе он будет интерпретироваться как новый шаблон.
Третий раздел не имеет ограничений по макету, поскольку код просто пропущен.
Существует одна заключительная синтаксическая функция, которая полезна. В первом разделе код, который не указывает лексический шаблон, который должен быть скопирован на выход, может быть обозначен %{
и %}
в начале строки. Кроме того, в секции действия (второй) любой код без шаблона и просто действие копируется на выход.
Запуск файла с объявлением переменных в C нарушает эти правила. Если он начинается слева, он рассматривается как лексическое определение.
Если вы хотите, чтобы объявить некоторые переменные в C, которые должны быть скопированы на выход, вы можете сделать это следующим образом:
%{
int num_lines = 0, num_chars = 0;
%}
%%
\n ++num_lines; ++num_chars;
. ++num_chars;
Или поочередно, как это:
%%
int num_lines = 0, num_chars = 0;
\n ++num_lines; ++num_chars;
. ++num_chars;
Я пробовал с последним выпуском github flex, и я получаю такое же поведение, что, вероятно, означает, что я чего-то не хватает ... – user31223
Мне очень нужна обратная связь по этому поводу, поскольку нет никакого намека на то, что я делаю неправильно или если это даже ошибка – user31223