2012-10-17 12 views
5

Jak powinienem wykonać program w lex (lub flex), aby usunąć zagnieżdżone komentarze z tekstu i wydrukować tylko tekst, który nie jest w komentarzach? Prawdopodobnie powinienem jakoś rozpoznać stany, gdy jestem w komentarzu i liczba początkowych "znaczników" komentarza bloku.Usuwanie zagnieżdżonych komentarzy bz lex

Pozwala mieć zasady:
1.block komentarz

/* 
block comment 
*/ 

2. linia komentarz

// line comment 

3. Komentarze mogą być zagnieżdżone.

Przykład 1

show /* comment /* comment */ comment */ show 

Wydajność:

show show 

Przykład 2

show /* // comment 
comment 
*/ 
show 

Wydajność:

show 
show 

Przykład 3

show 
///* comment 
comment 
// /* 
comment 
//*/ comment 
// 
comment */ 
show 

wyjściowa:

show 
show 

Odpowiedz

5

Masz teorię prawo. Oto prosta implementacja; Może zostać ulepszony.

%x COMMENT 
%% 
%{ 
    int comment_nesting = 0; 
%} 

"/*"   BEGIN(COMMENT); ++comment_nesting; 
"//".*   /* // comments to end of line */ 

<COMMENT>[^*/]* /* Eat non-comment delimiters */ 
<COMMENT>"/*" ++comment_nesting; 
<COMMENT>"*/" if (--comment_nesting == 0) BEGIN(INITIAL); 
<COMMENT>[*/] /* Eat a/or * if it doesn't match comment sequence */ 

    /* Could have been .|\n ECHO, but this is more efficient. */ 
([^/]*([/][^/*])*)* ECHO; 
%% 
2

To jest dokładnie to, czego potrzebujesz: yy_push_state(COMMENT) Jego wykorzystuje stos przechowywać nasze stany który jest przydatny w sytuacjach zagnieżdżonych.

0

Obawiam się, że odpowiedź @rici może być błędna. Najpierw musimy zapisać linię nr i później zmienić dyrektywę linii. Drugie podanie open_sign i close_sign. Mamy następujące zasady:

1) using an integer for stack control: push for open sign, popup for close sign 
2) eat up CHARACTER BEFORE EOF and close sign WITHOUT open sign inside 
<comments>{open} {no_open_sign++;} 
<comments>\n {curr_lineno++;} 
<comments>[^({close})({open})(EOF)] /*EAT characters by doing nothing*/ 
3) Errors might happen when no_open_sign down to zero, hence 
<comments>{close} similar as above post 
4) EOF should not be inside the string, hence you need a rule 
<comments>(EOF) {return ERROR_TOKEN;} 

aby uczynić go bardziej wytrzymałe, trzeba także mieć inną bliską regułę checking out stronie

iw praktyce, należy użyć ujemnego wygląd przed i spojrzeć za regularne gramma ekspresyjnego jeśli Twój analizator leksykalny to obsługuje.