Predictive parser you selected (LL(k)) means you will have to solve left-recursion problems. Algorithm for solving direct and indirect recursions is clearly described on wikipedia: http://en.wikipedia.org/wiki/Left_recursion Some info can be found in posts here on StackOverflow: http://stackoverflow.com/questions/2652060/removing-left-recursion http://stackoverflow.com/questions/2999755/removing-left-recursion-in-antlr http://stackoverflow.com/questions/4994036/left-recursion-elimination In human language (non-scientific :) "left-recursion problem" means you can't endlessly go into recursion with non-terminal (A -> Ab) again and again. At some time you HAVE TO feed parser algorithm with a terminal to breake a loop. In BNF this could look like: Recursion Problem: NT: NT T NT: T One solution: NT: T NT2 NT2: T NT2 NT2: For your grammar this could look like: DataType: PrimitiveDataType ArrayDimensions | ComplexDataType ArrayDimensions ArrayDimensions: [] ArrayDimensions | If your parser generator doesn't allow empty productions and/or if you want to process array types separately, try something like this: DataType: DataTypeName | ArrayDataType ArrayDataType: DataTypeName ArrayDimensions DataTypeName: PrimitiveDataType | ComplexDataType ArrayDimensions: [] | [] ArrayDimensions