Использование UNIX для синтаксического и лексического анализа

       

Состояния Lex


Иногда существует необходимость отслеживать состояние ввода и, в зависимости от состояния, выполнять различные типы замен или действий. Хорошим примером является комментарий в С - если считанные лексемы принадлежат комментарию, то они игнорируются. Поскольку комментарии могут распространяться на несколько строк, необходимо изменять состояние.

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

%s COMMENT %% <COMMENT>. {} <COMMENT>"/*" {} <COMMENT>"*/" { BEGIN INITIAL;} "/* " { BEGIN COMMENT;}

Я хочу обрабатывать все символы, кроме комментариев и ограничителей комментариев, поэтому при обнаружении начала комментария вводится состояние COMMENT. Любой символ в состоянии COMMENT игнорируется до тех пор, пока не будет достигнут конца комментария. Затем восстанавливается начальное состояние. Если бы я хотел начать обработку в режиме COMMENT, следовало бы указать следующие строки:

%{ BEGIN COMMENT; %}

в разделе определений лексических спецификаций.

[ ] [ ] [ ]

[ZEBR_TAG_td ALign="Left" vAlign="TOP">



Содержание раздела