Как найти ПЕРВЫЕ множества для рекурсивной грамматики - PullRequest
1 голос
/ 10 октября 2019

У меня есть грамматика:

S → SL | ε
L → A; | E; | C;
E → (EBE) | N | V
A → let V =E
C → while E do S | while E do S else S
B → + | - | * | >
V → x | y | z
N → ND | N0 | D
D → 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 

Я пытаюсь построить таблицу разбора, чтобы я мог доказать, что это не грамматика LL (1). В настоящее время я застрял в поиске первого набора для S. Я продолжаю получать S в наборе и не могу достичь терминала G. Каким будет FIRST (SL)?

Когда я выполняю FIRST (SL), япродолжайте возвращаться к FIRST (S), который переходит к FIRST (SL) ⋃ FIRST (ε) = FIRST (S) ⋃ {ε}, и FIRST (S) будет повторяться снова и снова.

1 Ответ

1 голос
/ 10 октября 2019

Прописные буквы обозначают нетерминалы. Маленькие буквы обозначают терминалы.

First и Follow являются символами TERMINAL, которые предшествуют или следуют за терминалом или нетерминалом (при предварительном обходе дерева разбора).

For all A -> xYZ
First (A) = {x}
For all A-> Xyz
First (A) = First(X)
For all A-> εYZ
First (A) = First(Y)

Takeобъединение всех этих терминальных символов.

...