Чтобы удалить левую рекурсию
E->E+T|E-T|T
T->T*F|T/F|F
для + и *, я уверен, что это должно быть
E->TE'
E'->+TE'|(e) (e) is empty string
T->FT'
T'->*FT'|(e)
но для - или / я не уверен, как убрать левую рекурсию, и я придумал следующую, подходит ли она для - и /? Возьмем пример: для плюса a+b = b+a, а для минуса a - b != b -a. Итак, если мы используем следующую правую рекурсию, получим ли мы проблему, подобную a-b?
E->TE'
E'->+TE'|-TE'|(e)
T->FT'
T'->*FT'|/FT'|(e)
Кто-нибудь знает, что компилятор объясняет мне? Заранее спасибо.
4-3
? У вас есть интерпретатор, который интерпретирует эту грамматику? И он возвращает-1
вместо1
? Проблема, вероятно, не в грамматике, а в интерпретаторе. Если да, то вам следует предоставить дополнительную информацию о генераторе синтаксического анализатора и коде интерпретатора. - person CoronA   schedule 25.10.2015T->T*F|T/F|F
(а неE/T
) - person rici   schedule 25.10.2015+
,-
,*
или/
точно так же, как исходная грамматика, и распознает точно такой же язык. Очевидно, что дерево синтаксического анализа для любого заданного ввода будет другим. - person Chris Dodd   schedule 25.10.2015