[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