[stringtemplate-interest] Error on super reference in if
Terence Parr
parrt at cs.usfca.edu
Fri Aug 17 13:26:41 PDT 2007
Interesting...thanks for the fix. It actually should be:
s.setNativeGroup(self.getNativeGroup());
not subtemplate.setN...
I'll add the unit test. with my mods.
Thanks,
Ter
On Aug 17, 2007, at 4:05 AM, Thomas Brandon wrote:
> In String Template 3.1b1 using a super reference in an if block
> results in:
> exception java.lang.NullPointerException
> at
> org.antlr.stringtemplate.StringTemplateGroup.getEmbeddedInstanceOf
> (StringTemplateGroup.java:413)
>
> The problem is that nativeGroup is not set in the sub-templates
> created for if\else blocks.
> Adding subtemplate.setNativeGroup(self.getNativeGroup()); (and a
> similar line for elseSubTemplate) to the initialisation of the
> template in the action rule of template.g seems to fix the issue. Unit
> tests seemed to run with no new errors after the change and it seems
> to use the right group for template lookups (as in rule2 in the test
> case).
>
> A test case to go in TestStringTemplate is:
> public void testSuperReferenceInIf() throws Exception {
> String superGroupString =
> "group superG;" + newline +
> "rule1(attr) ::= \"<attr>\"" + newline +
> "rule2(attr) ::= \"<rule3()><attr>\"" + newline +
> "rule3() ::= \"super\""
> ;
> StringTemplateGroup superGroup = new StringTemplateGroup(
> new StringReader(superGroupString),
> AngleBracketTemplateLexer.class);
> String subGroupString =
> "group subG;\n" +
> "rule1(attr) ::= \"<if(attr)><super.rule1(attr)><endif>\"" +
> newline +
> "rule1b(attr) ::= \"<if(!attr)><else><super.rule1(attr)><endif>\""
> + newline +
> "rule2(attr) ::= \"<if(attr)><super.rule2(attr)><endif>\"" +
> newline +
> "rule3() ::= \"sub\""
> ;
> StringTemplateGroup subGroup = new StringTemplateGroup(
> new StringReader(subGroupString), AngleBracketTemplateLexer.class);
> subGroup.setSuperGroup(superGroup);
> StringTemplate rule1 = subGroup.getInstanceOf("rule1");
> rule1.setAttribute("attr", "val");
> assertEquals("val", rule1.toString());
> StringTemplate rule1b = subGroup.getInstanceOf("rule1b");
> rule1b.setAttribute("attr", "val");
> assertEquals("val", rule1b.toString());
> StringTemplate rule2 = subGroup.getInstanceOf("rule2");
> rule2.setAttribute("attr", "val");
> assertEquals("subval", rule2.toString());
> }
>
> Tom.
> _______________________________________________
> stringtemplate-interest mailing list
> stringtemplate-interest at antlr.org
> http://www.antlr.org:8080/mailman/listinfo/stringtemplate-interest
More information about the stringtemplate-interest
mailing list