/** Create NFA, DFA and generate code for grammar. * Create NFA for any delegates first. Once all NFA are created, * it's ok to create DFA, which must check for left-recursion. That check * is done by walking the full NFA, which therefore must be complete. * After all NFA, comes DFA conversion for root grammar then code gen for * root grammar. DFA and code gen for delegates comes next. */ protected virtual void GenerateRecognizer( Grammar grammar ) { string language = (string)grammar.GetOption( "language" ); if ( language != null ) { CodeGenerator generator = new CodeGenerator( this, grammar, language ); grammar.CodeGenerator = generator; generator.Debug = Debug; generator.Profile = Profile; generator.Trace = Trace; // generate NFA early in case of crash later (for debugging) if ( Generate_NFA_dot ) { GenerateNFAs( grammar ); } // GENERATE CODE generator.GenRecognizer(); if ( Generate_DFA_dot ) { GenerateDFAs( grammar ); } IList<Grammar> delegates = grammar.GetDirectDelegates(); for ( int i = 0; delegates != null && i < delegates.Count; i++ ) { Grammar @delegate = (Grammar)delegates[i]; if ( @delegate != grammar ) { // already processing this one GenerateRecognizer( @delegate ); } } } }