(Again, sorry if you've seen this -- I think maybe some people have missed
this.)
Hi,
I'm working on a large open-source grammar and I've hit a problem with nested
composite grammars. In short, "single inheritance" rule overriding in nested
composite grammars does not work like inheritance in Java. I think this is a
bug. It does not depend on the grammars being large.
Here's a brief example. Three grammars G1, G2, and G3 are "nested" in the sense
that G3 imports G2 and G2 imports G1. A rule is defined in G1 and then
overridden in G2. When G3 imports G2 I expect it to get the version of the rule
defined in G2. In fact, ANTLR uses the rule from G1. (More precisely,
G3Parser.java delegates the rule to G3_G2_G1.java rather than to G3_G2.java.)
The example grammars and associated lexer are:
----------------------
lexer grammar L;
T1: '1';
T2: '2';
T3: '3';
T4: '4';
----------------------
parser grammar G1;
s: a | b;
a: T1;
b: T2;
----------------------
parser grammar G2;
import G1;
a: T3;
----------------------
grammar G3;
import G2;
b: T4;
----------------------
Using ANTLRWorks 1.4 containing ANTLR 3.2, when I generate these grammars and
examine the file "G3Parser.java", I see the following lines of code for
delegating methods:
----------------------
// Delegated rules
public void s() throws RecognitionException { gG1.s(); }
public void a() throws RecognitionException { gG1.a(); }
----------------------
I think the last of these lines should say "gG2.a()"! The generated Java source
will not compile.
Scott Warren
List: http://www.antlr.org/mailman/listinfo/antlr-interest
Unsubscribe:
http://www.antlr.org/mailman/options/antlr-interest/your-email-address
--
You received this message because you are subscribed to the Google Groups
"il-antlr-interest" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/il-antlr-interest?hl=en.