Я предлагаю вам использовать условия запуска .
%x C_COMMENT
"/*" { BEGIN(C_COMMENT); }
<C_COMMENT>"*/" { BEGIN(INITIAL); }
<C_COMMENT>\n { }
<C_COMMENT>. { }
Обратите внимание, что не должно быть пробелом между <condition>
и правилом.
%x C_COMMENT
определяет состояние C_COMMENT, и правило /*
имеет его начало. После запуска */
вернет его в исходное состояние (предварительно определено INITIAL
), а все остальные символы будут просто использованы без каких-либо особых действий. Когда два правила совпадают, Flex устраняет неоднозначность, беря то, которое имеет самое длинное соответствие, поэтому правило точки не препятствует совпадению */
. Правило \n
необходимо, потому что точка соответствует всему, кроме новой строки .
Определение %x
делает C_COMMENT исключительным состоянием , что означает, что лексер будет соответствовать правилам, которые «помечены» <C_COMMENT>
, только когда он войдет в состояние.
Вот крошечный лексер , который реализует этот ответ, печатая все, кроме того, что внутри /* comments */
.