packages feed

uuagc-0.9.54: src-ag/TfmToMirage.ag

INCLUDE "AbstractSyntax.ag"
INCLUDE "Expression.ag"
INCLUDE "Order.ag" -- for dependencies

imports {
import AbstractSyntax
import qualified Data.Map as Map
import Pretty
import TokenDef
import qualified MirageSyntax as Mirage
}

{
typeToMirage :: Type -> Mirage.Type
typeToMirage x = case x of
  Haskell y -> Mirage.Haskell y
  NT y ys _ -> Mirage.NT (getName y) ys
  Self      -> Mirage.Self
}

SEM Grammar [ || mirage:{Mirage.Grammar} ]
  | Grammar lhs.mirage = Mirage.Grammar @nonts.mirages

SEM Nonterminals [ || mirages:{[Mirage.Nonterminal]} ]
  | Cons lhs.mirages = @hd.mirage : @tl.mirages
  | Nil  lhs.mirages = []

SEM Nonterminal [ || mirage:{Mirage.Nonterminal} ]
  | Nonterminal lhs.mirage
      = Mirage.Nonterminal
          (getName @nt)
          (map getName @params)
          (Map.foldrWithKey (\k x xs -> Mirage.Attribute (getName k) (typeToMirage x) : xs) [] @inh)
          (Map.foldrWithKey (\k x xs -> Mirage.Attribute (getName k) (typeToMirage x) : xs) [] @syn)
          @prods.mirages

SEM Productions [ || mirages:{[Mirage.Production]} ]
  | Cons lhs.mirages = @hd.mirage : @tl.mirages
  | Nil  lhs.mirages = []

SEM Production [ || mirage:{Mirage.Production} ]
  | Production lhs.mirage
      = Mirage.Production (getName @con) @children.mirages @rules.mirages

SEM Children [ || mirages:{[Mirage.Child]} ]
  | Cons lhs.mirages = @hd.mirage : @tl.mirages
  | Nil  lhs.mirages = []

SEM Child [ || mirage:{Mirage.Child} ]
  | Child lhs.mirage = Mirage.Child (getName @name) (typeToMirage @tp)

SEM Rules [ || mirages:{[Mirage.Rule]} ]
  | Cons lhs.mirages = @hd.mirage : @tl.mirages
  | Nil  lhs.mirages = []

-- Partly from Order

SEM Rule [ || mirage:{Mirage.Rule} ]
  | Rule lhs.mirage
      = Mirage.Rule
          [Mirage.Address (getName field) (getName attr) | (field,attr,_) <- @pattern.patternAttrs]
          ([Mirage.Address (getName field) (getName attr) | (field,attr) <- @rhs.usedAttrs]
            ++ [ Mirage.Address (getName _LOC) (getName attr) | attr <- @rhs.usedLocals ++ @rhs.usedFields])
          @explicit
          @origin
          (disp (@pattern.pp >-< indent 1 (text "= " >|< vlist @rhs.lns)) 0 "")

-- Partly from Visage

SEM Expression [ | | lns : {[String]} ]
  | Expression  lhs.lns = showTokens . tokensToStrings $ @tks

-- From PrintCode

SEM Patterns [ | | pps : {[PP_Doc]} ]
  | Cons lhs.pps = @hd.pp : @tl.pps
  | Nil  lhs.pps = []

SEM Pattern [ | | pp:PP_Doc ]
  | Constr  lhs.pp     = pp_parens $ @name >#< hv_sp @pats.pps
  | Product lhs.pp     = pp_block "(" ")" "," @pats.pps
  | Alias   loc.ppVar  = pp @field >|< "." >|< pp @attr
            loc.ppVarBang = @loc.ppVar
            lhs.pp     = if @pat.isUnderscore
                          then @loc.ppVarBang
                          else @loc.ppVarBang >|< "@" >|< @pat.pp
  | Irrefutable lhs.pp = text "~" >|< pp_parens @pat.pp
  | Underscore lhs.pp  = text "_"

SEM Pattern [ | | isUnderscore:{Bool}]
 | Constr      lhs.isUnderscore = False
 | Product     lhs.isUnderscore = False
 | Alias       lhs.isUnderscore = False
 | Underscore  lhs.isUnderscore = True

ATTR Pattern Patterns [ belowIrrefutable : Bool | | ]
SEM Rule
  | Rule pattern.belowIrrefutable = False
SEM Pattern
  | Irrefutable pat.belowIrrefutable = True