2016-05-07 10 views
0

Ich möchte Großbuchstaben C Kommentare in einem Text mit Flex.Verwenden Sie flex zu Großbuchstaben C comments

Hier ist meine flex Code:

%{ 
#include <ctype.h> 
%} 

%% 

\/\/.* { 
    for(int i = 0; i < strlen(yytext); i++) 
     printf("%c", toupper(yytext[i])); 
} 

\/\*[^\*]*\*(\*|[^\*\/][^\*]*)*\/ { 
    for(int i = 0; i < strlen(yytext); i++) 
     printf("%c", toupper(yytext[i])); 
} 

%% 

int main(int argc ,char* argv[]) { 
    yylex(); 
    return 0; 
} 

int yywrap() { 
    return 1; 
} 

Hier ist der Testtext:

/*aBc*aBc/aBc*/ 
/** /aBc*/ 
/*aBc*/aBc*/ 
aBc 
aBc/*aBC 
aBc/aBc*aBc 
aBc**/ 
/*aBc/*aBc 
//aBc 
//aBc 
aBc 

Das Ergebnis:

/*ABC*ABC/ABC*/ 
/** /ABC*/ 
/*ABC*/aBc*/ 
aBc 
aBc/*ABC 
ABC/ABC*ABC 
ABC**/ 
/*ABC/*ABC 
//ABC 
//aBc 
aBc 

Die zweite und vierte Zeile von dem Ende in der Ergebnis sind seltsam.

Was ist falsch an meinem Programm?

Antwort

1

Das Problem ist einfach, dass der reguläre Ausdruck, den Sie verwenden, falsch ist.

Hier ist eine korrekte Flex regulären Ausdruck für C-artige Kommentare:

"/*"[^*]*"*"+([^*/][^*]*"*"+)*"/" 

Das doppelte Anführungszeichen (ein Flex-Funktion) verwendet die Regex Metazeichen zu zitieren. Beachten Sie, dass Regex-Operatoren in Zeichenklassen nicht entfernt werden müssen.

Die Alternativen sind nicht sehr hübsch entweder:

  1. Wald von schiefen Holz:

    \/\*[^*]*\*+([^*/][^*]*\*+)*\/ 
    
  2. Clutter von Charakterklassen:

    [/][*][^*]*[*]+([^*/][^*]*[*]+)*[/] 
    
+0

Danke für du antwortest! Ich schreibe die Regex von DFA neu und stelle fest, dass ein "*" fehlt. Hoppla ... Jetzt ist es "\/\ * [^ \ *] * \ * (\ * | [^ \ * \ /] [^ \ *] * \ *) * \ /', die den gleichen Effekt haben können mit der Regex du Wirte. – chaosink

+0

Das Entweichen von Metazeichen wie "*" ist innerhalb von Zeichenklassen optional. – chaosink

+0

@chaosink; Ja, das ist was "nicht notwendig" bedeutet. In Posix Regexes ist es nicht erlaubt, aber Flex ist großzügiger. Ich empfehle jedoch immer dagegen, weil es die Lesbarkeit IMHO nicht verbessert, und Sie könnten irgendwann die Regex in einem Dialekt verwenden wollen, der die Fluchten nicht erlaubt. – rici

Verwandte Themen