[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