2010-01-05 37 views
5

Tôi muốn tạo mã C. Tôi sẽ không được đọc từ một tập tin đầu vào, một dòng tại một thời điểm (ví dụ, một trình biên dịch có thể). Thay vào đó, tôi sẽ phân tích cú pháp đầu vào của người dùng khi nó đến, một dòng tại một thời điểm.Tìm kiếm ví dụ xử lý lỗi ANTLR rất đơn giản khi tạo mã C

Tôi muốn để phát hiện và xử lý đầu vào xấu trong lexer/phân tích cú pháp, ví dụ như

/* lexer tokens */ 
foo : "FOO"; 
bar : "BAR"; 
baz : "BAZ"; 
/* grammar*/ 
grammar : foo "=" BAZ 
     | foo "=" BAR 
     | <some non-existent Antrl-else> : {printf(stderr, "bad input\n");} 
     ; 

OK, nếu tôi không thể bắt nó trong lexer/phân tích cú pháp, nó có vẻ như tôi cần phải sử dụng displayRecognitionError() nhưng bằng cách nào??

Có ai có thể chỉ cho tôi một ví dụ rất đơn giản tạo mã C và hiển thị một số lỗi xử lý đầu vào không hợp lệ không?

Cảm ơn!


Ok, tiền thưởng, yippee!

Nhưng chỉ cho câu trả lời thực sự, hoạt động, với mã thực, đang hoạt động. Không có "phương thức sử dụng X()" mà không có wxample.

+1

FYI: số tiền thưởng đó sẽ trả lời nhiều nhất sau khi hết hạn, bất kể bạn có chấp nhận câu trả lời hay không. –

+1

Có lẽ chủ đề này là trợ giúp: http://markmail.org/message/pumvrybnhvfme5h6#query:rulecatch%20antlr%20c+page:1+mid:3jjjdzbecknrq644+state:results (lưu ý các câu trả lời khác nhau được đăng cho câu hỏi đó!) –

+1

Tôi thấy bạn đang sử dụng printf trong ví dụ của bạn. Là ngôn ngữ bạn đang sử dụng C hoặc C++? – chollida

Trả lời

5

Xử lý một ngoại lệ công nhận trong Java sẽ đi như thế này:

grammar X; 

// ... 

@rulecatch{ 
    catch(RecognitionException rex) { 
    // do something 
    } 
} 

// parser rules 

// lexer rules 

Nói cách khác, chỉ cần thêm một số mã tùy chỉnh C bên trong khối @rulecatch{ ... }.

+0

Bart, tôi nghi ngờ đây là câu trả lời hay nhất mà tôi sẽ nhận được. Tôi sẽ để nó mở trong vài ngày, trong trường hợp ai đó đưa ra một số mã demo C tuyệt vời, sau đó trao cho bạn câu trả lời nếu không. cảm ơn sự giúp đỡ của bạn – Mawg

+1

Không có vấn đề gì. Nếu tôi tìm thấy một thời gian, tôi thậm chí có thể roi lên một bản demo C nhỏ, nhưng C của tôi là gỉ để nói rằng ít nhất! –

+1

Tôi đã nhanh chóng xem xét thời gian chạy C: 'configure'-ing và' make'-ing thời gian chạy cho C và tạo một trình phân tích cú pháp & phân tích cú pháp đã ổn, nhưng viết một ứng dụng nhỏ với phương pháp chính sử dụng lexer & parser này các tập tin không, và tôi không muốn dành nhiều thời gian cho nó, xin lỗi. Tôi hy vọng một người khác có thể đưa cho bạn một bàn tay với nó. Nhưng bạn đã thử những gì tôi đề nghị? Nếu bạn đã thử nhưng thất bại, nó có thể giúp đề cập đến những gì chính xác đã đi sai. Chúc may mắn. –

7

Điều bạn có nhiều khả năng tìm kiếm nhất là chức năng displayRecognitionError(). Hàm này được gọi trong các trường hợp mà bạn quan tâm và là một phần của thời gian chạy C.

Nếu bạn muốn xem ví dụ về cách sử dụng chức năng này, hãy xem this mailing list post. Mặc dù mã này trộn lẫn C và C++, bạn sẽ có thể tìm ra những gì bạn cần từ nó.

+0

Cảm ơn rất nhiều, tôi sẽ kiểm tra. Xin lỗi vì tôi đã chấp nhận câu trả lời; Tôi không mong đợi người khác. – Mawg

+1

Đừng lo - hy vọng rằng nó sẽ giúp bạn –

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