Natty, переходящий из anlr3 в antlr 4
Поскольку я новичок в antlr, у меня много проблем с синтаксическими предикатами. Я пытался преобразовать эту грамматику, которая является частью изящной грамматики, чтобы разобрать ее с помощью antlr4, я действительно запутался, как изменить ее осмысленно.
date_time
: (
(date)=>date (date_time_separator explicit_time)?
| explicit_time (time_date_separator date)?
) -> ^(DATE_TIME date? explicit_time?)
| relative_time -> ^(DATE_TIME relative_time?)
;`
1 ответ
Решение
Синтаксические предикаты и правила перезаписи больше не поддерживаются в ANTLR4. Алгоритм синтаксического анализа ANTLR4 должен быть достаточно мощным, чтобы не нуждаться в синтаксических предикатах, и если вы хотите пройти по дереву разбора, взгляните на эти ссылки:
- Шаблон посетителей ANTLR4 на простом арифметическом примере
- https://github.com/antlr/antlr4/blob/master/doc/tree-matching.md
Итак, правило, которое вы разместили, будет выглядеть так в ANTLR4:
date_time
: date ( date_time_separator explicit_time )?
| explicit_time ( time_date_separator date )?
| relative_time
;