Вычисление первого и последующего набора грамматики

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

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

Грамматика

программа → stmt_list $$$
stmt_list → stmt stmt_list | ε
stmt → id = expr | входной идентификатор | напечатать expr
expr → term term_tail
term_tail → добавить op term term_tail | ε
term → factor fact_tail
fact_tail → mult_op fact fact_tail | ε
фактор → ( 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(p) = {$}
follow(stmt_list) = {$}
follow(stmt) = {id, input, print}
follow(expr) = {(, id, number, ) , input, print, , /, //, %}
follow(term_tail) = {), (, id, number, print, input}
follow(term) = {+, -}
follow(factor) = {
, /, //, %}
follow(add_op) = {}follow(mult_op) = {}
follow(fact_tail) = {*,/ , //, %, +, -}


person Felauras    schedule 28.04.2018    source источник


Ответы (1)


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

первый(р) = {идентификатор, ввод, печать, е}

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

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

fact_tail → mult_op fact fact_tail | ε

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

fact_tail → mult_op factor fact_tail | ε

Подписаться

следуйте (stmt) = {идентификатор, ввод, печать, $}

если вы обратитесь к

stmt_list → stmt stmt_list | ε

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

follow(expr) = {(, id, number, ), input, print, , /, //, %}

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

следуйте (выражение) = {id, ), ввод, печать, $}

следовать (term_tail) равно следовать (expr)

следуйте (термин) = {+,-,), идентификатор, ввод, печать, $}

следовать (факт_хвост) равно следовать (термин)

следовать (фактор) = первый (факт_хвост)

следовать (add_op) = первый (термин)

следовать (mult_op) = первый (фактор)

person mk1024    schedule 28.04.2018
comment
так что мои подписки (P) и подписки (stmt_list) верны? - person Felauras; 28.04.2018
comment
Круто, это действительно помогло мне разобраться с этой программой. Теперь я наконец-то могу написать программу для завершения разбора этого языка калькулятора!!! - person Felauras; 28.04.2018