Hi All, I've been using Heterogeneous AST node construction with good success, following the nicely laid out example at
http://www.antlr.org/wiki/display/ANTLR3/Tree+construction#Treeconstruction-heterogeneous though I've run into a minor snag, for which there is a workaround. The class name that follows the token name in angle brackets can't itself contain angle brackets. So template/generic classes can't be created in this way. The workaround is always to just make individual classes for each combination of types you'd use in the templates, but it would be nice if I could keep the whole specification in the ANTLR grammar rather than having to make classes that just wrap my generic classes. For example, a node type UnaryOperatorNode<double> can't be emitted by ANTLR because if you enter: unaryFunction: ABS -> ABS<UnaryOperatorNode<double>>[$ABS,operand => Math.Abs(operand)] ; you get an ANTLR error: [08:39:50] ANTLR Parser Generator Version 3.2 Sep 23, 2009 12:02:23 [08:39:50] error(100): CalcValueFormula.g:141:14: syntax error: antlr: CalcValueFormula.g:141:14: unexpected token: < [08:39:50] error(100): CalcValueFormula.g:141:46: syntax error: antlr: CalcValueFormula.g:141:46: unexpected token: > but without the type parameter on the class name, you're fine. If I make a wrapper class DoubleUnaryOperatorNode: UnaryOperatorNode<double> in my code, then I can use it in the above construction without problems. I have tried escaping with backslashes, no luck. Not a big deal, the workaround is easy, this is just an FYI. On a related note, I thought there was a similar problem with using square brackets within the parameter list to the constructor, but I was wrong. You do get an error if you don't escape, but you must only escape the CLOSING bracket, not both. So unaryFunction: ABS -> ABS<DoubleUnaryOperatorNode>[$ABS,operand => Math.Abs(operand[0])]; fails, and unaryFunction: ABS -> ABS<DoubleUnaryOperatorNode>[$ABS,operand => Math.Abs(operand\[0\])]; fails, but unaryFunction: ABS -> ABS<DoubleUnaryOperatorNode>[$ABS,operand => Math.Abs(operand[0\])]; works fine. 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.
