2016-11-19 4 views
0

Я не понимаю почему, из 2 функционально идентичных исходных файлов, только 1 передает фазу компиляции с flex, а другой генерирует ошибки в отношении use of undeclared identifier.Существуют правила форматирования, которые следует соблюдать при использовании flex?

Это один нормально (я обычно не использовать вкладки в моем редакторе, те все пробельные символы)

 int num_lines = 0, num_chars = 0; 

%% 
\n  ++num_lines; ++num_chars; 
.  ++num_chars; 

%% 
int main() 
     { 
     yylex(); 
     printf("# of lines = %d, # of chars = %d\n", 
       num_lines, num_chars); 
     } 

Это один он не принимается flex и ничего, кроме ошибок не генерировать

int num_lines = 0, num_chars = 0; 

%% 
\n ++num_lines; ++num_chars; 
. ++num_chars; 

%% 

int main() 
{ 
    yylex(); 
    printf("# of lines = %d, # of chars = %d\n", num_lines, num_chars); 
} 

Должен ли я следовать определенному соглашению, если я хочу скомпилировать свой сканер с помощью flex?

+0

Я пробовал с последним выпуском github flex, и я получаю такое же поведение, что, вероятно, означает, что я чего-то не хватает ... – user31223

+0

Мне очень нужна обратная связь по этому поводу, поскольку нет никакого намека на то, что я делаю неправильно или если это даже ошибка – user31223

ответ

0

Да, есть правила форматирования в 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; 
+0

спасибо, что использование '% {' и '%}' исправило проблему, дело в том, что официальные примеры, приведенные в руководстве из папки doc источников flex, отформатированы так же, как и в моем сообщении, вы могут даже читать их в Интернете https://ftp.gnu.org/old-gnu/Manuals/flex-2.5.4/html_node/flex_5.html, и они не используют ни одно из последних двух рассмотренных вами решений; это меня просто сбивало с толку, так как я предполагал, что примеры хорошо написаны, и в предыдущих разделах руководства не упоминалось * правило форматирования *. По крайней мере, теперь я знаю, еще раз спасибо. – user31223

+0

Это не совсем правильно. Отступы в разделе определений и отступы в разделе правил копируются в выходной файл, но в разных местах. Отступные строки в разделе правил идут в начало выходного файла, поэтому объявления - это область файлов. Отступные строки в начале раздела правил идут в начале 'yylex', поэтому объявления являются локальными (и присваивания выполняются каждый раз, когда вводится' yylex'. (Отступы строк после первого правила в разделе правил переходят в неуказанное местоположение , поэтому они действительно должны быть комментариями.) – rici

+0

@rici Спасибо за разъяснение. –

Смежные вопросы

 Смежные вопросы