Ich schlage vor, dass Sie stattdessen start conditions verwenden.
%x C_COMMENT
"/*" { BEGIN(C_COMMENT); }
<C_COMMENT>"*/" { BEGIN(INITIAL); }
<C_COMMENT>\n { }
<C_COMMENT>. { }
Sie beachten, dass es nicht jedes Leerzeichen zwischen den <condition>
und der Regel sein muss.
%x C_COMMENT
definiert den C_COMMENT-Status, und die Regel /*
startet es. Sobald es gestartet wird, */
wird es zurück in den Ausgangszustand (INITIAL
ist vordefiniert), und alle anderen Zeichen werden nur ohne besondere Maßnahmen verbraucht werden. Wenn zwei Regeln übereinstimmen, unterscheidet sich Flex von demjenigen, der die längste Übereinstimmung aufweist. Daher verhindert die Punktregel nicht, dass */
übereinstimmt. Die \n
Regel ist notwendig, weil .
Die %x
Definition macht C_COMMENT einen exklusiven Zustand, die die Lexer bedeutet nur Regeln übereinstimmen, die „getaggt“ werden <C_COMMENT>
, sobald es den Zustand eintritt.
Hier ist eine tiny example lexer, die diese Antwort implementiert, indem Sie alles drucken, außer was drin ist /* comments */
.
Ich bin mir nicht sicher, warum Sie keine Übereinstimmung gibt, aber Ihr Ausdruck alles in der Datei zwischen dem ersten essen " /*" und der letzte "*/". Ihr Ausdruck, der dem Inhalt des Kommentars entspricht, muss "* /" davon abhalten, konsumiert zu werden. Ein Weg, dies zu tun: http://flex.sourceforge.net/manual/How-can-I-match-C_002dstyle-comments_003f.html –
Danke, diese Seite war hilfreich – adhanlon