.
в lex и flex соответствует любому символу , за исключением новых строк .Так как ваш текст может содержать новые строки, вам нужно будет использовать (.|\n)*
вместо .*
.
Однако это не единственная ваша проблема - по крайней мере, если ваш ввод может содержать более одногозащищенный блок.Как правило, ваше правило будет соответствовать чему-либо вплоть до последней pragma protect end_protected
строки, потому что lex и flex всегда соответствуют как можно большему количеству входных данных для данного правила.Таким образом, если у вас есть два защищенных блока, они будут рассматриваться как один блок.Поскольку ни в lex, ни в flex нет концепции жадности, вы не можете это исправить, изменив само регулярное выражение.
Вместо этого вы можете использовать условия запуска .При таком подходе у вас будет одно регулярное выражение, соответствующее началу защищенного блока, что изменит начальное условие на PROTECTED
, а затем правило для конца блока, которое восстанавливает условие по умолчанию.