import edu.neu.ccs.demeter.dj.*; import java.util.*; FileSystem = CompoundFile EOF. File : SimpleFile | CompoundFile common FileName. SimpleFile = "simple". CompoundFile = "compound" PList(File)[ CompoundFile ]. Commands = "("List(Command) ")". Command : Simple. Simple : MakeDirectory | ChangeDirectoryUp | ChangeDirectoryDown | RecursiveCopy | DiskUsage | Find | Echo | SymbolicLink | RemoveDirectory | CreateEmptyFile | RemoveFile. MakeDirectory = "mkdir" DirectoryName. ChangeDirectoryUp = "cd ..". ChangeDirectoryDown = "cd" DirectoryName. RecursiveCopy = "cp -r ../* ." . DiskUsage = "du .". SymbolicLink = "ln -s" FileName FileName. RemoveDirectory = "rmdir" DirectoryName. // "touch f" creates an empty file called f. CreateEmptyFile = "touch" FileName. RemoveFile = "rm" FileName. Find = "find . -name" DirectoryName "-print". Echo = "echo" Message. FileName = Ident. DirectoryName = Ident. Message = String. PList(S) ~ "(" {S} ")". List(S) ~ {S}. CommandsVisitor = extends Visitor. FindVisitor = Ident MyDisplayVisitor boolean extends Visitor. MyDisplayVisitor = String CompoundFile Stack extends Visitor. DiskUsageVisitor = MyDisplayVisitor extends Visitor. Main = .