2012-09-11 5 views
6

저는 Haskell과 같은 레이아웃 구문을 사용하여 아주 간단한 함수 언어를 구문 분석하기 위해 Trifecta를 실험하고 있습니다. 나는 Haddock 문서와 Parsec에 대한 나의 경험을 연구하고 있는데, Trifecta 자체에 대한 입문 자료를 찾을 수 없었기 때문입니다.Trifecta의 레이아웃 구문 분석기 사용

문제는 레이아웃을 사용하는 것입니다. Haddock 문서도 도움이되지 않습니다.

주어진 다음의 코드 :

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 

내가 test 다음과 같은 텍스트 구문 분석하려고 해요 :

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

을하지만이 구문 분석 오류와 함께 실패합니다

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

하지만 2 행과 3 행을 주석 처리하면 작동합니다.

그렇다면 2 행과 3 행을 포함 할 때 어떻게 해석합니까?

답변

6

Trifecta에 대한 Layout 지원에 몇 가지 버그가 있습니다. 스칼라 구현에서 일부 픽스를 다시 포팅해야한다.

특히 몇 가지 검사가 시작 라인 검사를 사용하지 않도록 설정해야하므로 오류가 발생하는 곳에 자동 세미콜론 삽입을 시도했습니다.

나는 약간 다른 가정을하고, trifecta보다 약간 다른 불변량을 제공하는 다른 코드베이스에서 이식했습니다.

사실 이것은 현재 github의 master 브랜치에없는 이유의 큰 부분입니다.

새로운 parsers 기반 API를 사용하고이 변경 사항을 이식하는 것은 내가 0.90을 출시하기 전에해야 할 마지막 중요한 일입니다.

그동안 나는 그것에 의지하지 않을 것입니다. 내 사과.

이 응답은 안정되면 즉시 업데이트 할 예정입니다.

+1

이 문제가 해결 되었습니까? trifecta는 현재 1.5.1입니다. –

+2

현재 레이아웃 파서가 주류 trifecta에서 제거되었습니다. 그러나 좋은 타이밍이 있습니다. 나는 현재 그것을 털어 내고 그것을 대체하려고하고있다. =) –