public virtual void ImportGrammar( IToken grammarNameToken, string label )
{
string grammarName = grammarNameToken.Text;
//[email protected]("import "+gfile.getName());
string gname = grammarName + GrammarFileExtension;
TextReader br = null;
try
{
string fullName = Tool.GetLibraryFile( gname );
if (!File.Exists(fullName))
{
gname = grammarName + AltGrammarFileExtension;
fullName = Tool.GetLibraryFile(gname);
}
//FileReader fr = new FileReader( fullName );
//br = new BufferedReader( fr );
br = new StringReader( System.IO.File.ReadAllText( fullName ) );
Grammar delegateGrammar = null;
delegateGrammar = new Grammar( Tool, gname, composite );
delegateGrammar.label = label;
AddDelegateGrammar( delegateGrammar );
delegateGrammar.ParseAndBuildAST( br );
delegateGrammar.AddRulesForSyntacticPredicates();
if ( !ValidImport( delegateGrammar ) )
{
ErrorManager.GrammarError( ErrorManager.MSG_INVALID_IMPORT,
this,
grammarNameToken,
this,
delegateGrammar );
return;
}
if ( this.type == GrammarType.Combined &&
( delegateGrammar.name.Equals( this.name + grammarTypeToFileNameSuffix[(int)GrammarType.Lexer] ) ||
delegateGrammar.name.Equals( this.name + grammarTypeToFileNameSuffix[(int)GrammarType.Parser] ) ) )
{
ErrorManager.GrammarError( ErrorManager.MSG_IMPORT_NAME_CLASH,
this,
grammarNameToken,
this,
delegateGrammar );
return;
}
if ( delegateGrammar.grammarTree != null )
{
// we have a valid grammar
// deal with combined grammars
if ( delegateGrammar.type == GrammarType.Lexer && this.type == GrammarType.Combined )
{
// ooops, we wasted some effort; tell lexer to read it in
// later
LexerGrammarTemplate.SetAttribute( "imports", grammarName );
// but, this parser grammar will need the vocab
// so add to composite anyway so we suck in the tokens later
}
}
//[email protected]("Got grammar:\n"+delegateGrammar);
}
catch ( IOException ioe )
{
ErrorManager.Error( ErrorManager.MSG_CANNOT_OPEN_FILE,
gname,
ioe );
}
finally
{
if ( br != null )
{
try
{
br.Close();
}
catch ( IOException ioe )
{
ErrorManager.Error( ErrorManager.MSG_CANNOT_CLOSE_FILE,
gname,
ioe );
}
}
}
}