Ich schlage vor, Sie verwenden Startbedingungen stattdessen.
%x C_COMMENT
"/*" { BEGIN(C_COMMENT); }
<C_COMMENT>"*/" { BEGIN(INITIAL); }
<C_COMMENT>\n { }
<C_COMMENT>. { }
Bitte beachten Sie, dass es darf nicht ein beliebiges Leerzeichen zwischen den <condition>
und die Regel.
%x C_COMMENT
definiert den Zustand C_COMMENT, und die Regel /*
lässt ihn starten. Sobald er gestartet ist, */
kehrt es in den Ausgangszustand zurück ( INITIAL
ist vordefiniert), und alle anderen Zeichen werden einfach ohne eine besondere Aktion konsumiert. Wenn zwei Regeln übereinstimmen, nimmt Flex diejenige, die am längsten übereinstimmt, so dass die Punktregel nicht verhindert, dass */
von Matching. Die Website \n
Regel ist notwendig, weil ein Punkt entspricht allem außer einem Zeilenumbruch .
En %x
Definition ist C_COMMENT ein exklusiver Staat was bedeutet, dass der Lexer nur auf Regeln passt, die "getaggt" sind <C_COMMENT>
sobald es den Staat betritt.
Hier ist ein kleines Beispiel Lexer die diese Antwort umsetzt, indem sie alles ausgibt, außer dem, was darin steht /* comments */
.