[antlr-interest] Crash on rewrite

Mark Bednarczyk voytechs at yahoo.com
Sat Mar 10 10:18:30 PST 2007


I've stumbled onto the fact that if I assign a label to the option
productions, it works:

number
	:	h=Hex (s='l' | s='L') -> ^(INT64)
 	; 

With the labels in place ANTLR compiles the expression, and it works
correctly.

The above expression was greatly simplified to make a point, the actual
rewrite is much more complex. But it all works correctly:

snip...
	|	h=Hex (s='l' | s='L')? il32=isuLarge32 
		-> ^({adaptor.create(($s != null?INT64:INT32),
NplUtils.toDec($h.text, $il32.text))})
		
	|	h=Hex (s='l' | s='L')? il64=isuLarge64 
		-> ^({adaptor.create(($s != null?INT64:INT32),
NplUtils.toDec($h.text, $il64.text))})
	
	// Hexadecimal form  0x<VALUE>
	|	h=HexLiteral (s='l' | s='L')?
	    -> ^({adaptor.create(($s != null?INT64:INT32),
NplUtils.toDec($h.text, 16, 2))})
	    
	// Anybase form of <BASE>_<VALUE>
	|	a=AnyBase (s='l' | s='L')? il32=isuLarge32
		-> ^({adaptor.create(($s != null?INT64:INT32),
NplUtils.toDec($a.text, $il32.text))})

	|	a=AnyBase (s='l' | s='L')? il64=isuLarge64
		-> ^({adaptor.create(INT64, NplUtils.toDec($a.text,
$il64.text))})
snip...
isuLarge32
	: 'bit'  | 'bits'   // 1
	| 'nibble'| 'nibbles'// 4
	| 'byte' | 'bytes'  // 10e1 
	| 'deca'            // 10e1
	| 'hecto'           // 10e2
	| 'kilo' | 'Kibit'  // 10e3 & IEC kibibit
	| 'mega' | 'Mibit'  // 10e6 & IEC mebibit
	;
isuLarge64
	: 'giga' | 'Gibit'  // 10e9  & IEC gibibit
	| 'tera' | 'Tibit'  // 10e12 & IEC tebibit
	| 'peta' | 'Pibit'  // 10e15 & IEC pebibit
	| 'exa'  | 'Eibit'  // 10e18 & IEC exbibit
	| 'zetta'| 'Zibit'  // 10e21 & IEC zebibit
	| 'yotta'| 'Yobit'  // 10e24 & IEC yobibit
	;

Cheers,
mark....

> -----Original Message-----
> From: antlr-interest-bounces at antlr.org 
> [mailto:antlr-interest-bounces at antlr.org] On Behalf Of Mark Bednarczyk
> Sent: Saturday, March 10, 2007 7:57 AM
> To: 'ANTLR Interest'
> Subject: [antlr-interest] Crash on rewrite
> 
> Anyone know why this throws an exception everytime:
> 
> [antlr:antlr3] ANTLR Parser Generator  Version 3.0b6 (Jan 31, 2007)
> 1989-2007
> [antlr:antlr3] error(10):  internal error:
> C:\jnetstream\NplLanguage\src\antlr\Npl.g :
> java.lang.IllegalArgumentException: Can't find template 
> matchSetTrack.st [antlr:antlr3] 
> org.antlr.stringtemplate.StringTemplateGroup.lookupTemplate(St
> ringTemplateGr
> oup.java:485)
> [antlr:antlr3]
> org.antlr.stringtemplate.StringTemplateGroup.getInstanceOf(Str
> ingTemplateGro
> up.java:372)
> [antlr:antlr3]
> org.antlr.stringtemplate.StringTemplateGroup.getInstanceOf(Str
> ingTemplateGro
> up.java:384)
> ...
> 
> On the following PARSER rule::
> 
> number
> 	:	h=Hex ('l'|'L') -> ^(INT64)
> 	;
> 
> 
> When its broken out, it works fine::
> 
> number
> 	:	h=Hex 'l' -> ^(INT64)
> 	|	h=Hex 'L' -> ^(INT64)
> 	;
> 
> Without the rewrite part '->' the combined rule matches as 
> expected. Only throws exception when the rewrite is present.
> 
> I've tried everything I know and started breaking all the 
> rules out in to sperate lines, but that produces a lot of 
> redundancy in the generated code.
> 
> Cheers,
> mark...
> 
> 
> 




More information about the antlr-interest mailing list