2009-09-17 46 views
6

Tôi mới dùng trình phân tích cú pháp và tôi tự hỏi ngữ pháp ANTLR cho một ngôn ngữ nhúng như JSP/ASP/PHP trông như thế nào, nhưng tiếc là trang ANTLR không cung cấp bất kỳ tệp ngữ pháp nào như vậy.Làm thế nào để viết một trình phân tích cú pháp ANTLR cho JSP/ASP/PHP như các ngôn ngữ?

Chính xác hơn tôi không biết chính xác cách xác định mã thông báo AnyText khớp với mọi thứ (bao gồm các từ khóa không có ý nghĩa bên ngoài khối mã) và vẫn có thể nhận ra chúng một cách chính xác bên trong các khối.

Ví dụ: đoạn mã sau đây phải được mã hóa như sau: AnyText, BlockBegin, Keyword, BlockEnd, AnyText.

lorem ipsum KEYWORD dolor sit <% KEYWORD %> amet 

Có thể cũng có một trình tạo trình phân tích cú pháp khác phù hợp hơn với nhu cầu của tôi. Tôi đã chỉ cố gắng ANTLR cho đến bây giờ, vì phổ biến rộng rãi của nó ở đây tại stackoverflow :)

Rất cám ơn trước!

+1

Bất kỳ may mắn nhận được làm việc này – etheros

Trả lời

3

Tôi không thể nói cho ANTLR, vì tôi sử dụng trình phân tích cú pháp/phân tích cú pháp khác nhau (DMS Software Reengineering Toolkit, mà tôi đã phát triển chính xác các trình phân tích cú pháp/trình phân tích cú pháp và JSP như vậy. Tuy nhiên, ý tưởng cơ bản là lexer cần các chế độ từ vựng để nhận ra khi bạn đang chọn "bất kỳ văn bản" nào và khi bạn đang xử lý văn bản ngôn ngữ lập trình "thực", Vì vậy, bạn cần một chế độ từ vựng bắt đầu, hãy nói HTML, công việc của họ là hấp thụ văn bản HTML và khi nó bắt đầu chuyển đổi sang PHP, hãy chuyển đổi chế độ. e khi gặp phải các ký tự chuyển tiếp. Dưới đây là một phác thảo:

%%HTML -- mode 
#token HTMLText "~[]* \< \% " 
    << (GotoPHPMode) >> 

%%PHP -- mode 
#token KEYWORD "KEYWORD" 
... 
#token '%>' "\%\>" 
    << (GotoHTMLMode) >> 

phát lexer của bạn có thể có một số loại khả năng chế độ chuyển đổi mà bạn sẽ phải sử dụng thay vì điều này. Và bạn có thể sẽ thấy rằng lexing những thứ HTML là phức tạp hơn nó trông (bạn phải lo lắng về < thẻ SCRIPT và rất nhiều thứ HTML điên khác, nhưng đó là chi tiết Tôi đoán bạn có thể xử lý.

+0

Rất cám ơn cho trả lời của bạn Việc chuyển đổi chế độ sức mạnh?. thực sự là một giải pháp , mặc dù nó vẫn còn một chút vấn đề với ANTLR, bởi vì chỉ có lexer nên được chuyển đổi và trình phân tích cú pháp phải giữ nguyên. (Nếu không, sẽ khó phân tích những thứ như "<% for ... %> AnyText <% endfor %>"). Giải pháp đơn giản nhất mà tôi khám phá là sử dụng boost :: spirit. Ở đó, lexer được gọi bởi trình phân tích cú pháp và do đó bạn đơn giản có thể viết bao nhiêu quy tắc bao gồm anychar_p như bạn muốn, mà không cần chuyển đổi chế độ. – tux21b

1

tôi đã đi qua dự án này http://code.google.com/p/phpparser/ mà cũng chứa một tập tin văn phạm ANTLR cho phân tích cú pháp PHP:. http://code.google.com/p/phpparser/source/browse/grammar/Php.g

Hope this helps

+0

Tôi đã quản lý để làm điều đó trong goyacc với một lexer tùy chỉnh mà toggles chế độ lexing của nó bất cứ khi nào nó gặp một thẻ bắt đầu/kết thúc. Nhưng cảm ơn nhiều cho liên kết của bạn anyway, tôi sẽ xem xét nó quá :) – tux21b

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