[ Содержание ] [ Предыдущая ] [ Следующая ]

Описание определений источника

    Вспомним формат источника lex:

{ определения }
%%
{ правила }
%%
{ подпрограммы пользователя }

    Пока что были описаны только провила. Вам понадобятся дополнительные опции хотя бы для определения используемых в вашей программе переменнных и для самого lex. Это можно сделать или в секции определений или в секции правил.

    Помните, что lex превращает правила в программу. Любой источник, не перехваченный lex, копируется в созданную программу. Существуют три класса подобных случаев:

  1. Любая строка, которая не является частью правила или действия lex, начинающегося с пробела или знака табуляции, копируется в программу, созданную lex. Подобный вход из источника, предшествующий первому ограничителю %%, будет внешним по отношению к любой функции в коде программы; если он появляется сразу после первого ограничителя %%, то он будет помещен в соответствующее место для определений в функции, написанной lex и содержащей действия. Этот материал должен выглядеть как фрагменты программ и должен предшествовать первому правилу lex. Как побочный эффект сказанного выше, строки, начинающиеся с пробела или знака табуляции и содержащие комментарии, переходят в генерируемую программу. Это можно использовать в источнике lex или в генерируемом коде. Комментарии должны быть записаны по правилам языка СИ.
  2. Все заключенное между строками, содержащими только %{ и %}, копируется аналогично тому, как описано выше.Ограничители отбрасываются. Этот формат допускает ввод текста типа операторов препроцессора, который должен начинаться в первом столбце, и копирование строк, не являющиеся строками програмн.
  3. Все расположенное после третьего ограничителя %% копируется после вывода lex, невзирая на формат.

    Определения, предназначенные для lex, задаются до первого ограничителя %%. Любая строка этой секции, не заключенная между %{ и %} начинающаяся в первом столбце, рассматривается как определение замещающих строк lex. Формат этих строк следующий:

имя перевод

    Это вызывает сопоставление строки, заданной как "перевод", с соответствующим именем. Имя и перевод должны разделяться, по крайней мере, одним пробелом или знаком табуляции, причем имя должно начинаться с буквы. Перевод может быть указан в правиле в формате {name}. Например, использование {D} для цифр и {E} для порядка экспоненты может сократить правила распознавания чисел:

D [0-9]
E [DEde][-+]?{D}+
%%
{D}+ printf("inreger");
{D}+"."{D}*({E})? |
{D}*"."{D}+({E})? |
{D}+{E} printf("real");

    Первые два правила используются для вещественных чисел; в обоих необходима десятичная точка и десятичная часть. В первом правиле необходима хотя бы одна цифра перед десятичной точкой; во втором - хотя бы одна цифра после десятичной точки. Чтобы успешно разрешить проблемы, возникающие в языке FORTRAN при применении выражений вида 35.Q.I, которые не содержат целых чисел, помимо обычных правил для целых чисел используется контекстно-зависимое правило:

[0-9]+/"."EQ printf("integer");

    Секция определений может содержать также другие команды, включая таблицу символов, список стартовых условий, соглашения о размерах массивов по умолчанию, содержащиеся внутри самого lex для исходных программ большого размера. Эти возможности описываются в разделе "Формат источника".

[ Содержание ] [ Предыдущая ] [ Следующая ]

c 1998-2000 SoloTony (Antonio Solo) mailto:solotony@mail.ru