[antlr-interest] String concatenation expression rule

Jim Idle jimi at temporal-wave.com
Fri Nov 18 09:47:11 PST 2011


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-bounces at antlr.org [mailto:antlr-interest-
> bounces at antlr.org] On Behalf Of franck102
> Sent: Friday, November 18, 2011 8:53 AM
> To: antlr-interest at 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+s1301665n7008016h67 at n2.nabble.com>
> To: franck102 <franck102 at 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


More information about the antlr-interest mailing list