On Fri, Nov 18, 2011 at 12:39 PM, franck102 <franck...@yahoo.com> 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 -- 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.