# Module Grappa

This module defines the basic data structures for representing graphs and hypergraphs and the corresponding graph parsers.

## Summary of exported operations:

 ```getSemRep :: (a,[(b,[Int])]) -> a``` Access the semantic representation of the result of a graph parser. ```pSucceed :: a -> [(b,[Int])] -> (a,[(b,[Int])])``` Given an arbitrary value `v`, `pSucceed` always succeeds returning `v` as a result without any consumption of the input graph `g`. ```eoi :: [(a,[Int])] -> ((),[(a,[Int])])``` `eoi` succeeds only if the graph is already completely consumed. ```edge :: Data a => (a,[Int]) -> [(a,[Int])] -> ((),[(a,[Int])])``` The parser `edge e` succeeds only if the given edge `e` is part of the given input graph `g`. ```(<|>) :: ([(a,[Int])] -> (b,[(a,[Int])])) -> ([(a,[Int])] -> (b,[(a,[Int])])) -> [(a,[Int])] -> (b,[(a,[Int])])``` The choice between two parsers. ```(<*>) :: ([(a,[Int])] -> (b -> c,[(a,[Int])])) -> ([(a,[Int])] -> (b,[(a,[Int])])) -> [(a,[Int])] -> (c,[(a,[Int])])``` The successive application of two parsers where the result is constructed by function application. ```(<\$>) :: (a -> b) -> ([(c,[Int])] -> (a,[(c,[Int])])) -> [(c,[Int])] -> (b,[(c,[Int])])``` ```(<\$) :: a -> ([(b,[Int])] -> (c,[(b,[Int])])) -> [(b,[Int])] -> (a,[(b,[Int])])``` ```(<*) :: ([(a,[Int])] -> (b,[(a,[Int])])) -> ([(a,[Int])] -> (c,[(a,[Int])])) -> [(a,[Int])] -> (b,[(a,[Int])])``` ```(*>) :: ([(a,[Int])] -> (b,[(a,[Int])])) -> ([(a,[Int])] -> (c,[(a,[Int])])) -> [(a,[Int])] -> (c,[(a,[Int])])``` ```chain :: ((Int,Int) -> [(a,[Int])] -> (b,[(a,[Int])])) -> (Int,Int) -> [(a,[Int])] -> ([b],[(a,[Int])])``` The combinator `chain p (n1,n2)` can be used to identify a non-empty chain of graphs that can be parsed with `p`.

## Exported datatypes:

Node

All nodes are numbered.

Type synonym: `Node = Int`

Edge

A type for the edge labels `t` can be passed as a type parameter. In the simplest case this can be just strings representing their labels. The tentacle numbers correspond to the position of a node in the list of incident nodes.

Type synonym: `Edge a = (a,[Node])`

Graph

A graph is declared as a list of edges each with its incident nodes

Type synonym: `Graph a = [Edge a]`

Grappa

The type of a graph parser. It is parameterized over the type `res` of semantic values associated to graphs.

Type synonym: `Grappa a b = Graph a -> (b,Graph a)`

## Exported operations:

 ```getSemRep :: (a,[(b,[Int])]) -> a``` Access the semantic representation of the result of a graph parser. Further infos: solution complete, i.e., able to compute all solutions
 ```pSucceed :: a -> [(b,[Int])] -> (a,[(b,[Int])])``` Given an arbitrary value `v`, `pSucceed` always succeeds returning `v` as a result without any consumption of the input graph `g`. Further infos: solution complete, i.e., able to compute all solutions
 ```eoi :: [(a,[Int])] -> ((),[(a,[Int])])``` `eoi` succeeds only if the graph is already completely consumed. In this case, the result `()` is returned Further infos: partially defined solution complete, i.e., able to compute all solutions
 ```edge :: Data a => (a,[Int]) -> [(a,[Int])] -> ((),[(a,[Int])])``` The parser `edge e` succeeds only if the given edge `e` is part of the given input graph `g`.
 ```(<|>) :: ([(a,[Int])] -> (b,[(a,[Int])])) -> ([(a,[Int])] -> (b,[(a,[Int])])) -> [(a,[Int])] -> (b,[(a,[Int])])``` The choice between two parsers.
 ```(<*>) :: ([(a,[Int])] -> (b -> c,[(a,[Int])])) -> ([(a,[Int])] -> (b,[(a,[Int])])) -> [(a,[Int])] -> (c,[(a,[Int])])``` The successive application of two parsers where the result is constructed by function application.
 ```(<\$>) :: (a -> b) -> ([(c,[Int])] -> (a,[(c,[Int])])) -> [(c,[Int])] -> (b,[(c,[Int])])``` ```(<\$) :: a -> ([(b,[Int])] -> (c,[(b,[Int])])) -> [(b,[Int])] -> (a,[(b,[Int])])``` ```(<*) :: ([(a,[Int])] -> (b,[(a,[Int])])) -> ([(a,[Int])] -> (c,[(a,[Int])])) -> [(a,[Int])] -> (b,[(a,[Int])])``` ```(*>) :: ([(a,[Int])] -> (b,[(a,[Int])])) -> ([(a,[Int])] -> (c,[(a,[Int])])) -> [(a,[Int])] -> (c,[(a,[Int])])``` ```chain :: ((Int,Int) -> [(a,[Int])] -> (b,[(a,[Int])])) -> (Int,Int) -> [(a,[Int])] -> ([b],[(a,[Int])])``` The combinator `chain p (n1,n2)` can be used to identify a non-empty chain of graphs that can be parsed with `p`. This chain has to be anchored between the nodes `n1` and `n2`.