mark.zlatoust.ru Послать письмо Webmaster-у Web-Master © Бернадинер Марк 

Златоуст.Ru

 

 

      LEX(1)                                                   LEX(1)

      НАЗВАНИЕ
              lex - генератор программ простого лексического анализа

      СИНТАКСИС
              lex  [-r] [-c] [-t] [-v] [-n] [файл ...]

      ОПИСАНИЕ
              Команда lex генерирует программы, которые можно исполь-
              зовать для простого лексического анализа текста.

              Входные файлы (по умолчанию - стандартный ввод)  содер-
              жат цепочки символов и выражения, подлежащие  распозна-
              ванию, и операторы на языке C,  которые  выполняются  в
              случае успеха распознавания.

              Генерируется  программа  lex.yy.c.  Будучи  загруженной
              вместе с библиотекой, она для каждой  распознанной  це-
              почки выполняет соответствующие C-операторы, а  осталь-
              ные фрагменты входного файла копирует в  выходной  файл
              без изменений. Распознанная цепочка помещается во внеш-
              ний символьный массив yytext. Сопоставление цепочек вы-
              полняется в том порядке, в котором они указаны в файле.
              Цепочки символов могут содержать квадратные скобки, ко-
              торые указывают классы символов (например, [abx-z]  оз-
              начает a, b, x, y и z), и операторы *, + и ?, обознача-
              ющие повторение предыдущего символа или  класса  симво-
              лов,  соответственно,  любое неотрицательное число раз,
              любое положительное число, 0 или один раз. Символ  .  -
              это класс всех символов ASCII, кроме перевода строки. В
              дополнение,  поддерживаются  скобки (группировка симво-
              лов) и вертикальная черта (альтернация). Запись  r{d,e}
              в  правиле обозначает вхождения регулярного выражения r
              между d и e. Она имеет больший  приоритет,  чем  |,  но
              меньший,  чем *, ?, + и конкатенация. Символ ^ в начале
              выражения означает, что сопоставление должно начинаться
              с начала строки, символ $ в  конце  выражения  требует,
              чтобы  следующим  символом в сопоставляемой цепочке был
              символ перевода строки. Символ / в выражении  обознача-
              ет, что только часть выражения вплоть до наклонной чер-
              ты  помещается в yytext, но оставшаяся часть должна ус-
              пешно сопоставляться. Символ оператора может  использо-
              ваться  как  обычный символ, если он взят в кавычки или
              если ему предшествует \.  Пример:  выражение  [a-zA-Z]+
              успешно сопоставляется с цепочкой букв.

              Три  подпрограммы  определены  как  макросы: input( ) -
              прочитать символ; unput(c) - заменить прочитанный  сим-
              вол; output(c) - поместить выходной символ. Все они оп-
              ределены в терминах стандартных потоков, но их описание
              можно изменить. Генерируемая программа-анализатор назы-
              вается yylex( ), библиотека содержит программу main( ),
              которая вызывает анализатор. Действие REJECT  в  правой
              части  правила обозначает отказ от текущего сопоставле-
              ния и переход к поиску следующего сопоставления;  функ-
              ция yymore( )  накапливает дополнительные символы в том
              же массиве yytext; функция yyless(p) выталкивает порцию
              сопоставленной цепочки символов, начиная с  позиции  p,
              которая должна быть между yytext и yytext+yyleng.  Мак-
              росы  input  и output используют файлы yyin и yyout для
              чтения и записи (по умолчанию это файлы stdin и  stdout
              соответственно).

              Строки,  начинающиеся  с  пробела, считаются текстом на
              языке C и копируются в файл lex.yy.c;  если  они  пред-
              шествуют  строке  %%, копирование выполняется в область
              внешних определений файла lex.yy.c. Все правила, как  и
              в YACC, должны стоять после %%. Строки, стоящие до %% и
              начинающиеся не с пробела, определяют стоящую слева це-
              почку  символов  как остаток строки; данное определение
              затем можно использовать, указав эту цепочку в фигурных
              скобках { }. Отметим, что после подстановки скобки  ис-
              чезнут.

      ПРИМЕР
                   D       [0-9]
                   %%
                   if      printf("IF statement\n");
                   [a-z]+  printf("tag, value %s\n",yytext);
                   0{D}+   printf("octal number %s\n",yytext);
                   {D}+    printf("decimal number %s\n",yytext);
                   "++"    printf("unary op\n");
                   "+"     printf("binary op\n");
                   "/*"     skipcommnts();
                   %%
                    skipcommnts()
                    {
                      for(;;) {
                        while (input() != '*')
                          ;
                        if (input() != '/')
                          unput(yytext[yyleng-1]);
                        else
                          return;
                      }
                    }

              Внешние имена, сгенерированные программой  lex,  всегда
              начинаются с префикса yy или YY.

              Опции:

              -r   Выполняемые действия написаны на языке ratfor [см.
                   ratfor(1)].

              -c   Выполняемые действия написаны на языке  C  (данная
                   опция считается использованной по умолчанию).

              -t   Поместить результат на  стандартный  вывод  вместо
                   файла lex.yy.c.

              -v   Выдать статистическую сводку о построенном автома-
                   те.

              -n   Отменить выдачу статистики.

              Если указано несколько файлов, они рассматриваются  как
              один общий файл. Если файлы не указаны,  обрабатывается
              стандартный ввод.

              Размеры некоторых таблиц  для  генерируемого  конечного
              автомата могут быть установлены в разделе определений:

                   %p n  число позиций равно n (по умолчанию - 2500)

                   %n n  число состояний (500)

                   %e n  число узлов в дереве разбора (1000)

                   %a n  число переходов (2000)

                   %k n  число классов упакованных символов (1000)

                   %o n  размер выходного массива (3000)

              Использование одного или большего числа таких определе-
              ний автоматически подразумевает задание опции  -v, если
              не используется опция -n.

      СМ. ТАКЖЕ
              yacc(1).

      СЮРПРИЗЫ
              Опция -r еще не полностью работоспособна.



 

 

Бернадинер Марк Абрамович

Мое резюме

Компьютерная страничка

Ресурсы сети

Фотоальбом

 

 

 

mark.zlatoust.ru Послать письмо Webmaster-у Web-Master © Бернадинер Марк