Давайте начнем с предположения, что вы пытаетесь построить (каноническую) машину LR (1), и рассмотрим состояние (набор элементов) 3:
item set 3:
A -> A(A.), $(
A -> A.(A), )(
Возможны два преемника: GOTO (S3), ')') и GOTO (S3, '(')):
item set 4: GOTO(S3, ')')
A -> A(A)., $(
item set 5: GOTO(S3, '(')
A -> A(.A), )(
A -> .A(A), )(
A -> . , )(
Обратите внимание, что набор элементов 5 равен , а не так же, как ваш набор элементов 2, посколькупервый пункт отличается.
Именно из этого и исходит загадка )
, которая озадачивает вас, как вы можете видеть, когда закончите конечный автомат LR (1), продолжая переходить из состояния 5:
item set 6: GOTO(S5, A)
A -> A(A.), )(
A -> A.(A), )(
item set 7: GOTO(S6, ')')
A -> A(A)., )(
Вот и все, потому что GOTO(S6, '(')
это набор элементов 5.
Скорее всего, вы пытаетесь построить (и проанализировать) LALR (1) машину. В машине LALR (1) наборы предметов с одинаковыми ядрами объединяются. Когда мы объединяем два набора элементов, промежуточные позиции для соответствующих элементов заменяются объединением промежуточных элементов. Таким образом, мы объединяем наборы элементов 2 и 5:
item set 2 item set 5 merged item set
A -> A(.A), $( A -> A(.A), )( A -> A(.A), $)(
A -> .A(A), )( A -> .A(A), )( A -> .A(A), )(
A -> . , )( A -> . , )( A -> . , )(
Аналогично мы объединяем наборы элементов 3 и 6 и наборы элементов 4 и 7
item set 3+6:
A -> A(A.), $)(
A -> A.(A), )(
item set 4+7:
A -> A(A)., $)(
(есть гораздо более эффективный алгоритмдля построения машин LALR (1), который не включает в себя построение всей машины LR (1) и последующее слияние состояний, но результат точно такой же, и алгоритм слияния, возможно, легче понять.)