Tôi muốn viết trình biên dịch cho ngôn ngữ biểu thị các khối chương trình có khoảng trắng, như trong Python. Tôi thích làm điều này trong Python, nhưng C++ cũng là một lựa chọn. Có một lexer mã nguồn mở có thể giúp tôi làm điều này một cách dễ dàng, ví dụ bằng cách tạo ra các định danh INDENT và DEDENT đúng như Python lexer không? Trình tạo trình phân tích cú pháp tương ứng sẽ là dấu cộng.Lexer nhận ra khối thụt lề
Trả lời
LEPL là Python tinh khiết và hỗ trợ phân tích cú pháp việt vị.
Nếu bạn đang sử dụng một cái gì đó giống như lex, bạn có thể làm theo cách này:
^[ \t]+ { int new_indent = count_indent(yytext);
if (new_indent > current_indent) {
current_indent = new_indent;
return INDENT;
} else if (new_indent < current_indent) {
current_indent = new_indent;
return DEDENT;
}
/* Else do nothing, and this way
you can essentially treat INDENT and DEDENT
as opening and closing braces. */
}
Bạn có thể cần một chút lý bổ sung, ví dụ bỏ qua dòng trống, và để tự động thêm một DEDENT tại kết thúc tệp nếu cần.
Có thể count_indent sẽ tính đến việc chuyển đổi tab thành dấu cách theo giá trị dừng tab.
Tôi không biết về trình tạo lexer/parser cho Python, nhưng những gì tôi đăng sẽ hoạt động với lex/flex và bạn có thể móc nó lên yacc/bison để tạo trình phân tích cú pháp. Bạn có thể sử dụng C hoặc C++ với chúng.
Bạn phải cẩn thận với điều này vì bạn có thể cần phải thêm nhiều thẻ DEDENT vào đầu dòng, chứ không phải chỉ một. Python cho thấy có một ngăn xếp để duy trì điều này. – templatetypedef
- 1. vi thụt lề
- 2. xoá bỏ thụt lề thụt lề với CSS
- 3. Đánh dấu tạo ra thụt lề trong Jekyll/Ruby
- 4. Khoảng trống và thụt lề trong F #
- 5. Thụt lề liên tục Eclipse
- 6. Thụt lề nhiều dòng trong Emacs
- 7. Haskell và Vim: Thụt lề thích hợp
- 8. Bỏ thụt lề trong Netbeans
- 9. Thụt lề JSON trong PHP
- 10. Khó khăn thụt lề Emacs
- 11. Thụt lề thụt đầu dòng với CSS trong Vim
- 12. Thụt lề PythonError: indent không mong muốn
- 13. Thay đổi định dạng thụt lề vim
- 14. thay đổi thụt lề trong emacs ess
- 15. Bảng điều khiển .NET TextWriter hiểu được thụt lề/không liên quan/thụt lề
- 16. Ràng buộc khóa thụt lề Xcode
- 17. Cảnh báo thụt lề Eclipse Eclipse
- 18. Thay đổi thụt lề trong Sass
- 19. Có thể thay đổi cách Xcode thụt lề các khối bình luận không?
- 20. Phím tắt để di chuyển một khối mã trên 4 thụt lề trong IntelliJ IDEA
- 21. Tôi làm cách nào để thụt lề một khối mã trong vim?
- 22. Xóa hình ảnh SWT TreeItem thụt lề
- 23. Mức độ thụt lề trong xmllint
- 24. Thụt lề nhiều dòng: Phím tắt
- 25. Các dòng trống thụt lề (IntelliJ IDEA)
- 26. Thụt lề thông minh Visual Studio?
- 27. Tệp nguồn Java thụt lề bằng Eclipse
- 28. Không thể thụt lề lớp con UITableViewCell
- 29. Tại sao COBOL phải được thụt lề?
- 30. thụt lề thích ứng trong emacs?
Cảm ơn. Điều này có vẻ là công cụ hoàn hảo cho tôi. – Elektito