import edu.neu.ccs.demeter.dj.*; import java.util.*; Exps = CommaList(Exp) [*l "equations" CommaList(Equation)]. Exp : Simple | Compound | QuantifierCompound. Simple : Forward | Backward | Sequential | Later | UpOverDown . Forward = "->" ClassName ["edge" EdgeName] [ Steps] ClassName. Backward = "<-" ClassName ["edge" EdgeName] [ Steps] ClassName. Sequential = "seq" ClassName CommaList(ClassName). Later = "->X<-" ClassName ["edge" EdgeName] [ Steps] ClassName. UpOverDown = "=>X<=" ClassName ["edge" EdgeName] [ Steps] ClassName. Exists = "exists" CommaList(ClassName) *l Exp. Steps: Unlimited | Limited. // if steps is absent, the default meaning is unlimited Unlimited = "*". Limited = Integer. Compound = Op CommaList(Exp). Op : Join | Union. Join = "join". Union = "union". QuantifierCompound : Exists. Equation = *l Exp "=" *l Exp. ClassName = Ident. EdgeName = Ident. CommaList(S) ~ "(" *l + S {"," *l S *s} - *l ")" . Main = String.