2012-09-11 20 views
6

Tôi đang thử nghiệm với Trifecta để phân tích cú pháp một ngôn ngữ hàm rất đơn giản với cú pháp bố cục giống như Haskell. Tôi đang làm việc với các tài liệu Haddock và kinh nghiệm của tôi với Parsec, bởi vì tôi không thể tìm thấy bất kỳ tài liệu giới thiệu nào về Trifecta.Sử dụng trình phân tích cú pháp bố cục của Trifecta

Sự cố mà tôi đang gặp phải là sử dụng nội dung bố cục, vì ngay cả tài liệu Haddock cũng không giúp được gì nhiều.

Với đoạn mã sau:

import Text.Trifecta 
import Text.Trifecta.Parser.Token.Style 
import Text.Trifecta.Parser.Identifier.Style 
import Text.Trifecta.Layout.Combinators 
import Text.Trifecta.Language.Prim 

import Control.Applicative 
import Control.Monad.Trans 
import Data.Maybe (fromMaybe) 

import Data.HashSet as HashSet 
import Data.ByteString.UTF8 as UTF8 

-- Copypasta from Text.Trifecta.Parser.Identifier.Style 
set :: [String] -> HashSet ByteString 
set = HashSet.fromList . fmap UTF8.fromString 

lang :: MonadParser m => LanguageDef m 
lang = LanguageDef{ languageCommentStyle = haskellCommentStyle 
        , languageIdentifierStyle = emptyIdents{ styleReserved = set keywords } 
        , languageOperatorStyle = emptyOps{ styleReserved = set ops } 
        } 
    where 
    keywords = ["where"] 
    ops = ["="] 

data Def = Def ByteString [ByteString] [ByteString] [Def] 
     deriving Show 

instance MonadLanguage m => MonadLanguage (Layout m) where 
    askLanguage = fmap liftLanguageDef $ lift askLanguage 

def :: (MonadParser m) => Layout (Language m) Def 
def = Def <$> identifier <*> vars <* reservedOp "=" <*> vars <*> laidout locals 
    where 
    vars = many identifier 
    locals = fromMaybe [] <$> optional (reserved "where" *> defs) 

defs :: (MonadParser m) => Layout (Language m) [Def] 
defs = laidout (many def) 

test :: String -> IO() 
test = parseTest $ run $ defs <* eof 
    where 
    run p = runLanguage (fst <$> runLayout p defaultLayoutState) lang 

Tôi đang cố gắng để phân tích các văn bản sau đây với test:

f x = x y a b c -- 1 
    where   -- 2 
    y = d  -- 3 
g x = z   -- 4 

nhưng nó thất bại với lỗi phân tích cú pháp này:

(interactive):4:2: error: expected: "=", 
    identifier, letter or digit 
g x = z   -- 4 
^  

nhưng nếu tôi bình luận ra dòng 2 và 3, nó hoạt động.

Vậy làm cách nào để phân tích cú pháp ngay cả khi bao gồm các dòng 2 và 3?

Trả lời

6

Có một số lỗi trong hỗ trợ Layout cho Trifecta. Tôi cần phải cổng một số bản sửa lỗi trở lại từ việc thực hiện Scala.

Đáng chú ý là một vài điều cần phải vô hiệu hóa bắt đầu kiểm tra đường thẳng, do đó, nó đã cố gắng thực hiện chèn dấu chấm phẩy tự động khi bạn gặp lỗi.

Tôi đã chuyển nó từ một codebase khác của tôi đã tạo ra các giả định hơi khác và cung cấp các bất biến hơi khác so với trifecta.

Đây thực sự là một phần lớn lý do tại sao nó hiện không nằm trong nhánh chính trên github.

Sửa lỗi để sử dụng API parsers mới và chuyển các thay đổi đó là điều quan trọng cuối cùng tôi cần thực hiện trước khi có thể gửi 0,90.

Trong thời gian chờ đợi, tôi sẽ không dựa vào nó. Lời xin lỗi của tôi.

Tôi sẽ cập nhật phản hồi này ngay sau khi nó ổn định.

+1

Tôi cho rằng điều này đã được khắc phục ngay bây giờ? trifecta hiện tại là 1.5.1. –

+2

Hiện tại, chúng tôi đã xóa trình phân tích cú pháp bố cục khỏi trifecta chính thống. Tuy nhiên, bạn có thời gian tốt. Tôi hiện đang quét sạch nó và tìm cách thay thế nó. =) –

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