Nếu bạn muốn chắc chắn rằng bạn đang phân tích các bình luận C, bạn cần phải đối đầu với mô hình của mình với đặc tả C. C99 §6.4.9 định nghĩa cú pháp của các bình luận như sau:
1. Ngoại trừ trong một hằng ký tự, một chuỗi ký tự hoặc một nhận xét, các ký tự /*
giới thiệu một nhận xét. Nội dung của một nhận xét như vậy chỉ được kiểm tra để xác định các ký tự đa nhân và để tìm các ký tự */
kết thúc nó.
2. Ngoại trừ trong một hằng ký tự, một chuỗi ký tự hoặc một nhận xét, các ký tự //
giới thiệu một nhận xét bao gồm tất cả các ký tự đa dòng cho đến, nhưng không bao gồm, ký tự dòng mới tiếp theo. Nội dung của một nhận xét như vậy chỉ được kiểm tra để xác định các ký tự đa dòng và để tìm ký tự dòng mới kết thúc.
Đây là văn xuôi tiếng Anh, không phải là một định nghĩa chính thức, nhưng có một cách giải thích hợp lý rõ ràng về mặt tự động hữu hạn không xác định (NFA) tiêu thụ một nhận xét:
- Từ trạng thái ban đầu,
/
tiếp theo là*
vào trạng thái bình luận đa dòng và /
tiếp theo là /
vào trạng thái bình luận đơn dòng.
- Từ trạng thái bình luận đa dòng,
*
tiếp theo là/
vào trạng thái bình luận.
- Từ trạng thái bình luận trong một dòng, một dòng mới đi vào trạng thái bình luận.
- Bất kỳ nhân vật khác để lại trạng thái không thay đổi.
Lưu ý rằng để biết liệu trạng thái ban đầu có áp dụng hay không, bạn phải thực hiện phân tích thêm một chút để phát hiện chuỗi ký tự và ký tự.
Khi bạn có NFA, bạn có thể sử dụng các kỹ thuật tiêu chuẩn để xây dựng biểu thức chính quy (tôi không thấy chúng trong các bài viết trên Wikipedia, nhưng chúng nên được thảo luận trong sách giáo khoa).
Nếu bạn đã có một biểu thức chính quy và muốn kiểm tra nó, bạn có thể so sánh ngôn ngữ được tạo với ngôn ngữ được tạo từ NFA được suy ra từ đặc tả ngôn ngữ: sự bình đẳng của các ngôn ngữ thông thường là có thể quyết định. Một cách để quyết định sự bình đẳng là xây dựng một máy tự động xác định tối thiểu cho mỗi loại; nếu các ngôn ngữ là tương đương, các DFA tối thiểu sẽ là đẳng cấu.