2012-10-17 23 views
5

Tôi nên làm chương trình bằng lex (hoặc flex) để xóa các chú thích lồng nhau khỏi văn bản và in ra văn bản không có trong nhận xét? Tôi có lẽ nên nhận ra các trạng thái khi tôi nhận xét và số lượng bắt đầu "thẻ" của nhận xét khối.Xóa nhận xét lồng nhau bz lex

Cho phép có quy tắc:
1.block bình luận

/* 
block comment 
*/ 

2. Chú thích theo dòng

// line comment 

3. Nhận xét có thể được lồng vào nhau.

Ví dụ 1

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

đầu ra:

show show 

Ví dụ 2

show /* // comment 
comment 
*/ 
show 

đầu ra:

show 
show 

Ví dụ 3

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

đầu ra:

show 
show 

Trả lời

5

Bạn có lý thuyết đúng. Đây là một cách thực hiện đơn giản; có thể được cải tiến.

%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

Đây chính xác là những gì bạn cần: yy_push_state(COMMENT) Nó sử dụng ngăn xếp để lưu trữ trạng thái của chúng tôi có ích trong các tình huống lồng nhau.

0

Tôi sợ rằng câu trả lời của @rici có thể sai. Trước tiên, chúng ta cần ghi lại số dòng và có thể thay đổi tập tin dòng chỉ thị sau. Thứ hai cho open_sign và close_sign. Chúng tôi có nguyên tắc sau:

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

để làm cho nó mạnh mẽ hơn, bạn cũng cần phải có một quy tắc kiểm tra chặt chẽ ra bên

Và trong thực tế, bạn nên sử dụng cái nhìn tiêu cực trước và nhìn về phía sau Gramma biểu thức chính quy nếu máy phân tích từ vựng của bạn hỗ trợ nó.