[Haskell-cafe] Problem with Python AST

Roel van Dijk vandijk.roel at gmail.com
Fri Feb 22 11:31:17 EST 2008


On Fri, Feb 22, 2008 at 2:42 PM, Daniel Gorín <dgorin at dc.uba.ar> wrote:
>
> On Feb 21, 2008, at 7:55 PM, Roel van Dijk wrote:
>
>  > Your solutions allows a bit more but fails with the equivalent of
>  >
>  > def foo():
>  >   for i in range(10):
>  >     if i == 6:
>  >       return None
>  >
>  > The loop context 'overwrites' the function context which makes the
>  > return statement illegal. I think I need a type level list.
>
>  i see. how about this?
>
>  if_ = If [(IntLit 6, Suite [] [Break])] (Just $ Suite [] [Return])
>  while_ = While (IntLit 6) (Suite [] [if_]) Nothing
>  while2_ = While (IntLit 6) (Suite [] [Return]) Nothing
>  foo = FunDecl $ Suite [] [while_, while2_]
>
>  p = Program [foo]
>
>
>  newtype Ident = Id String
>
>  data BinOp = Add
>             | Sub
>
>  data Exp = IntLit Integer
>           | BinOpExp BinOp Exp Exp
>
>  data Ctx reqloop reqfun
>  data True
>  data False
>
>  data Statement ctx where
>    If      :: [(Exp, Suite (Ctx reqloop reqfun))]
>            -> Maybe (Else (Ctx reqloop reqfun))
>            -> Statement (Ctx reqloop reqfun)
>    While   :: Exp
>            -> (Suite (Ctx True reqfun))
>            -> Maybe (Else (Ctx True reqfun))
>            -> Statement (Ctx reqloop reqfun)
>    Pass    :: Statement (Ctx reqloop reqfun)
>    Break   :: Statement (Ctx True reqfun)
>    Return  :: Statement (Ctx reqloop True)
>    FunDecl :: Suite (Ctx False reqfun) -> Statement (Ctx False False)
>
>  newtype Global = Global [Ident]
>
>  data Suite ctx = Suite [Global] [Statement ctx]
>
>  type Else ctx = Suite ctx
>
>  newtype Program = Program [Statement (Ctx False False)]

Ah, you set a specific context when needed. Very nice. Although I had
to remove the Ctx type. Otherwise I need pattern matching at the type
level to bind the reqLoop and reqFun type variables (is such a thing
even possible?):

  data Statement (Ctx reqLoop reqFun) where ....

Now I simple pass 2 type variables to my statements:

  data Statement reqLoop reqFun where ....

I now have a complete Python AST and pretty printer. Onwards towards a parser!

Thanks again,
Roel


More information about the Haskell-Cafe mailing list