anchor.diff:              |> List.map getProdKey
               |> String.concat ";"
               |> fun res -> "[|" + res + "|]"
  -        |PSome x -> "(" + getProdKey x + ")+"
  -        |POpt x -> "(" + getProdKey x + ")?"
       module' + ":" + getProdKey key
   
   /// <summary>
  
positive.code:         | PSome body -> PSome <| replace body
          | POpt body  -> POpt  <| replace body
          | PMany body -> PMany <| replace body
          | PRef(name, attrs) as prev ->
              prev |> tryReplaceActual formalToAct (Source.toString name)
          | PAlt (l, r) -> PAlt(replace l, replace r)
          | PSeq (ruleList, actionCode, l) ->
              PSeq (ruleList |> List.map (fun x ->  {x with rule = replace x.rule})
                      , actionCode, l)
          | PLiteral _ as literal -> literal
          | PToken _ as token -> token
          | PMetaRef (name, attrs, metaArgs) -> 
              if metaArgs.IsEmpty then
                  PRef(name, attrs) |> tryReplaceActual formalToAct (Source.toString name)
  
negative.code:             |> List.fold (fun (accMeta, accRes) body ->
                  //printfn "%A" body
                  expandBody body module' metaRules expanded accRes
                  |> fun (newBody, newAccRes) -> (newBody::accMeta, newAccRes)
              ) ([], resRuleList)
              |> applyToRes List.rev
          // TODO catch exception
  