2010-06-10 31 views
5

Folks Tôi đang thực hiện một điều kỳ lạ, tôi phải viết một tiện ích để phân tích cú pháp sơ đồ cú pháp ở định dạng văn bản thuần tuý và chuyển đổi thành định dạng xml, điều cơ bản giống hệt với điều này từ IBM (như trong phần "Tạo công việc không chuyển đổi"): http://publib.boulder.ibm.com/infocenter/idshelp/v10/index.jsp?topic=/com.ibm.sqls.doc/sqls17.htm Trình phân tích cú pháp/lexer điển hình như ANTLR/yacc/bison dường như không thể xử lý loại nội dung này, một ý tưởng tôi có là chuyển đổi sơ đồ cú pháp thành ký tự bitmap và định nghĩa một số hàm như more_up, move_down, left, right hoặc như vậy để duyệt toàn bộ sơ đồ để mô phỏng quá trình hiểu như mắt thường của con người. Tho nghe có vẻ không đủ thành thạo, tôi không tìm ra cách tiếp cận nào tốt hơn. Có ai từng chơi với một kịch bản tương tự không? Có lẽ bạn có thể vui lòng làm sáng tỏ điều này.Ý tưởng phân tích biểu đồ cú pháp ký tự

Cảm ơn bạn trước!

Trả lời

1

Ý tưởng "lưới ký tự" để truy cập các ký tự đơn có vẻ giống như bước nền tảng; câu trả lời khác cho thấy cách làm điều đó tốt. Bây giờ bạn có thể truy cập vào lưới một cách ngẫu nhiên và theo các đường ngang hoặc dọc một cách dễ dàng.

Vấn đề thực sự là bạn muốn xây dựng một biểu đồ đại diện cho những gì lưới ký tự nói. Biểu đồ như vậy sẽ bao gồm (duh), các nút, vòng cung và chú thích.

Có lẽ điều dễ thấy nhất là các nút, có thể được chỉ ra (xem câu trả lời khác) bằng các ký tự đại diện cho các điểm phân nhánh trong biểu đồ (ví dụ: +). Mỗi cung sẽ là một chuỗi các characaters dẫn đến một khúc quanh trong vòng cung hoặc đến một nút khác. Sau chuỗi ký tự như vậy nên được khá straighforward (:-)) và có thể sản xuất một chuỗi đại diện cho vòng cung ngay cả khi nó có uốn cong trong đó.

Bạn có thể muốn liệt kê tất cả các nút (chỉ cần quét mảng). Node chú thích phải hợp lý được gần đó và bạn chỉ có thể quét một chút rạng rỡ xung quanh các vị trí nút.

Bạn sẽ muốn liệt kê từng vòng cung rời khỏi nút và thu thập chuỗi biểu thị vòng cung.

Tôi sẽ cung cấp chuỗi vòng cung cho một lexer để xé toạc nó ra; nó có thể có nội dung thú vị (ví dụ: chú thích như trong chuỗi ký tự nội tuyến).

Tại thời điểm này, bạn có các nút và vòng cung có các chú thích được liên kết. Việc xây dựng biểu đồ tương ứng từ các biểu đồ này sẽ khá dễ dàng.

+0

Ira, cách tiếp cận làm cho cảm giác hoàn hảo, trong khi một cái gì đó khác có vẻ cần phải được xem xét là tốt. Giống như một số vòng cung không di chuyển topo (chúng ngụ ý các tham số tùy chọn hoặc bắt buộc), và do đó trình phân tích cú pháp phải hợp lý nếu nút hiện tại nằm trên nhánh chính hoặc nhánh bên, hoặc chiều sâu lồng nhau. Cảm giác của tôi là đi qua các nút từ trái sang phải sẽ yêu cầu ít nỗ lực hơn, mã hóa để tìm ra những ... – Ripley

+0

"Một số chi tiết còn lại như một bài tập cho người đọc": -} –

2

Tôi chưa bao giờ làm bất cứ điều gì như thế trước đây, nhưng đây là cách tôi sẽ tiếp cận nó.

Trước tiên, tôi muốn bắt đầu với một cái gì đó như thế này:

class CharGrid(object): 
    def __init__(self, text): 
     self.lines = text.split('\n') 

    def __getitem__(self, pos): 
     try: 
      col, row = pos 
     except (TypeError, ValueError): 
      raise KeyError('%r not a 2-tuple' % (pos,)) 
     if row >= len(self.lines): 
      return ' ' 
     line = self.lines[row] 
     if col >= len(line): 
      return ' ' 
     return line[col] 

để tôi có thể truy cập vào các nhân vật trong văn bản thông qua tọa độ 2D:

grid = CharGrid("""Creating a No-Conversion Job 

>>-onpladm create job--job--+--------------+-- -n---------------> 
          '- -p--project-' 

>-- -d--device-- -D--database-- -t--table-----------------------> 

    .---------------------------------------------------------------------. 
    V                  | 
>----+-----------------------------------------------------------------+-+->< 
    |               (1) | 
    '-+-------------+--+-------------+--| Setting the Run Mode |------' 
     '- -S--server-' '- -T--target-' 
""") 

print ''.join((grid[0,0], grid[1,0], grid[2,0])) 
print ''.join((grid[0,2], grid[1,2])) 

(năng suất)

Cre 
>> 

Sau đó, tác vụ sẽ chuyển đổi lưới ô vuông 2D thành các chuỗi ký tự 1D:

  1. đọc nhãn ra khỏi dây chuyền đầu tiên
  2. quét xuống cột đầu tiên cho đến khi bạn tìm >>
  3. quét ngay từ vị trí hiện tại cho đến khi bạn tìm thấy [những gì]

... vv Theo dõi biểu đồ theo thứ tự nhãn cầu.

Khi bạn có chuỗi ký hiệu 1D, bạn có thể sử dụng kỹ thuật phân tích cú pháp thông thường trên đó.

+0

Matt, cảm ơn mã khá gọn gàng, có một vài điều tôi vẫn cần xem xét như là hợp lý với tham số tùy chọn/bắt buộc và xác định tên/giá trị tham số, lớp học của bạn là một khởi đầu tốt :) – Ripley

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