2010-02-08 41 views
23

Lời mở đầu: Mặc dù bộ ngôn ngữ được phân tích cú pháp (ngữ pháp không có ngữ cảnh) lớn hơn máy quét (ngữ pháp thông thường), hầu hết các trình tạo trình phân tích cú pháp đều cần một máy quét.Trình tạo phân tích cú pháp không cần quét

(Xin đừng cố giải thích lý do đằng sau nó, tôi biết chúng khá rõ).

Tôi đã nhìn thấy phân tích cú pháp, mà không đòi hỏi phải có máy quét như

Có một số lợi thế nhất định khi sử dụng không có máy quét:

  • Chỉ cần một khái niệm (văn phạm tiếng bối cảnh miễn phí) thay vì hai
  • Parse nhiều ngôn ngữ trong một tập tin (như HTML/Javascript)
  • ngôn ngữ Parse không có từ khóa dành riêng (như PL/1)

Thông thường, "cách giải quyết" được sử dụng như chuyển máy quét theo yêu cầu của trình phân tích cú pháp.

Câu hỏi: Bạn có biết bất kỳ trình tạo trình phân tích cú pháp không cần quét nào khác (bất kỳ ngôn ngữ nào) không? Những thực tế này có được sử dụng (hoặc hoàn toàn là học thuật) không? Có cách tiếp cận nào khác hơn Tomita/GLR không?

Đáp:

+0

Một vài chi tiết khác "Trình phân tích cú pháp từ trái sang phải từ phải sang trái" được liệt kê tại đây http://en.wikipedia.org/wiki/Comparison_of_parser_generators#Context-free_languages ​​ – stacker

+0

@stacker: Wikipedia liệt kê từ vựng của DParser là "được tạo ra"; Và GLR không ngụ ý không có máy quét – Meinersbur

+0

Tôi không hiểu tại sao một máy quét sẽ là một trở ngại cho nhiều ngôn ngữ hoặc ngôn ngữ mà không có từ khóa dành riêng. Máy quét sẽ vẫn hữu ích để ăn các khoảng trắng và các bình luận (ít nhất là thường xuyên), và ghép các ký tự thành các số và các từ. –

Trả lời

10

Hai người khác:.

  • của Bryan Ford Parsing Biểu ngữ pháp (PEG) không cần máy quét. Hiệu quả, lười biếng "packrat phân tích cú pháp" là tùy chọn. Tôi đã không có gì, nhưng kinh nghiệm tốt với phiên bản Lua LPEG, mà biên dịch cho một máy bytecode hiệu quả. Khá thực tế.

  • YAKKER trông rất hấp dẫn mặc dù vẫn rõ ràng ở trạng thái tiền phát hành.Họ đang sử dụng những gì họ cho là một biến thể hiệu quả trong thuật toán phân tích cú pháp của Earley.

Tôi thực sự là một fan hâm mộ lớn của các trình phân tích cú pháp không cần quét; họ đơn giản hóa cấu hình rất nhiều. Và máy phát quét điển hình, để đặt nó nhẹ nhàng, không có nhiều thú vị để sử dụng. Từ trang người đàn ông cho Lex:

The asteroid to kill this dinosaur is still in orbit.

Cuối cùng, tôi không có kinh nghiệm cá nhân với Elkhound, nhưng các báo cáo cũ tôi nghe rất ấn tượng. Tôi sẽ nói rằng không có câu hỏi nhưng rằng một số trình tạo phân tích cú pháp không cần quét là rất thực tế.

3

boost::spirit::qi không cần một lexer mặc dù bạn có thể sử dụng boost::spirit::lex như một front-end. Từ sự ra đời của boost::spirit::lex:

Trong thực tế, Spirit.Qi cho phép bạn viết parsers mà không sử dụng một lexer, phân tích dòng nhân vật đầu vào trực tiếp, và cho hầu hết các phần này là cách Spirit có được sử dụng kể từ phát minh của nó.

boost::spirit (bản gốc) thực sự hoạt động như bạn muốn chính xác nhưng đã được chuyển đến boost::spirit::classic.spirit::qi, spirit::lex là thiết kế mới của tinh thần, vì vậy tôi đã rời phiên bản cổ điển ra :)

9

Máy tạo phân tích cú pháp không cần máy quét. Nhưng bạn khá điên rồ nếu bạn không sử dụng.

Trình phân tích cú pháp được tạo bởi trình tạo trình phân tích cú pháp không quan tâm đến những gì bạn cung cấp cho chúng, miễn là bạn gọi chúng là mã thông báo.

Để xây dựng sử dụng trình tạo trình phân tích cú pháp không có máy quét, chỉ cần xác định ngữ pháp của bạn xuống cấp độ ký tự và cấp các ký tự riêng lẻ cho trình phân tích cú pháp dưới dạng mã thông báo.

Lý do điều này là điên rồ là phân tích cú pháp là một hoạt động phức tạp hơn là lexing. Bạn có thể xây dựng các lexers như các máy trạng thái hữu hạn, nó dịch thành mã máy khá nhiều là "so sánh và nhảy tới trạng thái tiếp theo". Đối với tốc độ, đó là thực sự khó khăn để đánh bại. Trình phân tích cú pháp tạo các trình phân tích cú pháp phân tích cú pháp dự đoán gốc (cho hầu hết các máy phát LL như ANTLR) hoặc tra cứu bảng bằng cách băm, tìm kiếm nhị phân hoặc tuyến tính, v.v. tính cách.

Nếu bạn nạp các ký tự vào một trình phân tích cú pháp làm mã thông báo, khi đó nó sẽ chi tiêu nhiều năng lượng tương ứng trên ký tự hơn so với từ khóa tương đương. Nếu bạn xử lý rất nhiều văn bản đầu vào, điều này cuối cùng sẽ quan trọng, cho dù bạn làm điều đó cho hàng nghìn luồng đầu vào nhỏ hoặc một vài luồng thực sự lớn.

Trình phân tích cú pháp GLR không có trình quét bị vấn đề về hiệu năng này, liên quan đến trình phân tích cú pháp GLR được thiết kế để sử dụng mã thông báo.

Công ty của tôi xây dựng một công cụ, the DMS Software Reengineering Toolkit sử dụng trình phân tích cú pháp GLR (và phân tích cú pháp thành công tất cả các ngôn ngữ chung bạn biết và rất nhiều trình soạn thảo không phù hợp, vì nó có trình phân tích cú pháp GLR). Chúng tôi biết về các trình phân tích cú pháp không cần quét và đã chọn không triển khai chúng vì sự khác biệt về tốc độ; chúng tôi có một hệ thống con giống như LEX (nhưng cực kỳ mạnh) theo kiểu cổ điển để xác định các thẻ từ vựng. Trong trường hợp DMS đi ngược mũi với công cụ dựa trên XT (một công cụ có trình phân tích cú pháp GLR không cần trình quét) dựa trên cùng một đầu vào, DMS xuất hiện nhanh gấp 10 lần gói XT. Để công bằng, thử nghiệm được thực hiện là đặc biệt và không lặp đi lặp lại, nhưng vì nó phù hợp với sự nghi ngờ của tôi, tôi thấy không có lý do gì để lặp lại nó. YMMV. Và tất nhiên, nếu chúng ta muốn đi không quét, thì, khá dễ dàng để viết một ngữ pháp với các thiết bị đầu cuối ký tự, như tôi đã chỉ ra.

GLR Trình phân tích cú pháp không cần quét do có một thuộc tính rất đẹp khác không quan trọng đối với hầu hết mọi người. Bạn có thể lấy hai ngữ pháp riêng biệt cho một trình phân tích cú pháp không cần quét, và nghĩa là nối chúng lại, và vẫn nhận được một trình phân tích cú pháp (thường có rất nhiều sự mơ hồ). Điều này rất quan trọng khi bạn đang xây dựng một ngôn ngữ được nhúng vào một ngôn ngữ khác. Nếu đó không phải là những gì bạn đang làm, đây chỉ là một sự tò mò học thuật.

Và, AFAIK, Elkhound không phải là máy quét. (Tôi có thể sai về điều này). (EDIT: 2/10: Hình như tôi đã sai sẽ không phải là lần đầu tiên trong đời của tôi :)

+0

Cảm ơn câu trả lời của bạn, đặc biệt là để báo cáo về trải nghiệm của bạn từ ngành. Lưu ý rằng chênh lệch tốc độ tuyến tính không phải là điểm chấp lớn. Nếu không thì không ai có thể viết máy quét bằng ngôn ngữ kịch bản. Nhưng GLR có thể dẫn đến hiệu suất phi tuyến tính trên các ngữ pháp yêu cầu lookahead không bị chặn (O (n³)), giống như mã thông báo nhận dạng. Nếu các trình phân tích cú pháp có thể xử lý các thẻ với độ phức tạp tuyến tính (và có các khái niệm để thực hiện việc này), tại sao phải viết một máy quét? – Meinersbur

+0

Elkhound không có trình quét: http://scottmcpeak.com/elkhound/sources/elkhound/examples/scannerless/ – Meinersbur

+0

@Meinersbur: Tôi không hiểu ý của bạn. Dường như bạn đang nói rằng các trình phân tích cú pháp không cần quét đi phi tuyến khi cố gắng xử lý các định danh; điều đó sẽ gợi ý bạn đồng ý rằng việc sử dụng trình phân tích cú pháp không cần quét không phải là một ý tưởng hay. Nhưng sau đó bạn nói, "tại sao bận tâm để viết một máy quét?". Tôi đã bỏ lỡ cái gì? –

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