[antlr-interest] Need help vector in C generated code
Jeffrey Newman
jeffn at photorepo.com
Tue Jan 11 07:39:50 PST 2011
First of all thanks for the code sample.
This is a help, although I need to figure out where to put it, and how to call.
As per your and Jim's comment that my question was not clear,
I will try to clarify it now.
(As to Jim's comment that I don't know what I'm doing.
Well.... If I did I would not be asking for help.)
On page 132 of Ter's book (pdf version)
When a rule matches elements repeatedly, translators commonly need
to build a list of these elements. As a convenience, ANTLR provides the
+= label operator that automatically adds all associated elements to an New in v3.
ArrayList, whereas the = label operator always refers to the last element
matched. The following variation of rule decl captures all identifiers into
a list called ids for use by actions:
decl: type ids+=ID (',' ids+=ID)* ';' ; // ids is list of ID tokens
my rule is a little different (and simplitied)
type_name
: name+=ID+ (LPAREN size1=signed_number (COMMA size2=signed_number)? RPAREN)?
{
}
;
The key point here being name += ID+
The relevant generated code looks like:
// /home/jeffn/Development/antlr/trunk/edu/sqliteGui/SQLite.g:207:11: name+= ID
{
name = (pANTLR3_COMMON_TOKEN) MATCHT(ID, &FOLLOW_ID_in_type_name1275);
if (HASEXCEPTION())
{
goto ruletype_nameEx;
}
if (list_name == NULL)
{
list_name=ctx->vectors->newVector(ctx->vectors); <<<<<<------- Key point.
}
list_name->add(list_name, name, NULL);
}
The key point here, in the line below (and marked above). is the ctx->vectors.
list_name=ctx->vectors->newVector(ctx->vectors)
There is no "vectors" element in the ctx structure.
SO, MY FOLLOW UP QUESTION ARE:
HOW DO I PROPERLY ADD THE vectors ELEMENT TO THE THE ctx STRUCTURE?
HOW TO I INIT THE ctx ->vectors TO POINT TO MY NEWLY MINTED vectors function.
AND HOW TO USE IT IN SUBSEQUENT RULES.
(Or more precisely in my case. Since I can simply build a string and pass it back to the calling rule.
How do I access the vector's element (eg the individual string of the compound type name (ie var char)
to build a composite (concatenated) string.)
--------
One of my questions is why did the code generator generate code for functions it did not create?
--------
Some things that I have tried.
I have looked and read, and reread the documentation.
I have grepped and prayed over the example code and grammars.
I have searched the email archives and tried to find some info in the wiki.
I have googled everything I can think of.
All to no avail.
I noticed a lot of chatter about code hoisting and C# and global init.
But I have to admit I'm enough of a language guy to intricacies, nuances, and
inter-language complications that I read about.
I created a rule;
vectors: ;
This indeed put a vectors element in the ctx structure
(I thought I was home free, all I would have to do was initialize with the newly minted vectors function that Stanley gave me.)
So I added an
@members {
myVectors() {}
}
@init {
ctx->vectors = myVectorr;
}
And I found that the generated code did indeed contain the myVectors routine.
And nothing was generated to update the ctx->vectors element.
Clearly the my idea of an @init outside of a rule being executed was wrong.
So, now I am back asking for more help.
I hope this is more clear.
Thanks in advance (or should I say part way through)
Jeffrey
More information about the antlr-interest
mailing list