[antlr-interest] Is it possible to tell whether the source or header is being generated?

Luke A. Guest laguest at archangeli.co.uk
Sat May 26 09:26:19 PDT 2007


On Sat, 2007-05-26 at 09:15 -0700, Terence Parr wrote:
> On May 26, 2007, at 9:07 AM, Luke A. Guest wrote:
> 
> > Hi,
> >
> > basically, I was just wondering if in any template in the  
> > <language>.stg
> > file it is possible to determine whether the header orthe source is
> > currently being generated? i.e. inside lexer()?
> 
> Well, shouldn't they be different templates?  I can't remember but  
> should be a headerFile vs parser vs lexer etc...

So, I should do something like this then?

outputFile(LEXER,PARSER,TREE_PARSER, actionScope, actions,
           docComment, recognizer,
           name, tokens, tokenNames, rules, cyclicDFAs,
	   bitsets, buildTemplate, buildAST, rewrite, profile,
	   backtracking, synpreds, memoize, numRules,
	   fileName, ANTLRVersion, generatedTimestamp, trace,
	   scopes, superClass, literals) ::=
<<
-- $ANTLR <ANTLRVersion> <fileName> <generatedTimestamp>

<@imports>
with Ada.Characters.Latin_1;
<if(TREE_PARSER)>
--import org.antlr.runtime.tree.*;
<endif>
--import java.util.Stack;
--import java.util.List;
--import java.util.ArrayList;
<if(backtracking)>
--import java.util.Map;
--import java.util.HashMap;
<endif>
<@end>

<docComment>

<if(LEXER)>
package body <recognizer.grammar.name>_Lexer is
<recognizer>
end <recognizer.grammar.name>_Lexer;
<endif>

<if(PARSER)>
package body <recognizer.grammar.name>_Parser is
<recognizer>
end <recognizer.grammar.name>_Parser;
<endif>

<if(TREE_PARSER)>
package body <recognizer.grammar.name>_Parser is
<recognizer>
end <recognizer.grammar.name>_Parser;
<endif>
>>

/** The header file; make sure to define headerFileExtension() below */
headerFile(LEXER,PARSER,TREE_PARSER, actionScope, actions,
           docComment, recognizer,
           name, tokens, tokenNames, rules, cyclicDFAs,
	   bitsets, buildTemplate, buildAST, rewrite, profile,
	   backtracking, synpreds, memoize, numRules,
	   fileName, ANTLRVersion, generatedTimestamp, trace,
	   scopes, superClass, literals) ::=
<<
-- $ANTLR <ANTLRVersion> <fileName> <generatedTimestamp>

<if(LEXER)>
package body <recognizer.grammar.name>_Lexer is

<recognizer>

end <recognizer.grammar.name>_Lexer;
<endif>

<if(PARSER)>
package body <recognizer.grammar.name>_Parser is

<recognizer>

end <recognizer.grammar.name>_Parser;
<endif>

<if(TREE_PARSER)>
package body <recognizer.grammar.name>_Parser is

<recognizer>

end <recognizer.grammar.name>_Parser;
<endif>
>>


lexer(grammar, name, tokens, scopes, rules, numRules, labelType="Token",
      filterMode) ::= <<
  -- This is the Ada tagged type (class in C++/Java parlance).
  type <grammar.name>_Lexer_Type is new ANTLR.Lexer.Lexer_Type with
private;

  ...
>>

Should I define the lexer "type" inside the headerFile() template and
have the functions for the lexer handled inside the lexer() template?

Thanks,
Luke.





More information about the antlr-interest mailing list