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

-- 
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.

Reply via email to