Don't make the parser trap that error as a syntax error. It is a semantic error and so you should parser any operand type, then reject the incorrect types with code.
jim > -----Original Message----- > From: antlr-interest-boun...@antlr.org [mailto:antlr-interest- > boun...@antlr.org] On Behalf Of franck102 > Sent: Friday, November 18, 2011 8:53 AM > To: antlr-interest@antlr.org > Subject: Re: [antlr-interest] String concatenation expression rule > > Hi Bart, thanks very for the quick reply. > > I should have made it clear that concatenating is only legal if at > least one of the operands is a string literal - that is where I am > having an issue. In other terms the input > > 3 3<EOF> > should cause a syntax error, while > 3 "" 3<EOF> > should not (and evaluates to the string "33") > > > Franck > > > > ________________________________ > From: Bart Kiers [via ANTLR] <ml- > node+s1301665n7008016...@n2.nabble.com> > To: franck102 <franck...@yahoo.com> > Sent: Friday, November 18, 2011 1:11 PM > Subject: Re: String concatenation expression rule > > > On Fri, Nov 18, 2011 at 12:39 PM, franck102 <[hidden email]> wrote: > > > > I am writing a grammar for a fairly complex expression language, and > in > > particular I need to support string concatenation which is performed > simply > > by separating string literals with a space; and which automatically > > converts > > other expressions to a string if needed to concatenate: > > "a" "b" -> "ab" > > 2+3 "mm" -> "5mm" > > > > I suspect I could use predicates to write a rule like this: > > > > concatExpression > > : ( expression | STRING_LITERAL )+ { apply only if at > least > > one of the elements is a string literal }? > > > > Is there a way to achieve this? The alternative formulations I can > think of > > are pretty messy... > > > > As far as I understand it, you don't need any predicate. I see a > concat-expression has a lower precedence than addition, in which case > this > could do the trick: > > grammar T; > > options { > output=AST; > } > > tokens { > ROOT; > CONCAT; > } > > parse > : (expression ';')* EOF -> ^(ROOT expression*) > ; > > expression > : (add -> add) (add+ -> ^(CONCAT add+))? > ; > > add > : atom (('+' | '-')^ atom)* > ; > > atom > : Number > | String > | '(' expression ')' -> expression > ; > > Number : '0'..'9'+ ('.' '0'..'9'+)?; > String : '"' ~'"'* '"'; > Space : ' ' {skip();}; > > You can test it with the following class: > > import org.antlr.runtime.*; > import org.antlr.runtime.tree.*; > import org.antlr.stringtemplate.*; > > public class Main { > public static void main(String[] args) throws Exception { > String src = "42 - 2; 2 + 3 \"mm\"; \"a\" \"b\" 4-3-2 \"c\"; \"pi = > \" > 3.14159;"; > TLexer lexer = new TLexer(new ANTLRStringStream(src)); > TParser parser = new TParser(new CommonTokenStream(lexer)); > CommonTree root = (CommonTree)parser.parse().getTree(); ; > System.out.println(new DOTTreeGenerator().toDOT(root)); > } > } > > Regards, > > Bart. > > List: http://www.antlr.org/mailman/listinfo/antlr-interest > Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your- > email-address > > > ________________________________ > > If you reply to this email, your message will be added to the > discussion below: > http://antlr.1301665.n2.nabble.com/String-concatenation-expression- > rule-tp7007921p7008016.html > To unsubscribe from String concatenation expression rule, click here. > NAML > > -- > View this message in context: > http://antlr.1301665.n2.nabble.com/String-concatenation-expression- > rule-tp7007921p7008934.html > Sent from the ANTLR mailing list archive at Nabble.com. > > List: http://www.antlr.org/mailman/listinfo/antlr-interest > Unsubscribe: http://www.antlr.org/mailman/options/antlr-interest/your- > email-address 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 il-antlr-inter...@googlegroups.com. To unsubscribe from this group, send email to il-antlr-interest+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/il-antlr-interest?hl=en.