Skip to content

Commit 28d2571

Browse files
committed
Clean up Program parsers. #148
* Move into Language.CQL.Parser.Program. * Simplify some of the stuff inside.
1 parent e5f51b4 commit 28d2571

File tree

2 files changed

+37
-36
lines changed

2 files changed

+37
-36
lines changed

src/Language/CQL.hs

+14-14
Original file line numberDiff line numberDiff line change
@@ -42,23 +42,23 @@ module Language.CQL where
4242
import Control.Concurrent
4343
import Control.DeepSeq
4444
import Control.Exception
45-
import Data.List (nub)
46-
import qualified Data.Map.Strict as Map
45+
import Data.List (nub)
46+
import qualified Data.Map.Strict as Map
4747
import Data.Maybe
4848
import Data.Typeable
49-
import Language.CQL.Common as C
49+
import Language.CQL.Common as C
5050
import Language.CQL.Graph
51-
import Language.CQL.Instance as I
52-
import Language.CQL.Mapping as M
51+
import Language.CQL.Instance as I
52+
import Language.CQL.Mapping as M
5353
import Language.CQL.Options
54-
import Language.CQL.Parser (parseCqlProgram)
55-
import Language.CQL.Program as P
56-
import Language.CQL.Query as Q
57-
import Language.CQL.Schema as S
58-
import Language.CQL.Term as Term
59-
import Language.CQL.Transform as Tr
60-
import Language.CQL.Typeside as T
61-
import Prelude hiding (EQ, exp)
54+
import Language.CQL.Parser.Program (parseProgram)
55+
import Language.CQL.Program as P
56+
import Language.CQL.Query as Q
57+
import Language.CQL.Schema as S
58+
import Language.CQL.Term as Term
59+
import Language.CQL.Transform as Tr
60+
import Language.CQL.Typeside as T
61+
import Prelude hiding (EQ, exp)
6262
import System.IO.Unsafe
6363

6464
-- | Times out a computation after @i@ microseconds.
@@ -243,7 +243,7 @@ type Env = KindCtx TypesideEx SchemaEx InstanceEx MappingEx QueryEx TransformEx
243243
-- | Parse, typecheck, and evaluate the CQL program.
244244
runProg :: String -> Err (Prog, Types, Env)
245245
runProg srcText = do
246-
progE <- parseCqlProgram srcText
246+
progE <- parseProgram srcText
247247
opts <- toOptions defaultOptions $ other progE
248248
o <- findOrder progE
249249
typesE <- typecheckCqlProgram o progE newTypes

src/Language/CQL/Parser.hs src/Language/CQL/Parser/Program.hs

+23-22
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ GNU Affero General Public License for more details.
1818
You should have received a copy of the GNU Affero General Public License
1919
along with this program. If not, see <https://www.gnu.org/licenses/>.
2020
-}
21-
module Language.CQL.Parser where
21+
22+
module Language.CQL.Parser.Program where
2223

2324
import Data.List
2425
import Data.Map as Map hiding ((\\))
@@ -34,21 +35,21 @@ import Language.CQL.Parser.Typeside as T'
3435
import Language.CQL.Program as P
3536
import Text.Megaparsec
3637

37-
parseCqlProgram :: String -> Err Prog
38-
parseCqlProgram s = case runParser parseCqlProgram' "" s of
39-
Left err -> Left $ "Parse error: " ++ parseErrorPretty err
40-
Right (o, x) -> if length (fst $ unzip x) == length (nub $ fst $ unzip x)
41-
then pure $ toProg o x
42-
else Left $ "Duplicate definition: " ++ show (nub (fmap fst x \\ nub (fmap fst x)))
38+
parseProgram :: String -> Err Prog
39+
parseProgram s = case runParser parseProgram' "" s of
40+
Left err -> Left $ "Parse error: " ++ parseErrorPretty err
41+
Right (opts, prog) -> if length (fst $ unzip prog) == length (nub $ fst $ unzip prog)
42+
then Right $ toProg opts prog
43+
else Left $ "Duplicate definition: " ++ show (nub (fmap fst prog \\ nub (fmap fst prog)))
4344

44-
-- | Returns a list of config options and programs.
45-
parseCqlProgram' :: Parser ([(String, String)], [(String, Exp)])
46-
parseCqlProgram' =
45+
-- | Returns a list of config option key-value paired with programs.
46+
parseProgram' :: Parser ([(String, String)], [(String, Exp)])
47+
parseProgram' =
4748
between spaceConsumer eof configsAndProgs
4849
where
4950
configsAndProgs = do
5051
opts <- optional (constant "options" *> many optionParser)
51-
progs <- many parseSection
52+
progs <- many parseExp
5253
return (fromMaybe [] opts, progs)
5354

5455
toProg :: [(String, String)] -> [(String, Exp)] -> Prog
@@ -63,17 +64,17 @@ toProg opts ((v,e):p) = case e of
6364
where
6465
KindCtx t s i m q tr _ = toProg opts p
6566

66-
parseSection :: Parser (String, Exp)
67-
parseSection =
68-
section "typeside" typesideExpParser ExpTy <|>
69-
section "schema" schemaExpParser ExpS <|>
70-
section "instance" instExpParser ExpI <|>
71-
section "mapping" mapExpParser ExpM <|>
72-
section "transform" transExpParser ExpT
67+
parseExp :: Parser (String, Exp)
68+
parseExp =
69+
go "typeside" typesideExpParser ExpTy <|>
70+
go "schema" schemaExpParser ExpS <|>
71+
go "instance" instExpParser ExpI <|>
72+
go "mapping" mapExpParser ExpM <|>
73+
go "transform" transExpParser ExpT
7374
where
74-
section sectionKindName bodyParser ctor = do
75-
_ <- constant sectionKindName
76-
sectionName <- identifier
75+
go expKindName bodyParser ctor = do
76+
_ <- constant expKindName
77+
expName <- identifier
7778
_ <- constant "="
7879
body <- bodyParser
79-
return (sectionName, ctor body)
80+
return (expName, ctor body)

0 commit comments

Comments
 (0)