Я хочу сделать правило в гибком проводе для потребления комментария c-стиля как/* */
у меня есть следующее
c_comment "/*"[\n.]*"*/"
Но это никогда не становится подобранным. Какая-либо идея, почему? если Вам нужно больше моего кода, сообщенного мне, и я отправлю все это. Благодаря любому, кто отвечает.
Я предлагаю вам использовать начальные условия вместо этого.
%x C_COMMENT
"/*" { BEGIN(C_COMMENT); }
<C_COMMENT>"*/" { BEGIN(INITIAL); }
<C_COMMENT>\n { }
<C_COMMENT>. { }
Обратите внимание, что там не должно быть любым пробелом между <условием>
и правилом.
% X C_Comment
определяет состояние C_COMMENT, и правило / *
начнется. Как только это началось, * /
будет вернуться к начальному состоянию ( начальный
, предварительно определен), и все другие символы будут просто потреблены без каких-либо конкретных действий. Когда два правила совпадают, Flex Rambugrates, принимая тот, который имеет самый длинный матч, поэтому правило точечного не предотвращается * /
. Правило \ N
необходимо, потому что точка соответствует всему, кроме новой строки .
Определение % x [1187009] составляет исключительное состояние
, что означает, что лексера будет соответствовать только правилам, которые «помечены»
. штат.
Вот крошечный пример лексера , который реализует этот ответ, печатая все, кроме того, что находится внутри / * Комментарии * /
.
Не уверены, почему он не поднимается, но я знаю, что шаблон такого рода может производить большие лексические элементы. Более эффективно обнаруживать только начальный комментарий и бросить все в BitBucket, пока не найдете конечный маркер.
Этот сайт имеет код, который сделает это:
"/*" {
for (;;) {
while ((c = input()) != '*' && c != EOF)
; /* eat up text of comment */
if (c == '*') {
while ((c = input()) == '*')
;
if (c == '/')
break; /* found the end */
}
if (c == EOF) {
error ("EOF in comment");
break;
}
}
}