Note that there are some explanatory texts on larger screens.

plurals
  1. POUsing Trifecta's layout parser
    primarykey
    data
    text
    <p>I'm experimenting with Trifecta for parsing a very simple functional language with Haskell-like layout syntax. I'm working off the Haddock docs and my experience with Parsec, because I couldn't find any introductory material on Trifecta itself. </p> <p>The problem I'm having is with using the layout stuff, since not even the Haddock docs help much. </p> <p>Given the following code:</p> <pre><code>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] -&gt; HashSet ByteString set = HashSet.fromList . fmap UTF8.fromString lang :: MonadParser m =&gt; 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 =&gt; MonadLanguage (Layout m) where askLanguage = fmap liftLanguageDef $ lift askLanguage def :: (MonadParser m) =&gt; Layout (Language m) Def def = Def &lt;$&gt; identifier &lt;*&gt; vars &lt;* reservedOp "=" &lt;*&gt; vars &lt;*&gt; laidout locals where vars = many identifier locals = fromMaybe [] &lt;$&gt; optional (reserved "where" *&gt; defs) defs :: (MonadParser m) =&gt; Layout (Language m) [Def] defs = laidout (many def) test :: String -&gt; IO () test = parseTest $ run $ defs &lt;* eof where run p = runLanguage (fst &lt;$&gt; runLayout p defaultLayoutState) lang </code></pre> <p>I'm trying to parse the following text with <code>test</code>:</p> <pre><code>f x = x y a b c -- 1 where -- 2 y = d -- 3 g x = z -- 4 </code></pre> <p>but it fails with this parse error:</p> <pre><code>(interactive):4:2: error: expected: "=", identifier, letter or digit g x = z -- 4 ^ </code></pre> <p>but if I comment out lines 2 and 3, it works.</p> <p>So how do I make it parse even when including lines 2 and 3?</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload