Решить левую рекурсию грамматики с сохранением иерархии дерева разбора
Необходимо, с использованием ANTLR3, написать грамматику, которая обработает многомерные массивы. Исходный вид следующий:
builtin -> 'int' | 'float' | 'double' | 'string';
typeRef -> builtin | array;
array -> typeRef '[]';
Дерево разбора такой грамматики для строки int[][][]
выглядит следующим образом:
typeRef
/ \
/ \
typeRef []
/ \
/ \
typeRef []
/ \
/ \
builtin []
|
|
int
Но в данном случае между typeRef
и array
присутствует левая рекурсия. Я переписал грамматику следующим образом:
builtin -> 'int' | 'float' | 'double' | 'string';
typeRef -> builtin | array;
array -> builtin ('[]')+;
Однако в таком случае дерево разбора станет плоским:
typeRef
/ | | \
/ | | \
builtin [] [] []
|
|
int
Как мне следует переписать грамматику, чтоб получить ту же структуру дерева разбора?