2011-01-07 38 views
16

Tôi hiểu rằng cú pháp Perl là mơ hồ và sự định hướng của nó là không nhỏ (sometimes involving execution of code during the compile phase). Bất kể, Perl có một ngữ pháp chính thức (mặc dù không rõ ràng và/hoặc bối cảnh nhạy cảm)?Tôi có thể tìm thấy ngữ pháp chính thức cho ngôn ngữ lập trình Perl ở đâu?

+0

Thậm chí nếu, nó cực kỳ lớn. Tại sao bạn cần nó? Nếu bạn muốn thực hành với ngữ pháp, có những lựa chọn thay thế không gây ra cơn đau tim; nếu bạn muốn xây dựng một trình phân tích cú pháp perl/thông dịch viên - hãy vui vẻ, nhưng trước tiên hãy tự hỏi tại sao không ai khác thử;) – delnan

+14

Vâng, đây là regex cho nó: '. *' :-) – paxdiablo

+2

@delnan: Tôi đồng ý, đó là khùng. :) Tôi tò mò vì tôi đang nghiên cứu lý thuyết phân tích cú pháp. Tôi muốn xem một ví dụ về ngữ pháp mơ hồ trong đời thực (thay vì các ngữ pháp đồ chơi trong sách giáo khoa). Tôi cũng muốn thấy ngữ cảnh nhạy cảm với ngữ cảnh thực tế (nếu Perl kết thúc là nhạy cảm về ngữ cảnh). Như với hầu hết mọi thứ về tôi, sự tò mò thường là yếu tố thúc đẩy. :) –

Trả lời

29

Từ perlfaq7

Tôi có thể có được một BNF/yacc/RE cho ngôn ngữ Perl?

Không có BNF, nhưng bạn có thể Paw theo cách của bạn thông qua các ngữ pháp yacc trong perly.y trong việc phân phối nguồn nếu bạn đặc biệt dũng cảm. Ngữ pháp dựa trên mã thông báo rất thông minh, vì vậy hãy chuẩn bị để tham gia vào toke.c .

Trong những lời của Chaim Frenkel: "ngữ pháp Perl không thể được giảm xuống còn BNF Các công việc của phân tích perl được phân phối giữa yacc, lexer, khói và gương.."

Để xem các thiết lập tuyệt vời của ví dụ về TẠI SAO nó khá nhiều gần như không thể phân tích Perl do ảnh hưởng bối cảnh, hãy nhìn vào Randal Schwartz's post: On Parsing Perl

Bên cạnh đó, xin vui lòng xem thảo luận trong "Perl 5 Internals (Chapter 5. The Lexer and the Parser)" bởi Simon Cozens .


Xin lưu ý rằng answer is different for Perl6:

+0

Khói và gương, rực rỡ! –

+0

Tôi bị nhầm lẫn bởi câu nói cuối cùng. Không thử thách nó nhưng chân thành tò mò. Tôi đã được ấn tượng rằng đầu vào để yacc (và trình biên dịch trình biên dịch liên quan) đã thực sự BNF hoặc EBNF hoặc một số biến thể. Đầu ra của nguồn cấp dữ liệu đó vào lexer và cứ như vậy cho đến khi đầu ra được phun ra. Tôi hiểu lầm ở đâu? cảm ơn – jaydel

+0

ah, đã tìm thấy điều này: http://www.perlmonks.org/?node_id=471598 và có một cuộc thảo luận tốt để trả lời câu hỏi của tôi. – jaydel

6

Không có ngữ pháp chính thức theo nghĩa "đây là đặc điểm kỹ thuật của Perl 5 "(TheTuy nhiên, nỗ lựcđang cố khắc phục điều đó). Nhưng có một ngữ pháp chính thức trong mã nguồn Perl 5. Tất nhiên, việc hiểu mã là rất có thể không phải là một công việc tầm thường.

Jeffrey Kegler cũng đã viết một số bài viết hay về ngữ pháp perl trên blog của anh ấy. Cụ thể, xem this postthis one. Phần còn lại của blog có một số suy nghĩ khá thú vị về phân tích cú pháp nói chung là tốt.

+0

+1 cho các liên kết blog – DVK

+0

Để tham khảo của độc giả- Jeffrey Kegler là tác giả của Marpa, mà dường như là trình phân tích cú pháp hiện đại và được đánh giá cao nhất cho Perl (Marpa :: R2); cũng như tác giả của bài viết "Perl không thể được phân tích cú pháp" mà câu trả lời của Joel Berger trích dẫn. – DVK

7

Những người khác đã đăng liên kết này trước đây về các câu hỏi tương tự, nhưng tôi nghĩ điều đó thật thú vị và có ví dụ điển hình: Perl Cannot Be Parsed (A Formal Proof).

Từ liên kết:

[Xem xét] các devilish đoạn sau mã, pha chế bởi Randal Schwartz, và xác định phân tích cú pháp chính xác cho nó:

bất cứ điều gì/25; # /; chết "cái chết này!";

Snippet Schwartz có thể phân tích cú pháp hai cách khác nhau: nếu bất cứ điều gì là nullary (có nghĩa là, không có đối số), báo cáo kết quả đầu tiên là một bộ phận trong khoảng trống bối cảnh, và phần còn lại của dòng là một lời nhận xét . Nếu bất cứ điều gì có một đối , Snippet Schwartz của phân tích như một cuộc gọi đến bất cứ chức năng với kết quả của một nhà điều hành trận đấu, sau đó một cuộc gọi đến chết function().

Điều này có nghĩa rằng, để phân tích cú pháp tĩnh Perl, phải là để xác định từ một chuỗi Perl 5 mã cho dù thiết lập mẫu thử nghiệm vô giá trị cho bất kỳ chương trình con nào .

Tôi chỉ đăng phần này để cho thấy rằng nó thực sự khó thực sự nhanh chóng. Ngoài ra, nhiều trình soạn thảo mã/văn bản có thể làm một công việc đánh dấu cú pháp (mặc dù không bao giờ tuyệt vời) để bạn có thể bắt đầu với những thông số kỹ thuật đó để xem chúng làm gì. Trong thực tế, bạn đã truyền cảm hứng cho tôi, tôi nghĩ rằng tôi sẽ đăng một câu hỏi liên quan yêu cầu những gì biên tập viên nổi bật nhất Perl.

+0

Đó là một ví dụ tuyệt vời! Haha, bạn biết bạn có một ngôn ngữ kỳ lạ khi hành động đơn thuần của * phân tích cú pháp * nó truyền cảm hứng cho mọi người! :) –

+0

Không có nghĩa là bạn không thể phân tích nó; có nghĩa là có các phân tích không rõ ràng. Trường hợp này là thú vị bởi vì nó xuất hiện mà bạn phải có một bảng biểu tượng để lex; điều này đặt ra câu hỏi về việc làm thế nào bạn có thể có một bảng biểu tượng mà không bị lexed? Liệu Perl chỉ phân tích cú pháp dòng khi nó có cần phải thực hiện chúng (mà sẽ cho phép nó để exectue defintion của "bất cứ điều gì" đầu tiên và sau đó exectue dòng này)? Liệu ý nghĩa của dòng này có thay đổi không nếu tôi xác định lại "bất cứ điều gì" trong khi thực hiện, nếu tôi có thể làm điều đó? Vui hơn. –

+0

@IraBaxter, tôi biết nó đã được một thời gian dài, nhưng tôi nghĩ rằng tôi sẽ trả lời. Ví dụ này không phải là ví dụ "không thể chia sẻ". Nếu bạn đọc liên kết có một ví dụ phức tạp hơn nhiều và dường như không thể phân tích cú pháp. –

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