penntreebank-megaparsec: Parser combinators for trees in the Penn Treebank format

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.

[maintain] [Publish]

This Haskell package provides parsers for syntactic trees annotated in the Penn Treebank format, powered by Megaparsec.


[Skip to Readme]

Properties

Versions 0.1.0, 0.1.0, 0.2.0
Change log None available
Dependencies base (>=4.11 && <5), containers (>=0.5 && <0.7), megaparsec (>=8.0 && <9), mtl (>=2.2.2 && <3), transformers (>=0.4 && <0.6) [details]
License BSD-3-Clause
Copyright 2020 Nori Hayashi
Author Nori Hayashi
Maintainer Nori Hayashi <net@hayashi-lin.net>
Category Parsing, Natural Language Processing
Home page https://github.com/aslemen/penntreebank-megaparsec#readme
Bug tracker https://github.com/aslemen/penntreebank-megaparsec/issues
Source repo head: git clone https://github.com/aslemen/penntreebank-megaparsec
Uploaded by twotrees12 at 2020-04-17T20:27:29Z

Modules

[Index] [Quick Jump]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


Readme for penntreebank-megaparsec-0.1.0

[back to package description]

penntreebank-megaparsec :: Megaparsec parsers for trees in the Penn Treebank format

Travis CI build :: master

This Haskell package provides parsers for syntactic trees annotated in the Penn Treebank format, powered by Megaparsec.

It supports vertical composition of custom label parsers with tree parsers, which means you can customize your label parsers and use these parsers to perform parsing of labels at the same time as that of trees. For the following example of categorial grammar trees,

(A/B (B He)
     (B\<A/B> thinks))

the result of tree parsing is:

Node "A/B" [
    Node "B" [
        Node "He" []
    ], 
    Node "B\<A/B>" [
        Node "thinks" []
    ]
] 

which you can make followed by a secondary parsing of labels (= categories):

Node (CatRight (Atom B) (Atom A)) [
    Node (Atom B) [
        Node (Lex "He") []
    ], 
    Node (CatLeft (Atom B) (CatRight (Atom B) (Atom A))) [
        Node (Lex "thinks") []
    ]
] 

Usage

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE MultiParamTypeClasses #-}

import Data.Tree.Parser.Penn.Megaparsec.Char as TC
import Data.Text (Text)
import Text.Megaparsec as MegaP

-- define the node type
data PennNode = NonTerm Text | Term Text deriving (Show)

-- define the node parsers
instance {-# OVERLAPS #-} TC.ParsableAsTerm Text PennNode where
    pNonTerm = NonTerm <$> MegaP.takeRest
    pTerm = Term <$> MegaP.takeRest

-- specify and disambiguate the type of the input stream 
parser :: (Monad m) => TC.PennTreeParserT Text m PennNode
parser = TC.pTree

main :: IO ()
main = MegaP.parseTest parser "(A (B C (D E)))"