Here is the kind of practical example I need to handle (again, this is an existing, very ambiguous language, nothing I can do about that): I need
call myFunc on 2 3 to parse as Concatenate(myFunc(2), 3) call myFunc on 2 "3" to parse as myFunc("23) Concat has higher precedence than "call", but it must not trigger in the first case because neither 2 or 3 are string literals... Franck ________________________________ From: Jim Idle [via ANTLR] <ml-node+s1301665n7009129...@n2.nabble.com> To: franck102 <franck...@yahoo.com> Sent: Friday, November 18, 2011 6:47 PM Subject: Re: String concatenation expression rule 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: [hidden email] [mailto:antlr-interest- > [hidden email]] On Behalf Of franck102 > Sent: Friday, November 18, 2011 8:53 AM > To: [hidden email] > 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- > [hidden email]> > To: franck102 <[hidden email]> > 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 ________________________________ 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-tp7007921p7009129.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-tp7007921p7013416.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 -- 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.