In a nutshell, when you delete the immediate left recursion (when you look at it), you drop the recursive link and replace
A ::= A x | y
by
A ::= yx*
In your case, this means factoring on
msg: msg ( COMMA message | XOR msg | PERCENT IDENTIFIER ) | ( IDENTIFIER | IDENTIFIER LBRACKET msg RBRACKET | LBRACE msg RBRACE LBRACE atom RBRACE | IDENTIFIER PERCENT msg | LBRACKET msg RBRACKET ) ;
and replacing with
msg: ( IDENTIFIER | IDENTIFIER LBRACKET msg RBRACKET | LBRACE msg RBRACE LBRACE atom RBRACE | IDENTIFIER PERCENT msg | LBRACKET msg RBRACKET ) ( COMMA message | XOR msg | PERCENT IDENTIFIER )* ;
Wikipedia in left recursion explains this pretty well.
The ANTLR message you received is not related to left recursion. It says that ANTLR cannot decide between alternatives
msg_contents: msg_part | msg_part XOR msg_part | msg_part PERCENT msg_part ;
because everything starts with msg_part , which is recursive and therefore not regular, as is required for LL (*). However, this can be solved by left factoring. Also note that your attempt skipped the COMMA option.
source share