2016-03-18 13 views
7

Tôi đang viết một ngôn ngữ lập trình sử dụng Parsec để phân tích cú pháp của nó. Để báo cáo các thông báo lỗi, tôi đã có từng phần tử của cây cú pháp được gắn nhãn với vị trí nguồn của nó, sử dụng hàm getPosition từ the Pos module của Parsec.Parsec: Bắt đầu và kết thúc vị trí nguồn của biểu thức?

Tuy nhiên, nó chỉ cung cấp vị trí bắt đầu của mỗi biểu thức tôi phân tích cú pháp, và tôi muốn bắt đầu và kết thúc, để tôi có thể làm nổi bật toàn bộ vị trí của chúng trong mã nguồn.

Điều đó có thể thực hiện được với parsec không? Có cách nào tiêu chuẩn để nhận được điểm kết thúc của một biểu thức tôi đang phân tích cú pháp, để tôi có thể đưa nó vào AST của tôi không?

+1

tôi recommed nhìn vào "Hare" nó có cùng một vấn đề giải quyết nó với vị trí tương đối. Có lẽ cuộc nói chuyện của Matthew Pickering tại hội nghị skillsmatter2015 có thể cung cấp một số thông tin chi tiết – epsilonhalbe

Trả lời

7

Bạn có thể sử dụng getPosition sau khi phân tích cú pháp.

import Text.Parsec 
import Text.Parsec.String 

spanned :: Parser a -> Parser (SourcePos, SourcePos, a) 
spanned p = do 
    pos1 <- getPosition 
    a <- p 
    pos2 <- getPosition 
    pure (pos1, pos2, a) 

Thử nghiệm:

> parseTest (spanned (many1 (char 'a'))) "aaaaafff" 
((line 1, column 1),(line 1, column 6),"aaaaa") 
Các vấn đề liên quan