2013-09-21 6 views
0

я придумал следующую грамматику, что обеспечивает соблюдение старшинства:Как я могу исправить грамматику, которую я написал?

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. Я попытался использовать синтаксические предикаты, чтобы исправить это, но это не помогло. Возможно, я не использовал их правильно?

Я собираюсь продолжать разбираться в этом, но чем больше я думаю об этом, тем больше смущаюсь. Может кто-нибудь, пожалуйста, помогите мне? Это концептуальная проблема, с которой я сталкиваюсь, я думаю, как правильно настроить грамматики, у которых нет обратной отсылки. Но мне придется делать это, если я когда-либо захочу сделать свои собственные собственные инструменты должным образом.

ответ

1

Вы бы не проблема, когда вы перемещаете указатель прийти после ID вместо после L производства:

A : L 
L : M (('+'|'-') M)* 
M : P (('*'|'/') P)* 
P : ID I | NUM 
I : ('[' A ']')* 

, который будет анализировать все примеры 3 входных Вы обеспечили:

  1. a[i + 1]
  2. a[i] + 1
  3. a[a[i]*i]
Смежные вопросы