2011-06-24 36 views
8

Tôi đang sử dụng bison + flex để phân tích cú pháp tệp. Lỗi yyerror() được gọi. Làm thế nào tôi có thể nhận được số dòng hoặc chuỗi vi phạm các quy tắc, để in nó với thông báo lỗi?bison/flex: in dòng sai

Trả lời

8

Số dòng là dễ dàng: yylineno là số dòng. Chỉ định %option yylineno ở đầu tệp .l của bạn.

Vâng, gần như dễ dàng. Lookahead đôi khi có thể làm cho số dòng bị tắt bởi một. Thay vì nói điều gì đó như "Lỗi xảy ra ở dòng #xxx", bạn có thể muốn nói rằng lỗi xảy ra gần dòng #xxx.

Theo phần còn lại, tùy thuộc vào bạn. Bạn sẽ phải nắm bắt cú pháp không hoàn toàn hợp lệ và gọi trình xử lý cảnh báo hoặc lỗi thích hợp. Xem cuốn sách "breilly"bison "để biết chi tiết; nó có toàn bộ chương về các thông báo lỗi. Toàn bộ một chương có quá ít để tái sản xuất tại trang web Q & này.

+2

Cảm ơn bạn đã phản hồi nhanh. "Theo như phần còn lại, đó là vào bạn":) tốt, đó là điểm của câu hỏi của tôi - làm thế nào để nắm bắt được dòng vi phạm đó? –

+1

@ user497208: Câu trả lời muộn màng cho câu hỏi cuối cùng của bạn: Bạn (vô tình) yêu cầu tôi viết một cuốn sách hoặc một chương của một cuốn sách. Viết một cuốn sách, hoặc thậm chí một chương hoặc một phần của một cuốn sách, là một chút vượt ra ngoài phạm vi trang web Q & A internet như Stack Overflow. Tôi đã cung cấp tên của một cuốn sách bao gồm chủ đề này một cách chi tiết. Đọc nó! –

2

yylineno mang đến cho bạn lineno được xử lý

Bạn cũng có thể cho phép người dùng biết những gì văn bản cho các lỗi với yytext, ở phía flex:

0|([1-9]{DIG}*) { 
        String msg("some error with number: "); msg.append(yytext); 
        yyerror(msg.c_str()); 
        } 

yytext chỉ chứa văn bản cho phù hợp qui định.

Nếu bạn muốn cung cấp toàn bộ dòng, bạn sẽ phải tự làm điều đó, mở tập tin tìm số dòng yylineno và in nó, một nơi tốt để thực hiện việc đó là cung cấp chức năng của riêng bạn với chức năng yyerror.

Các vấn đề liên quan