Чтобы вычислить FOLLOW(Non-Terminal)
, применяйте следующие правила до тех пор, пока ничего нельзя будет добавить к набору FOLLOW: - // Взято из Dragon Book
- Поместите $ в FOLLOW (Start_Symbol), где $ — правый конечный маркер ввода.
- Если есть продукция
A->XBY
, то все в FIRST(Y), кроме ε, находится в FOLLOW(B).
- Если существует продукция
A->XB
или продукция A->XBY
, где ПЕРВЫЙ(Y) содержит ε, то все в СЛЕДУЮЩЕМ(A) находится в СЛЕДУЮЩЕМ(B).
Итак, теперь, следуя правилам, мы получаем FOLLOW() всех нетерминалов здесь.
FOLLOW(S) = {),$}
Так как S является начальным символом, FOLLOW(S) должен содержать $. Четвертое тело производственного номера (S) объясняет, почему в FOLLOW(S) правильные круглые скобки.
FOLLOW(B) = {),$}
Так как B появляется только на концах тел S-продукции (а не A-продукции, обсуждаемой далее в разделе ОБСУЖДЕНИЕ).
FOLLOW(A) = {+,*,(,a,),$}
Поскольку A появляется в телах только после B, таким образом, все, кроме ε, которое находится в FIRST(B), должно быть в FOLLOW(A). Однако, поскольку FIRST(B) содержит ε, а B получено из S в исходной продукции, следовательно, все в FOLLOW(S) также должно быть в FOLLOW(A). Это объясняет символы $ и ).
FOLLOW(T) = {+,*,(,a,),$}
Поскольку T появляется в телах только после B, таким образом, все, кроме ε, которое находится в FIRST(B), должно быть в FOLLOW(T). Однако, поскольку FIRST(B) содержит ε, а B — это целая строка, следующая за T в телах S продукций, все в FOLLOW(S) также должно быть в FOLLOW(T). Это объясняет символы $ и ).
ОБСУЖДЕНИЕ:-
Теперь, говоря о каком-то конфликте, возникающем из-за 3-го произведения, A -> +S | TB | *
, вы могли бы легко заменить S вместо TB, из-за чего вы можете запутаться.
Как по мне, вы должны оставить постановки как: -
S -> TB
B -> AB | ε
A -> +S | S | * //substitute S for understanding FOLLOW(B) without any confusion
T -> (S) | a
person
Am_I_Helpful
schedule
29.05.2015