ANTLR4 самостоятельная и взаимная левая рекурсия

Есть ли простое преобразование или обходной путь, чтобы это работало в ANTLR4?

a : a p
  | b q
  | c
  ;

b : b r
  | a s
  | d
  ;

То есть a и b являются самолево-рекурсивными и взаимно-лево-рекурсивными, остальные правила (c, d, p, q, r, s) являются просто заполнителями для простых правил.


person TFuto    schedule 22.10.2020    source источник


Ответы (1)


Во-первых, удалите прямую левую рекурсию из обоих правил. Рассмотрим правило a:

a
    : (b q | c) p+
    | b q
    | c
    ;

Упрощать:

a
    : (b q | c) p*
    ;

Сделайте аналогичное преобразование для правила b:

b
    : (a s | d) r*
    ;

Теперь можно заменить идентификатор b в правиле a на тело правила b:

a
    : (c | (a s | d) r* q) p*
    ;

Или заменить идентификатор a в правиле b на тело правила a:

b
    : ((b q | c) p* s | d) r*
    ;

При необходимости также можно избавиться от прямой левой рекурсии.

person Ivan Kochurkin    schedule 22.10.2020