gll-0.4.0.2: src/GLL/Flags.hs
module GLL.Flags where
-- | Flags to influence the behaviour of the parser.
data Flags = Flags { symbol_nodes :: Bool
, intermediate_nodes :: Bool
, edges :: Bool
, flexible_binarisation :: Bool
, max_errors :: Int
, do_select_test :: Bool
}
-- | The default flags:
-- * Do not add symbol nodes to the 'SPPF'.
-- * Do not add intermediate nodes to the 'SPPF'.
-- * Do not add edges to the 'SPPF'.
-- * Flexible binarisation.
-- * The three furthest discoveries of a token mismatch are reported.
-- * Select tests are performed.
defaultFlags = Flags False False False True 3 True
-- | Execute the given 'Options' in left-to-right order on 'defaultFlags'.
runOptions :: ParseOptions -> Flags
runOptions = foldr ($) defaultFlags
-- | An option updates the current set of 'Flags'.
type ParseOption = Flags -> Flags
-- | A list of 'ParserOption's
type ParseOptions = [ParseOption]
-- |
-- Create the 'SPPF' with all nodes and edges, not necessarily strictly binarised.
fullSPPF :: ParseOption
fullSPPF flags = flags{symbol_nodes = True, intermediate_nodes = True, edges = True}
-- |
-- Create all nodes, but no edges between nodes.
allNodes :: ParseOption
allNodes flags = flags{symbol_nodes = True, intermediate_nodes = True}
-- |
-- Create packed-nodes only.
packedNodesOnly :: ParseOption
packedNodesOnly flags = flags{symbol_nodes = False, intermediate_nodes = False, edges = False}
-- |
-- Fully binarise the SPPF, resulting in a larger 'SPPF' and possibly slower runtimes.
-- When this flag is on, packed nodes can only have a single symbol node child
-- or one intermediate node child and one symbol node child.
-- With the flag disabled a packed node can have two symbol node children.
strictBinarisation :: ParseOption
strictBinarisation flags = flags{flexible_binarisation = False}
-- |
-- Set the maximum number of errors shown in case of an unsuccessful parse.
maximumErrors :: Int -> ParseOption
maximumErrors n flags = flags {max_errors = n}
-- |
-- Turn of select tests. Disables lookahead.
noSelectTest :: ParseOption
noSelectTest flags = flags{do_select_test = False}