git @ Cat's Eye Technologies Fountain / c1d8d0d
Add --convert-loops flag to trigger the pre-processing of loops. Chris Pressey 8 months ago
2 changed file(s) with 19 addition(s) and 15 deletion(s). Raw diff Collapse all Expand all
1313 import Language.Fountain.Constraint
1414
1515
16 preprocessGrammarForGeneration :: Grammar -> Grammar
17 preprocessGrammarForGeneration (Grammar productions) = Grammar $ map (preprocessProduction) productions where
18 preprocessProduction p@Production{ constituents=c } = p { constituents=preprocessExpr c }
19 preprocessExpr = eliminateSingleAlts . coalesceConstraints . decorateLoops
16 preprocessGrammarForGeneration :: Grammar -> Bool -> Grammar
17 preprocessGrammarForGeneration g True = preprocessGrammarForGeneration (extractLoops g) False
18 preprocessGrammarForGeneration (Grammar productions) False =
19 Grammar $ map (preprocessProduction) productions where
20 preprocessProduction p@Production{ constituents=c } = p { constituents=preprocessExpr c }
21 preprocessExpr = eliminateSingleAlts . coalesceConstraints . decorateLoops
2022
2123
22 preprocessGrammarForParsing :: Grammar -> Grammar
23 preprocessGrammarForParsing (Grammar productions) = Grammar $ map (preprocessProduction) productions where
24 preprocessProduction p@Production{ constituents=c } = p { constituents=preprocessExpr c }
25 preprocessExpr = eliminateSingleAlts . coalesceConstraints
24 preprocessGrammarForParsing :: Grammar -> Bool -> Grammar
25 preprocessGrammarForParsing g True = preprocessGrammarForParsing (extractLoops g) False
26 preprocessGrammarForParsing (Grammar productions) False =
27 Grammar $ map (preprocessProduction) productions where
28 preprocessProduction p@Production{ constituents=c } = p { constituents=preprocessExpr c }
29 preprocessExpr = eliminateSingleAlts . coalesceConstraints
2630
2731
2832 --
1818 dumpState :: Bool,
1919 startSymbol :: Maybe String,
2020 suppressNewline :: Bool,
21 convertLoops :: Bool,
2122 seed :: Int
2223 } deriving (Show, Ord, Eq)
2324
2526 dumpState = False,
2627 startSymbol = Nothing,
2728 suppressNewline = False,
29 convertLoops = False,
2830 seed = 0
2931 }
3032
3436 parseFlags flags{ startSymbol = Just s } rest
3537 parseFlags flags ("--suppress-newline":rest) =
3638 parseFlags flags{ suppressNewline = True } rest
39 parseFlags flags ("--convert-loops":rest) =
40 parseFlags flags{ convertLoops = True } rest
3741 parseFlags flags ("--seed":seedStr:rest) =
3842 parseFlags flags{ seed = (read seedStr) :: Int } rest
3943 parseFlags flags other = (flags, other)
5660 output $ Grammar.depictGrammar grammar
5761 ["preprocess", grammarFileName] -> do
5862 grammar <- loadSource grammarFileName
59 let grammar' = Preprocessor.preprocessGrammarForGeneration grammar
63 let grammar' = Preprocessor.preprocessGrammarForGeneration grammar (convertLoops flags)
6064 -- TODO: add flag to show internal format
6165 output $ Grammar.depictGrammar grammar'
62 ["extractloops", grammarFileName] -> do
63 grammar <- loadSource grammarFileName
64 let grammar' = Preprocessor.extractLoops grammar
65 putStrLn $ Grammar.depictGrammar grammar'
6666 ("parse":grammarFileName:textFileName:initialParams) -> do
6767 grammar <- loadSource grammarFileName
68 let grammar' = Preprocessor.preprocessGrammarForParsing grammar
68 let grammar' = Preprocessor.preprocessGrammarForParsing grammar (convertLoops flags)
6969 text <- loadText textFileName
7070 let start = getStartSymbol grammar' flags
7171 let initialState = Parser.constructState grammar' start text initialParams
7474 exitWith $ either (\_msg -> ExitFailure 1) (\_remaining -> ExitSuccess) $ Parser.obtainResult finalState
7575 ("generate":grammarFileName:initialParams) -> do
7676 grammar <- loadSource grammarFileName
77 let grammar' = Preprocessor.preprocessGrammarForGeneration grammar
77 let grammar' = Preprocessor.preprocessGrammarForGeneration grammar (convertLoops flags)
7878 let start = getStartSymbol grammar' flags
7979 let initialState = Generator.constructState grammar' start (seed flags) initialParams
8080 let finalState = Generator.generateFrom grammar' start initialState