я придумал следующую грамматику, что обеспечивает соблюдение старшинства:Как я могу исправить грамматику, которую я написал?
A : L ('[' A ']' L*)*
L : M (('+'|'-')M)*
M : P (('*'|'/')P)*
P : ID | NUM
, где идентификатор может быть буквой и Num представляет собой целое число.
Проблема
Я могу разобрать следующую строку:
a[i + 1]
Я не могу разобрать следующую строку:
a[i] + 1 or a[a[i]*i]
Моя проблема в том, что представляет проблемы рекурсии. Поскольку я не хочу делать откат. Я должен это исправить, переписав грамматику. Я смотрел на это link. Однако мое исправление не работает. Может кто-нибудь помочь?
Покушения Решение:
A : L ('[' A ']')* | L*` and let `Z = ('[' A ']')*
Однако, я думаю, что это изменяет определение моей грамматики, еще осталось рекурсивным и не позволяет мне решить для a[i] + 1 or a[a[i]*i]
Дополнительной информации:
Я фактически реализую это в antlr. Я попытался использовать синтаксические предикаты, чтобы исправить это, но это не помогло. Возможно, я не использовал их правильно?
Я собираюсь продолжать разбираться в этом, но чем больше я думаю об этом, тем больше смущаюсь. Может кто-нибудь, пожалуйста, помогите мне? Это концептуальная проблема, с которой я сталкиваюсь, я думаю, как правильно настроить грамматики, у которых нет обратной отсылки. Но мне придется делать это, если я когда-либо захочу сделать свои собственные собственные инструменты должным образом.