public virtual void SortGrammarFiles() { //Console.Out.WriteLine( "Grammar names " + GrammarFileNames ); Graph<string> g = new Graph<string>(); foreach ( string gfile in GrammarFileNames ) { GrammarSpelunker grammar = new GrammarSpelunker( inputDirectory, gfile ); grammar.Parse(); string vocabName = grammar.TokenVocab; string grammarName = grammar.GrammarName; // Make all grammars depend on any tokenVocab options if ( vocabName != null ) g.AddEdge( gfile, vocabName + CodeGenerator.VocabFileExtension ); // Make all generated tokens files depend on their grammars g.AddEdge( grammarName + CodeGenerator.VocabFileExtension, gfile ); } List<string> sorted = g.Sort(); //Console.Out.WriteLine( "sorted=" + sorted ); GrammarFileNames.Clear(); // wipe so we can give new ordered list for ( int i = 0; i < sorted.Count; i++ ) { string f = (string)sorted[i]; if ( GrammarExtensions.Any( ext => f.EndsWith( ext, StringComparison.OrdinalIgnoreCase ) ) ) AddGrammarFile( f ); } //Console.Out.WriteLine( "new grammars=" + grammarFileNames ); }