Состояния Lex
Иногда существует необходимость отслеживать состояние ввода и, в зависимости от состояния, выполнять различные типы замен или действий. Хорошим примером является комментарий в С - если считанные лексемы принадлежат комментарию, то они игнорируются. Поскольку комментарии могут распространяться на несколько строк, необходимо изменять состояние.
Состояние определяется с помощью ключевых символов %s. При определении зависимых от состояния правил необходимо указывать в угловых скобках определенное состояние перед регулярным выражением. При объявлении состояния, по умолчанию оно рассматривается неактивным. Например:
%s COMMENT %% <COMMENT>. {} <COMMENT>"/*" {} <COMMENT>"*/" { BEGIN INITIAL;} "/* " { BEGIN COMMENT;}
Я хочу обрабатывать все символы, кроме комментариев и ограничителей комментариев, поэтому при обнаружении начала комментария вводится состояние COMMENT. Любой символ в состоянии COMMENT игнорируется до тех пор, пока не будет достигнут конца комментария. Затем восстанавливается начальное состояние. Если бы я хотел начать обработку в режиме COMMENT, следовало бы указать следующие строки:
%{ BEGIN COMMENT; %}
в разделе определений лексических спецификаций.
[ ] [ ] [ ]