2011-12-05 65 views
12

Tôi đang cố gắng tìm hiểu cách sử dụng Parsec để viết trình phân tích cú pháp Delphi, nhưng tôi gặp khó khăn khi xác định LanguageDef.Cách xác định nhiều loại khối chú thích trong Parsec

Trong Delphi, có hai loại khối nhận xét, (* comments *){ comments }. Nhưng các loại bình luậnBắt đầu & nhận xétEnd của LanguageDef là String, không phải [String], vì vậy tôi chỉ có thể đặt trong một hoặc khác.

Vì vậy, tôi đã cố gắng tạo trình phân tích cú pháp không gian trắng của riêng mình, nhưng tôi không chắc chắn tôi có thể chuyển nó vào makeTokenParser hay không.

Mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn


John và Chris đã giúp tôi hiểu và nhận được xung quanh vấn đề này, nhưng các giải pháp liên quan đến việc thay thế một số lượng lớn các phân tích cú pháp mà makeTokenParser cung cấp, vì vậy nó không chính xác mong muốn.

Tôi sẽ đăng lại nếu tôi có thể tìm được giải pháp tốt hơn.

+0

Tôi biết điều này không trả lời câu hỏi của bạn, nhưng Mike Lischke thực hiện một phân tích cú pháp nguồn delphi mở và lexer, được gọi là [DCC] (http://www.soft-gems.net/index.php?option=com_content&task=view&id=25&Itemid=33). –

Trả lời

5

Việc đọc tệp Text.ParserCombinators.Parsec.Language của tôi là điều này không thể thực hiện trực tiếp bằng cách sử dụng LanguageDef.

Tôi tin rằng bạn đang đi đúng hướng để viết trình phân tích cú pháp whiteSpace của riêng bạn. Để sử dụng thành công, bạn cần phải ghi đè trình phân tích cú pháp whiteSpace được tạo bởi makeTokenParser. TokenParser được tạo bởi makeTokenParser là một bản ghi với mỗi trường có chứa một trình phân tích cú pháp. Chúng ta có thể tạo ra một bản sao mới của kỷ lục với một trong những lĩnh vực thay thế như sau:

-- ask GCHi for the type actual type signature constraints 
-- Type sig is approx. fixWhiteSpace :: TokenParser -> Parser -> TokenParser 
fixWhiteSpace originalTokenParser myWhiteSpaceParser = 
    originalTokenParser {whiteSpace = myWhiteSpaceParser} 
+0

Tôi đã thử một cách nhanh chóng, nó có vẻ không hoạt động, nhưng tôi có thể làm điều gì đó sai trái. Tôi sẽ dành nhiều thời gian hơn cho nó. Chỉ cần xác nhận, nếu có một trình phân tích cú pháp khác trong 'originalTokenParser' được định nghĩa với' whiteSpace' ban đầu, trình phân tích cú pháp này có tự động sử dụng 'myWhiteSpaceParser' khi tôi đã áp dụng' fixWhiteSpace' không? – ePak

+1

@epak: Không. Tất cả các giá trị đều không thay đổi, do đó việc xác định "newParser = fixWhiteSpace blach" không ảnh hưởng đến originalTokenParser. –

+0

@ChrisKuklewicz: Cảm ơn bạn đã thanh toán bù trừ cho tôi và thực tế đó là vấn đề cơ bản. Trình phân tích cú pháp 'lexeme' được định nghĩa theo' whiteSpace' và nhiều phân tích cú pháp hơn, bao gồm cả 'identifier', được định nghĩa theo' lexeme'. Khi tôi đã thay thế trình phân tích cú pháp 'identifier' bằng định nghĩa' lexeme' và 'whiteSpace' như @John được đề xuất, nó sẽ xử lý nhiều loại khối bình luận. – ePak

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