Tôi khuyên bạn nên sử dụng start conditions để thay thế.
%x C_COMMENT
"/*" { BEGIN(C_COMMENT); }
<C_COMMENT>"*/" { BEGIN(INITIAL); }
<C_COMMENT>\n { }
<C_COMMENT>. { }
Do lưu ý rằng có phải không được bất kỳ khoảng trắng giữa <condition>
và nguyên tắc.
%x C_COMMENT
xác định trạng thái C_COMMENT và quy tắc /*
bắt đầu. Khi nó bắt đầu, */
sẽ quay trở lại trạng thái ban đầu (INITIAL
được xác định trước) và mọi ký tự khác sẽ chỉ được sử dụng mà không có bất kỳ hành động cụ thể nào. Khi hai quy tắc khớp với nhau, Flex làm mất hiệu lực bằng cách lấy một đối số có kết quả khớp dài nhất, do đó quy tắc chấm không ngăn không cho */
khớp với. Quy tắc \n
là cần thiết vì a dot matches everything except a newline.
Định nghĩa %x
làm C_COMMENT một độc quyền nhà nước, có nghĩa là lexer sẽ chỉ phù hợp với quy tắc được "gắn thẻ" <C_COMMENT>
khi nó đi vào nhà nước.
Đây là một tiny example lexer thực hiện câu trả lời này bằng cách in mọi thứ ngoại trừ những gì bên trong /* comments */
.
Tôi không chắc chắn lý do tại sao bạn không nhận được trận đấu đó, nhưng biểu hiện của bạn sẽ ăn tất cả mọi thứ trong file giữa người đầu tiên "/* "và" */"cuối cùng. Biểu thức của bạn để khớp với nội dung của nhận xét phải loại trừ "* /" khỏi bị tiêu thụ. Một cách để thực hiện việc này: http://flex.sourceforge.net/manual/How-can-I-match-C_002dstyle-comments_003f.html –
cảm ơn, trang web đó hữu ích – adhanlon