Вычисление первого и следующего набора грамматики - PullRequest
0 голосов
/ 28 апреля 2018

ниже - грамматика, которую я использую для языка калькулятора, и моя попытка найти следующий набор и первый набор грамматики.

Мне бы очень хотелось помочь выяснить, что я делаю неправильно, пытаясь выяснить эти наборы, потому что я чувствую, что я делаю их неправильно (по крайней мере, для следующих наборов)

Грамматика

программа → stmt_list $$$
stmt_list → stmt stmt_list | ε
stmt → id = expr | входной идентификатор | печать expr
expr → term term_tail
term_tail → добавить термин term_tail | ε
термин → фактор факт_хвост
fact_tail → mult_op fact_ttail | ε
фактор → (expr) | номер | ID
add_op → + | -
mult_op → * | / | // | %

Первый набор

first (p) = {id, input, print}
first (stmt_list) = {id, input, print, e}
first (s) = {id, input, print}
first (expr) = {(, id, number}
first (term_tail) = {+, -, e}
first (term) = {(, id, number}
first (fact_tail) = {, /, //,%, e}
first (factor) = {(, id, number}
first (add_op) = {+, -}
first (mult_op) = {
, /, //,%}

Follow Set

follow (p) = {$}
follow (stmt_list) = {$}
follow (stmt) = {id, input, print}
follow (expr) = {(, id, number,), ввод, печать, , /, //,%}
follow (term_tail) = {), (, id, number, print, input}
follow (term) = {+, -}
follow (factor) = {
, /, //,%}
follow (add_op) = {} follow (mult_op) = {}
follow (fact_tail) = {*, /, //,%, +, -}

1 Ответ

0 голосов
/ 28 апреля 2018

У вас также есть определенные ошибки в First

first (p) = {id, input, print, e}

это будет включать эпсилон * отсутствует в следующих двух -

first(fact_tail) = { *,/, //, %, e} first(mult_op) = {*, /, //, %}

fact_tail → mult_op fact_tail | ε

Я предполагаю, что вы на самом деле имеете в виду

fact_tail → mult_op factor fact_tail | ε

Следовать

follow (stmt) = {id, input, print, $}

если вы ссылаетесь на

stmt_list → stmt stmt_list | ε

затем за stmt следует первый из stmt_list, который включает e, поэтому сгенерированная строка закончится, следовательно, за stmt следует $

follow (expr) = {(, id, number,), ввод, печать,, /, //,%}

Я не знаю, как вы это получили, follow of expr равен follow stmt и)

follow (expr) = {id,), input, print, $}

follow (term_tail) равно follow (expr)

follow (term) = {+, -,), id, input, print, $}

follow (fact_tail) равно follow (term)

follow (factor) = first (fact_tail)

follow (add_op) = первый (термин)

follow (mult_op) = первый (фактор)

Если вы не согласны, пожалуйста, обсудите, а не проголосуйте. Я надеюсь, что это поможет вам

...