2011-08-01 37 views
5

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

4

LEPL là Python tinh khiết và hỗ trợ phân tích cú pháp việt vị.

+0

Cảm ơn. Điều này có vẻ là công cụ hoàn hảo cho tôi. – Elektito

1

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.

+4

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

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