Unix Man (Справочное руководство)


FLEX(1) - часть 12


int flag; %% ^a {flag=`a`;ECHO;} ^b {flag=`b`;ECHO;} ^c {flag=`c`;ECHO;} \n {flag=0;ECHO;} magic { switch (flag) { case`a`:printf("first");break; case`b`:printf("second");break; case`c`:printf("third");break; default:ECHO;break; } }

Чтобы решить эту же задачу при помощи стартовых условий, каждое стартовое условие должно быть представлено lex в секции определений строкой

% Start name1 name2...

где условия могут именоваться в любом порядке. Слово Start может быть заменено сокращением s или S. Об условиях можно упомянуть в начале программы, используя угловые скобки. Например, правило:

<name1> expression

распознается, только когда lex находится в стартовом условии name1. Чтобы войти в стартовое условие, надо выполнить оператор действия

BEGIN name1;

который меняет стартовое условие на name1. Для возврата в прежнее положение используйте оператор

BEGIN 0

который устанавливает начальные условия интерпретатора lex. Правило может действовать в нескольких стартовых условиях. Например:

<name1,name2,name3>

является разрешенным префиксом. Любое правило, начинающееся не с префиксной операции, всегда активно.

Пример, аналогичный предыдущему, может быть записан так:

% START AA BB CC %% ^a {ECHO;BEGIN AA;} ^b {ECHO;BEGIN BB;} ^c {ECHO;BEGIN CC;} \n {ECHO;BEGIN 0;} <AA>magic printf("first"); <BB>magic printf("second"); <CC>magic printf("third");

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

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


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

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

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

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




    Начало  Назад  Вперед