This is a response to Justin Chases's e-mail on the OMeta mailing list ("indirect left recursion woes"). The complete message is below: How can you author a grammar that can parse these: y()[0] y[0]() y[0][1]()[2] Without indirect left recursion? Callable = ?? Index = Callable "[" "0".."9"+ "]", Invoke = Callable "(" ")", Reference = "a".."z" -- Justin Chase http://www.justnbusiness.com How about this? ometa P <: Parser { indexOrInvocation = indexOrInvocation:a "[" index:i "]" -> ["index", a, i] | indexOrInvocation:f "(" ")" -> ["call", f] | reference, index = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9", reference = "x" | "y" | "z" } And here's how you would parse your examples: P.matchAll("y()[0]", "indexOrInvocation") P.matchAll("y[0]()", "indexOrInvocation") P.matchAll("y[0][1]()[2]", "indexOrInvocation") Cheers, Alex