2012-10-17 14 views
5

Come si deve eseguire un programma in lex (o flex) per rimuovere commenti nidificati dal testo e stampare solo il testo che non è nei commenti? Probabilmente dovrei in qualche modo riconoscere gli stati quando sono in commento e il numero di "tag" iniziali del commento di blocco.Rimozione di commenti nidificati bz lex

Consente di avere regole:
1.block commento

/* 
block comment 
*/ 

2. riga di commento

// line comment 

3. I commenti possono essere nidificati.

Esempio 1

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

uscita:

show show 

Esempio 2

show /* // comment 
comment 
*/ 
show 

uscita:

show 
show 

Esempio 3

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

uscita:

show 
show 

risposta

5

Hai la teoria giusta. Ecco una semplice implementazione; può essere migliorato.

%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

Questo è esattamente quello che vi serve: yy_push_state(COMMENT) suoi usi una pila per memorizzare i nostri stati, che viene portata di mano in situazioni nidificate.

0

Ho paura che la risposta di @rici potrebbe essere sbagliata. Per prima cosa dobbiamo registrare la riga no e in seguito modificare la direttiva del file. Secondo dando open_sign e close_sign. Abbiamo seguenti principi:

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;} 

per renderlo più robusto, è anche necessario avere un altro vicino regola controllo fuori lato della

E in pratica, è necessario utilizzare aspetto negativo prima e guardare dietro regolare gramma espressione se il tuo analizzatore lessicale lo supporta