digraph {

  gfe [label = "file.gfe", style = "dashed", shape = "ellipse"];
  gfe -> gf1 [label = " MkConcrete", style = "dashed"];

gf1 [label = "file.gf", style = "solid", shape = "ellipse"];
gf1 -> gf2 [label = " LexGF", style = "solid"];

gf2 [label = "token list", style = "solid", shape = "plaintext"];
gf2 -> gf3 [label = " ParGF", style = "solid"];

gf3 [label = "source tree", style = "solid", shape = "plaintext"];
gf3 -> gf4 [label = " SourceToGrammar", style = "solid"];

  cf [label = "file.cf", style = "dashed", shape = "ellipse"];
  cf -> gf4 [label = " CF.PPrCF", style = "dashed"];

  ebnf [label = "file.ebnf", style = "dashed", shape = "ellipse"];
  ebnf -> gf4 [label = " CF.EBNF", style = "dashed"];


gf4 [label = "GF tree", style = "solid", shape = "plaintext"];
gf4 -> gf5 [label = " Extend", style = "solid"];

gf5 [label = "inheritance-linked GF tree", style = "solid", shape = "plaintext"];
gf5 -> gf6 [label = " Rename", style = "solid"];

gf6 [label = "name-resolved GF tree", style = "solid", shape = "plaintext"];
gf6 -> gf7 [label = " CheckGrammar", style = "solid"];

gf7 [label = "type-annotated GF tree", style = "solid", shape = "plaintext"];
gf7 -> gf8 [label = " Optimize", style = "solid"];

gf8 [label = "optimized GF tree", style = "solid", shape = "plaintext"];
gf8 -> gf9 [label = " GrammarToCanon", style = "solid"];

gf9 [label = "GFC tree", style = "solid", shape = "plaintext"];
gf9 -> gfc [label = " BackOpt", style = "solid"];

gfc [label = "optimized GFC tree", style = "solid", shape = "box"];
gfc -> gf11 [label = " PrintGFC", style = "solid"];

gf11 [label = "file.gfc", style = "solid", shape = "ellipse"];


  gfcc [label = "file.gfcc", style = "solid", shape = "ellipse"];
  gfc -> gfcc [label = " CanonToGFCC", style = "solid"];

  mcfg [label = "file.gfcm", style = "dashed", shape = "ellipse"];
  gfc -> mcfg [label = " PrintGFC", style = "dashed"];

  bnf [label = "file.cf", style = "dashed", shape = "ellipse"];
  gfc -> bnf [label = " CF.PrLBNF", style = "dashed"];

  happy [label = "file.y (Happy)", style = "dashed", shape = "ellipse"];
  bnf -> happy [label = " bnfc", style = "dashed"];

  bison [label = "file.y (Bison)", style = "dashed", shape = "ellipse"];
  bnf -> bison [label = " bnfc", style = "dashed"];

  cup [label = "parser.java (CUP)", style = "dashed", shape = "ellipse"];
  bnf -> cup [label = " bnfc", style = "dashed"];

  xml [label = "file.dtd (XML)", style = "dashed", shape = "ellipse"];
  bnf -> xml [label = " bnfc", style = "dashed"];

  cfg [label = "CFG tree", style = "solid", shape = "plaintext"];
  gfc -> cfg [label = " Conversions.GFC", style = "dashed"];

  cfgm [label = "file.cfgm", style = "dashed", shape = "ellipse"];
  cfg -> cfgm [label = " Conversions.GFC", style = "dashed"];

  srg [label = "Non-LR CFG", style = "solid", shape = "plaintext"];
  cfg -> srg [label = " Speech.SRG", style = "dashed"];

  gsl [label = "file.gsl", style = "dashed", shape = "ellipse"];
  srg -> gsl [label = " Speech.PrGSL", style = "dashed"]; 

  jsgf [label = "file.jsgf", style = "dashed", shape = "ellipse"];
  srg -> jsgf [label = " Speech.PrJSGF", style = "dashed"]; 

  fa [label = "DFA", style = "solid", shape = "plaintext"];
  cfg -> fa [label = " Speech.CFGToFiniteState", style = "dashed"];

  slf [label = "file.slf", style = "dashed", shape = "ellipse"];
  fa -> slf [label = " Speech.PrSLF", style = "dashed"];

}
