it-swarm.com.ru

LR (1) Item DFA - Вычислительные взгляды

У меня возникли проблемы с пониманием того, как вычислить прогноз для элементов LR (1).

Скажем, у меня есть эта грамматика:

S -> AB
A -> aAb | a
B -> d

LR (1) -элемент - это элемент LR (0) с прогнозом. Таким образом, мы получим следующий LR (0) -элемент для состояния 0:

S -> .AB , {lookahead} 
A -> .aAb,  {lookahead} 
A -> .a,  {lookahead}

Состояние: 1

A ->  a.Ab, {lookahead} 
A ->  a. ,{lookahead} 
A -> .aAb ,{lookahead} 
A ->.a ,{lookahead}

Может кто-нибудь объяснить, как вычислить прогноз? Каков общий подход?

Заранее спасибо

15
mrjasmin

Взгляды, используемые в синтаксическом анализаторе LR (1), вычисляются следующим образом. Во-первых, начальное состояние имеет элемент в форме

S -> .w  ($)

для каждого производства S -> w, где S - начальный символ. Здесь маркер $ обозначает конец ввода.

Далее, для любого состояния, которое содержит элемент формы A -> x.By (t), где x - произвольная строка терминалов и нетерминалов, а B - нетерминал, вы добавляете элемент формы B -> .w (s) для каждого производства B -> w и для каждого терминала в наборе FIRST (yt). (Здесь FIRST относится к FIRST множествам , которые обычно вводятся, когда речь идет о синтаксических анализаторах LL. Если вы их раньше не видели, я бы потратил несколько минут на просмотр этих лекционных заметок).

Давайте попробуем это на вашей грамматике. Мы начнем с создания набора элементов, содержащего

S -> .AB ($)

Затем, используя наше второе правило, для каждого производства A мы добавляем новый элемент, соответствующий этому производству, и с заголовками каждого терминала в FIRST (B $). Поскольку B всегда создает строку d, FIRST (B $) = d, поэтому все вводимые нами произведения будут иметь вид d. Это дает

S -> .AB ($)
A -> .aAb (d)
A -> .a (d)

Теперь давайте построим состояние, соответствующее появлению "а" в этом начальном состоянии. Мы начинаем с перемещения точки на один шаг для каждого производства, которое начинается с:

A -> a.Ab (d)
A -> a. (d)

Теперь, так как первый элемент имеет точку перед нетерминалом, мы используем наше правило, чтобы добавить один элемент для каждого производства A, давая этим элементам FIRST (bd) = b. Это дает

A -> a.Ab (d)
A -> a. (d)
A -> .aAb (b)
A -> .a (b)

Продолжая этот процесс, мы в конечном итоге построим все состояния LR (1) для этого анализатора LR (1). Это показано здесь:

[0]
S -> .AB  ($)
A -> .aAb (d)
A -> .a   (d)

[1]
A -> a.Ab (d)
A -> a.   (d)
A -> .aAb (b)
A -> .a   (b)

[2]
A -> a.Ab (b)
A -> a.   (b)
A -> .aAb (b)
A -> .a   (b)

[3]
A -> aA.b (d)

[4]
A -> aAb. (d)

[5]
S -> A.B  ($)
B -> .d   ($)

[6]
B -> d.   ($)

[7]
S -> AB.  ($)

[8]
A -> aA.b (b)

[9]
A -> aAb. (b)

Если это поможет, я преподавал курс компиляторов прошлым летом и получил все слайды лекций доступны онлайн. Слайды при разборе снизу вверх должны охватывать все детали синтаксического анализа LR и построения таблицы разбора, и я надеюсь, что вы найдете их полезными!

Надеюсь это поможет!

27
templatetypedef

вот LR (1) автомат для грамматики, как было сделано выше, я думаю, что для понимания лучше попытаться нарисовать автомат, и поток прояснит идею о побочных эффектах

here is the automaton for the grammar

2
M.Alamer

Я тоже получаю 11 штатов, а не 8:

State 0
        S: .A B ["$"]
        A: .a A b ["d"]
        A: .a ["d"]
    Transitions
        S -> 1
        A -> 2
        a -> 5
    Reductions
        none
State 1
        S_Prime: S .$ ["$"]
    Transitions
        none
    Reductions
        none
State 2
        S: A .B ["$"]
        B: .d ["$"]
    Transitions
        B -> 3
        d -> 4
    Reductions
        none
State 3
        S: A B .["$"]
    Transitions
        none
    Reductions
        $ => S: A B .
State 4
        B: d .["$"]
    Transitions
        none
    Reductions
        $ => B: d .
State 5
        A: a .A b ["d"]
        A: .a A b ["b"]
        A: .a ["b"]
        A: a .["d"]
    Transitions
        A -> 6
        a -> 8
    Reductions
        d => A: a .
State 6
        A: a A .b ["d"]
    Transitions
        b -> 7
    Reductions
        none
State 7
        A: a A b .["d"]
    Transitions
        none
    Reductions
        d => A: a A b .
State 8
        A: a .A b ["b"]
        A: .a A b ["b"]
        A: .a ["b"]
        A: a .["b"]
    Transitions
        A -> 9
        a -> 8
    Reductions
        b => A: a .
State 9
        A: a A .b ["b"]
    Transitions
        b -> 10
    Reductions
        none
State 10
        A: a A b .["b"]
    Transitions
        none
    Reductions
        b => A: a A b .
0
tgoneil

Созданный вами набор предметов LR (1) должен иметь еще два предмета.

I8 A -> aA.b, b от I2

I9 A -> aAb. б из I8

0
Ajay