refactor the filter parsing
This commit is contained in:
parent
7f90318647
commit
6c9a291930
|
@ -11,8 +11,8 @@
|
||||||
> ,(<??.>)
|
> ,(<??.>)
|
||||||
> ,(<??*>)) where
|
> ,(<??*>)) where
|
||||||
|
|
||||||
> import Control.Applicative ((<$>), (<*>), (<**>))
|
> import Control.Applicative --((<$>), (<*>), (<**>))
|
||||||
> import Text.Parsec (option,many)
|
> import Text.Parsec --(option,many)
|
||||||
> import Text.Parsec.String (Parser)
|
> import Text.Parsec.String (Parser)
|
||||||
|
|
||||||
a possible issue with the option suffix is that it enforces left
|
a possible issue with the option suffix is that it enforces left
|
||||||
|
@ -54,4 +54,5 @@ succeeding.
|
||||||
0 to many repeated applications of suffix parser
|
0 to many repeated applications of suffix parser
|
||||||
|
|
||||||
> (<??*>) :: Parser a -> Parser (a -> a) -> Parser a
|
> (<??*>) :: Parser a -> Parser (a -> a) -> Parser a
|
||||||
> p <??*> q = foldr ($) <$> p <*> (reverse <$> many q)
|
> p <??*> q = p <**> chainl q (pure (flip (.))) id
|
||||||
|
> -- foldr ($) <$> p <*> (reverse <$> many q)
|
||||||
|
|
|
@ -414,7 +414,19 @@ syntactically, e.g. a clob(5) will parse to a precision type name, not
|
||||||
a lob type name.
|
a lob type name.
|
||||||
|
|
||||||
Not sure if the factoring in this function is too far. It could do
|
Not sure if the factoring in this function is too far. It could do
|
||||||
with some work to improve the readability still.
|
with some work to improve the readability still. Ideas: the parsers of
|
||||||
|
each component, the various kinds combinators, the application of
|
||||||
|
choice particularly and the constuctors are a bit mixed together and
|
||||||
|
should be separated more. Probably start with:
|
||||||
|
|
||||||
|
P (a -> b), which combines parsing some extra fields and then
|
||||||
|
constructing a 'b' with these new fields and the 'a', decompose it
|
||||||
|
into
|
||||||
|
|
||||||
|
P c -- separate each field that contributes to a b to a separately
|
||||||
|
named function
|
||||||
|
separate out the ctor wrapper: c -> a -> b
|
||||||
|
and then create a P (a -> b) just by combining bits
|
||||||
|
|
||||||
> typeName :: Parser TypeName
|
> typeName :: Parser TypeName
|
||||||
> typeName = lexeme $
|
> typeName = lexeme $
|
||||||
|
@ -611,7 +623,7 @@ syntax can start with the same keyword.
|
||||||
cast: cast(expr as type)
|
cast: cast(expr as type)
|
||||||
|
|
||||||
> cast :: Parser ValueExpr
|
> cast :: Parser ValueExpr
|
||||||
> cast = keyword_ "cast" >>
|
> cast = keyword_ "cast" *>
|
||||||
> parens (Cast <$> valueExpr
|
> parens (Cast <$> valueExpr
|
||||||
> <*> (keyword_ "as" *> typeName))
|
> <*> (keyword_ "as" *> typeName))
|
||||||
|
|
||||||
|
@ -834,7 +846,7 @@ factored with the typename 'literal' parser.
|
||||||
> [((,,) <$> duplicates
|
> [((,,) <$> duplicates
|
||||||
> <*> commaSep1 valueExpr
|
> <*> commaSep1 valueExpr
|
||||||
> <*> (option [] orderBy <* closeParen))
|
> <*> (option [] orderBy <* closeParen))
|
||||||
> <**> (afilterz
|
> <**> ((\f (sq,es,ob) nm -> f sq es ob nm) <$> afilter
|
||||||
> <|> pure (\(d,es,ob) f -> AggregateApp f d es ob Nothing))
|
> <|> pure (\(d,es,ob) f -> AggregateApp f d es ob Nothing))
|
||||||
> -- separate cases with no all or distinct which have at least one
|
> -- separate cases with no all or distinct which have at least one
|
||||||
> -- value expr
|
> -- value expr
|
||||||
|
@ -842,11 +854,11 @@ factored with the typename 'literal' parser.
|
||||||
> <**> choice
|
> <**> choice
|
||||||
> [closeParen *> choice [window
|
> [closeParen *> choice [window
|
||||||
> ,withinGroup
|
> ,withinGroup
|
||||||
> ,afiltery
|
> ,(\f es nm -> f SQDefault es [] nm) <$> afilter
|
||||||
> ,pure (flip App)]
|
> ,pure (flip App)]
|
||||||
> ,(orderBy <* closeParen)
|
> ,(orderBy <* closeParen)
|
||||||
> <**>
|
> <**>
|
||||||
> choice [afilterx
|
> choice [(\f ob es nm -> f SQDefault es ob nm) <$> afilter
|
||||||
> ,pure (\ob es f -> AggregateApp f SQDefault es ob Nothing)]]
|
> ,pure (\ob es f -> AggregateApp f SQDefault es ob Nothing)]]
|
||||||
> ,([] <$ closeParen)
|
> ,([] <$ closeParen)
|
||||||
> <**> choice [window
|
> <**> choice [window
|
||||||
|
@ -854,34 +866,6 @@ factored with the typename 'literal' parser.
|
||||||
> ,pure (flip App)]
|
> ,pure (flip App)]
|
||||||
> ]
|
> ]
|
||||||
|
|
||||||
todo: brain no work - fix this mess. Should be able to convert these
|
|
||||||
to simple applicative functions then inline them
|
|
||||||
|
|
||||||
> afilterx :: Parser ([SortSpec]
|
|
||||||
> -> [ValueExpr]
|
|
||||||
> -> [Name]
|
|
||||||
> -> ValueExpr)
|
|
||||||
> afilterx = do
|
|
||||||
> f <- afilter
|
|
||||||
> pure $ \ob es nm -> f SQDefault es ob nm
|
|
||||||
|
|
||||||
> afiltery :: Parser ([ValueExpr]
|
|
||||||
> -> [Name]
|
|
||||||
> -> ValueExpr)
|
|
||||||
> afiltery = do
|
|
||||||
> f <- afilter
|
|
||||||
> pure $ \es nm -> f SQDefault es [] nm
|
|
||||||
|
|
||||||
|
|
||||||
> afilterz :: Parser ((SetQuantifier
|
|
||||||
> ,[ValueExpr]
|
|
||||||
> ,[SortSpec])
|
|
||||||
> -> [Name]
|
|
||||||
> -> ValueExpr)
|
|
||||||
> afilterz = do
|
|
||||||
> f <- afilter
|
|
||||||
> pure $ \(sq,es,ob) nm -> f sq es ob nm
|
|
||||||
|
|
||||||
> afilter :: Parser (SetQuantifier
|
> afilter :: Parser (SetQuantifier
|
||||||
> -> [ValueExpr]
|
> -> [ValueExpr]
|
||||||
> -> [SortSpec]
|
> -> [SortSpec]
|
||||||
|
|
Loading…
Reference in a new issue