2012-10-17 14 views
5

İç içe geçmiş yorumları metinden kaldırmak için nasıl bir program yazmalıyım (veya esnek) ve yalnızca yorumlarda bulunmayan metni yazdırmalıyım? Muhtemelen bir şekilde yorumda bulunduğumda durumları tanımalıyım ve blok yorumunun "etiketlerini" başlatma sayısı.Yuvalanmış yorumların kaldırılması bz lex

kuralları var Lets:
1.block comment

// line comment 

3. Yorumlar iç içe geçebilir

/* 
block comment 
*/ 

2. satırlık açıklama.

Örnek 1

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

çıkışı:

show show 

Örnek 2

show /* // comment 
comment 
*/ 
show 

çıkışı:

show 
show 

Örnek 3

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

çıkışı:

Haklısınız teorisi var
show 
show 

cevap

5

. İşte basit bir uygulama; geliştirilebilir.

%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

Bu, tam olarak budur: yy_push_state(COMMENT) Onun iç içe durumlarda kullanışlı geliyor bizim durumlarını saklamak için bir yığın kullanır.

0

@rici'nin yanıtının yanlış olabileceğinden korkuyorum. Öncelikle satır numarasını kaydetmemiz gerekiyor ve daha sonra hattı hattını değiştirebiliriz. İkinci olarak open_sign ve close_sign. Biz şu ilkemiz vardır:

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

daha sağlam hale getirmek için, ayrıca

Ve pratikte

tarafı başka yakın kontrol kuralını dışarı olması gerekir, daha önce negatif görünüm kullanabilir ve düzenli ifade gramma arkasında görünmelidir eğer sözel analizciniz bunu destekliyorsa.

İlgili konular