[antlr-interest] Python target @members problem

Benjamin Niemann pink at odahoda.de
Fri Sep 19 11:57:56 PDT 2008


Hi Henrique,

On Thu, Sep 18, 2008 at 4:35 AM, Henrique <hjrnunes at student.dei.uc.pt> wrote:
> I'm building a parser that should generate python code. The problem is that
> the variables that I define in the @members section are not recognized in
> the rules themselves.
> For instance, I have this:
> grammar cfdg_py;
> options{
> language=Python;
> }
> ...
> @members {
> names=[]
> rule_name = []
> }
> ...
> rule
> @init{
> rule_name=[]
> print "NEW RULE"
> }
> @after{
> names.append(rule_name)
> print "END RULE: " + str(names)
> }
> : RULE USER_STRING (USER_RATIONAL)? LEFTBRACKET buncha_replacements?
> RIGHTBRACKET {rule_name.append($USER_STRING.text);}
> ;
> I get a NameError: global name 'names' is not defined in the first line of
> the @after section.
> How do I make sure the variables are defined?
> I've tried inserting the semicolons as advised in the wiki but it didn't
> work. The antlr python documentation is really scarce so I can't figure it
> out.
> I'm attaching the whole grammar with this. Using ANTLR 3.1 on Windows.

Things are a little bit different in Python than for Java. For
instance attributes you have to use @init, e.g.

@init {
self.name = []
self.rule_name = []
}

And when referencing those, you have to use self.name etc.
@members can be used for class attributes and member functions.

-Ben


More information about the antlr-interest mailing list