|
| Language.ContextFree.Cfg | | Portability | portable | | Stability | experimental | | Maintainer | Joćo Saraiva - jas@di.uminho.pt |
|
|
|
|
|
| Description |
| Representing Context-free Grammars in Haskell
|
|
| Synopsis |
|
| data Cfg t nt = Cfg {} | | | cfg2dotGraph :: (Eq t, Eq nt, Show t, Show nt) => Cfg t nt -> String | | | cfg2dotList :: (Eq t, Eq nt, Show t, Show nt) => Cfg t nt -> String | | | type RHS t nt = [Symb t nt] | | | type Prod t nt = (ProdName, [Symb t nt]) | | | type ProdName = String | | | | | (|->) :: a -> [a] -> [a] | | | prods2cfg :: (Eq t, Eq nt) => [Prod t nt] -> nt -> Cfg t nt | | | get_terminals :: (Eq t, Eq nt) => [Prod t nt] -> [Symb t nt] | | | get_nonterminals :: (Eq t, Eq nt) => [Prod t nt] -> [Symb t nt] | | | lhs_prod :: [Symb t nt] -> Symb t nt | | | rhs_prod :: [Symb t nt] -> RHS t nt | | | sizeProd :: [Symb t nt] -> Int | | | is_terminal :: (Eq t, Eq nt) => Symb t nt -> Cfg t nt -> Bool | | | prods_nt :: (Eq t, Eq nt) => Cfg t nt -> Symb t nt -> [[Symb t nt]] | | | rhs_nt :: (Eq t, Eq nt) => Cfg t nt -> Symb t nt -> [RHS t nt] | | | rhs_with_nt :: (Eq t, Eq nt) => Cfg t nt -> Symb t nt -> [RHS t nt] | | | prods_rhs_with_nt :: (Eq t, Eq nt) => Cfg t nt -> Symb t nt -> [[Symb t nt]] | | | elemNT :: (Eq t, Eq nt) => Symb t nt -> RHS t nt -> Bool | | | nullable :: (Eq t, Eq nt) => Cfg t nt -> [Symb t nt] -> [Symb t nt] -> Bool | | | nullable_nt' :: (Eq t, Eq nt) => Cfg t nt -> [Symb t nt] -> Symb t nt -> Bool | | | nullable_nt :: (Eq t, Eq nt) => Cfg t nt -> Symb t nt -> Bool | | | first :: (Eq t, Eq nt) => Cfg t nt -> RHS t nt -> [Symb t nt] | | | first_N :: (Eq nt, Eq t) => Cfg t nt -> Symb t nt -> [Symb t nt] | | | first' :: (Eq t, Eq nt) => Cfg t nt -> [Symb t nt] -> RHS t nt -> [Symb t nt] | | | follow :: (Eq t, Eq nt) => Cfg t nt -> Symb t nt -> [Symb t nt] | | | follow' :: (Eq t, Eq nt) => Cfg t nt -> [Symb t nt] -> Symb t nt -> [Symb t nt] | | | follow_prods_with_nt :: (Eq t, Eq nt) => Cfg t nt -> [Symb t nt] -> Symb t nt -> [[Symb t nt]] -> [Symb t nt] | | | suffices_after_sy :: (Eq t, Eq nt) => Cfg t nt -> [Symb t nt] -> Symb t nt -> [Symb t nt] -> [Symb t nt] | | | f :: (Eq t, Eq nt) => Cfg t nt -> [Symb t nt] -> Symb t nt -> RHS t nt -> [Symb t nt] | | | lookahead :: (Eq t, Eq nt) => Cfg t nt -> [Symb t nt] -> [Symb t nt] | | | all_lookaheads :: (Eq t, Eq nt) => Cfg t nt -> [[Symb t nt]] | | | lookaheads_nt :: (Eq t, Eq nt) => Cfg t nt -> nt -> [[Symb t nt]] | | | ll_1_nt :: (Eq nt, Eq t) => Cfg t nt -> Symb t nt -> Bool | | | ll_1 :: (Eq t, Eq nt) => Cfg t nt -> Bool |
|
|
|
| Representation |
|
| data Cfg t nt |
| The type of Context Free Grammars.
A production is modeled as a list of symbols, where the head of the
list models the LHS and the tail models the RHS. | | Constructors | | Cfg | | | terminals :: [Symb t nt] | Set of Terminal Symbols | | nonterminals :: [Symb t nt] | Set of Nonterminal Symbols | | root :: (Symb t nt) | Root Symbol | | prods :: [Prod t nt] | Set of (named) productions |
|
| | Instances | | ??? nt t => Show (Cfg t nt) |
|
|
|
| cfg2dotGraph :: (Eq t, Eq nt, Show t, Show nt) => Cfg t nt -> String |
|
| cfg2dotList :: (Eq t, Eq nt, Show t, Show nt) => Cfg t nt -> String |
|
| type RHS t nt = [Symb t nt] |
|
| type Prod t nt = (ProdName, [Symb t nt]) |
|
| type ProdName = String |
|
| data Symb t nt |
| Constructors | | Dollar | End of input | | Root | Root symbol | | T t | Terminal symbol | | NT nt | Non-terminal symbol |
| | Instances | | (Eq nt, Eq t) => Eq (Symb t nt) | | (Ord nt, Ord t) => Ord (Symb t nt) | | (Show nt, Show t) => Show (Symb t nt) | | (Read nt, Read t) => Read (Symb t nt) |
|
|
|
| (|->) :: a -> [a] -> [a] |
| To make the notation of the grammars as similar to BNF as possible
we define an infix operator to denote the usual 'derives to' operator |
|
| prods2cfg :: (Eq t, Eq nt) => [Prod t nt] -> nt -> Cfg t nt |
| Complete a list of productions to a well-formed grammar. |
|
| get_terminals :: (Eq t, Eq nt) => [Prod t nt] -> [Symb t nt] |
| Compute the list of terminals from a list of productions. |
|
| get_nonterminals :: (Eq t, Eq nt) => [Prod t nt] -> [Symb t nt] |
| Compute the list of non-terminals from a list of productions. |
|
| Access functions |
|
| lhs_prod :: [Symb t nt] -> Symb t nt |
| The left-hand side and th right-hand side of a prodution are easily
defined by the head and tail functions |
|
| rhs_prod :: [Symb t nt] -> RHS t nt |
|
| Simple queries on grammars |
|
| sizeProd :: [Symb t nt] -> Int |
| Computes the length of a prodution: the number of symbols on its right-hand side |
|
| is_terminal :: (Eq t, Eq nt) => Symb t nt -> Cfg t nt -> Bool |
| Checks whether a terminal is declared as such in a grammar |
|
| prods_nt :: (Eq t, Eq nt) => Cfg t nt -> Symb t nt -> [[Symb t nt]] |
| Selects the productions from a Cfg that have a common
given non-terminal as left-hand side. |
|
| rhs_nt :: (Eq t, Eq nt) => Cfg t nt -> Symb t nt -> [RHS t nt] |
| Selects the produtions RHSs from a Cfg that have a common
given non-terminal as left-hand side. |
|
| rhs_with_nt :: (Eq t, Eq nt) => Cfg t nt -> Symb t nt -> [RHS t nt] |
| Selects the produtions RHSs from a Cfg that have a common
given non-terminal in the right-hand side. |
|
| prods_rhs_with_nt :: (Eq t, Eq nt) => Cfg t nt -> Symb t nt -> [[Symb t nt]] |
| Selects the productions from a Cfg that have a common
given non-terminal as right-hand side. |
|
| elemNT :: (Eq t, Eq nt) => Symb t nt -> RHS t nt -> Bool |
|
| Advanced queries on grammars |
|
| nullable |
| :: (Eq t, Eq nt) | | | => Cfg t nt | Grammar | | -> [Symb t nt] | Accumulator: non-terminals visited so far. | | -> [Symb t nt] | List of grammar symbols (from RHS) | | -> Bool | | | Verifies whther a sequence of symbols derives in the empty strig or not. |
|
|
| nullable_nt' :: (Eq t, Eq nt) => Cfg t nt -> [Symb t nt] -> Symb t nt -> Bool |
|
| nullable_nt :: (Eq t, Eq nt) => Cfg t nt -> Symb t nt -> Bool |
|
| first |
| :: (Eq t, Eq nt) | | | => Cfg t nt | Grammar | | -> RHS t nt | Sequence of grammar symbols | | -> [Symb t nt] | first set | | Computes the set of terminal symbols that begin the strings derived from the given
sequence of symbols |
|
|
| first_N |
| :: (Eq nt, Eq t) | | | => Cfg t nt | Grammar | | -> Symb t nt | Nonterminal symbol | | -> [Symb t nt] | first set | | Computes the set of terminal symbols that begin the strings derived from the given
nonterminal symbol |
|
|
| first' :: (Eq t, Eq nt) => Cfg t nt -> [Symb t nt] -> RHS t nt -> [Symb t nt] |
|
| follow |
| :: (Eq t, Eq nt) | | | => Cfg t nt | Grammar | | -> Symb t nt | Nonterminal symbol | | -> [Symb t nt] | follow set | | Computes the set of terminal symbols that can appear immediately to the
right of a given nonterminal symbol in some sentential form |
|
|
| follow' :: (Eq t, Eq nt) => Cfg t nt -> [Symb t nt] -> Symb t nt -> [Symb t nt] |
|
| follow_prods_with_nt :: (Eq t, Eq nt) => Cfg t nt -> [Symb t nt] -> Symb t nt -> [[Symb t nt]] -> [Symb t nt] |
|
| suffices_after_sy :: (Eq t, Eq nt) => Cfg t nt -> [Symb t nt] -> Symb t nt -> [Symb t nt] -> [Symb t nt] |
|
| f :: (Eq t, Eq nt) => Cfg t nt -> [Symb t nt] -> Symb t nt -> RHS t nt -> [Symb t nt] |
|
| lookahead |
| :: (Eq t, Eq nt) | | | => Cfg t nt | Grammar | | -> [Symb t nt] | Production | | -> [Symb t nt] | lookahead set | | Computes the set of terminal symbols that begins the strings derived
from the given production |
|
|
| all_lookaheads |
|
|
| lookaheads_nt |
| :: (Eq t, Eq nt) | | | => Cfg t nt | Grammar | | -> nt | Nonterminal symbol | | -> [[Symb t nt]] | Sequence of lookahead set | | Computes the lookahead set of a nonterminal symbols, that is the union of
the lookaheads of the productions with this nonterminal symbol as lhs |
|
|
| Check the category in which the grammar falls. |
|
| ll_1_nt |
| :: (Eq nt, Eq t) | | | => Cfg t nt | Grammar | | -> Symb t nt | Nonterminal symbol | | -> Bool | | | Verifies whether the given non-terminal verifies the LL(1) condition or not. |
|
|
| ll_1 :: (Eq t, Eq nt) => Cfg t nt -> Bool |
| Verifies whether a grammar verifies the LL(1) condition or not. |
|
| Produced by Haddock version 0.6 |