Решить левую рекурсию грамматики с сохранением иерархии дерева разбора

Необходимо, с использованием 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   

Как мне следует переписать грамматику, чтоб получить ту же структуру дерева разбора?


Ответы (0 шт):