1. FIRST функциясы
2. FOLLOW функциясы
1. Болжаушы анализатор кестесін құруда бізге екі функция керек болады - FIRST және FOLLOW.
Айталық G = (N, T, P, S) - КБ-грамматика. Грамматика символдарынан құралған, еркін алынған α тізбегі үшін FIRST(α)-ны α-дан шығатын қатардың басы болып табылатын терминалдар жиыны ретінде анықтайық. Егер α→*е онда е де FIRST(α)-ға тиісті.
А бейтерминалы үшін FOLLOW(A) функциясын грамматиканың қайсыбір сентенциалды формасында тікелей А-дан кейін пайда болуы мүмкін а терминалдарының жиыны ретінде анықтаймыз, яғни кейбір α, β(N T)* үшін S→ * α Aaβ түріндегі шығару бар болатын а терминалдарының жиыны ретінде анықтаймыз. Шығару барысында А және а арасында өздерінен е келіп шығатын бейтерминал символдар бар болуы мүмкін.Егер А қайсыбір сентенциалды форманың ең оң жақ символы бола алатын болса, онда $ да FOLLOW(A) жиынына жатады.
FIRST функциясын есептеу алгоритмін қарастырамыз.
Алгоритм 4.3. Грамматика символдары үшін FIRST функциясын есептеу.
Кірісі. КБ-грамматика G = (N, T, P, S).
Шығысы. Әрбір х (N UT) символы үшін FIRST(х) жиыны
Тәсіл. 1-3 қадамдарын орындау:
-
Егер х – терминал болса, онда жиынға FIRST(X) = {X} енгізу; егер х – бейтермиал болса FIRST(X) = .
-
Егер Р-да х *e ережесі бар болса, онда e-ні FIRST(X)-ке енгізу.
-
FIRST(X)-ң ешқандай жиындарына жаңа элемент қосуға болмай қалғанынша төмендегіні орындау:
Егер X – бейтерминал болса және X Y 1Y 2...Y k түрдегі шығару ережелері бар болса, онда а-ны FIRST(X)-ке енгізу, егер қайсыбір і үшін 1≤i≤k a FIRST(Y i) болса және е барлық FIRST(Y 1), ..., FIRST(Y i-1) жиындарына жататын болса, онда Y 1...Y i-1*e. Егер е FIRST(Y j), j = 1, 2, ..., k, тиісті болса онда е-ні FIRST(X) жиынына қосып қою.
Алгоритм 4.4. FIRST функциясын тізбек үшін есептеу
Кірісі. КБ-грамматика G = (N, T, P, S).
Шығысы. FIRST(X1X2...Xn) жиындары, Xi (N T).
Тәсіл. 1-3 қадамдарын орындау:
-
Алдыңғы алгоритм көмегімен FIRST(X) функциясын әрбір X (N T) үшін есептеу.
-
Енгізу (Положить) FIRST(X1X2...Xn) = .
-
FIRST(X1)-дегі е-элементеместердің барлығын FIRST(X1X2...Xn)-ге қосу. Оған тағы да егер е FIRST(X1)-ге жататын болса, онда FIRST(X2)-дегі барлық е-элемент еместерді қосу, егер е FIRST(X1)-ге де, FIRST(X2)-ге де жататын болса, онда FIRST(X3)-тегі барлық е-элемент еместерді қосу, т.с.с. Ең соңында егер e FIRST(Xi) болса, онда е тізбегін FIRST(X1X2...Xn)-ке қосу.
2. FOLLOW функциясын есептеу алгоритмін қарастырайық.
Алгоритм 4.5. Грамматика бейтерминалдары үшін FOLLOW функциясын есептеу
Кірісі. КБ-грамматика G = (N, T, P, S).
Шығысы. Әрбір X Є N символы үшін FOLLOW(X) жиыны.
Тәсіл. 1-4 қадамдарын орындау:
-
Әрбір X Є N символы үшін FOLLOW(X) = (енгізу - положить)
-
$ -ды FOLLOW(S) –ке қосып қою.
-
Егер Р - A αBβ шығару ережесі болса, мұнда , α, β(NT)*, онда FIRST(β)-дағы е-ден басқа барлық элементтерді FOLLOW(B)-ға қосып қою.
-
FOLLOW(X) жиындарының ешқайсысына ештеңе қосуға болмай қалғаншга мынаны орындау:
егер Р-да A αB немесе A αBβ, α, β(NT)*, мұнда FIRST(β) e-ні өз ішіне алады (яғни β*e), онда FOLLOW(A)-ның барлық элементерін FOLLOW(B)-ға қосу.
Мысал 4.4. Мысал4.3-тегі грамматиканы қарастырамыз. Ол грамматика үшін
|
FIRST(E) = FIRST(T) = FIRST(F) = {(, id}
|
|
FIRST(E') = {+, e}
|
|
FIRST(T') = {*, e}
|
|
FOLLOW(E) = FOLLOW(E') = { ), $}
|
|
FOLLOW(T) = FOLLOW(T') = {+, ), $}
|
|
FOLLOW(F) = {+, *, ), $}
|
|
|
Мысалы, id және сол жақ жақша i = 1 кезінде FIRST(F)-ке 3- қадамда қосылады, өйткені 1-қадамға сәйкес FIRST(id) = {id} және FIRST(”(”) = {”(”}. i = 1 болғанда 3-қадамда T FT' шығару ережесіне сәйкес FIRST(T)-ға id мен сол жаң жақша қосылады. 2-қадамда FIRST(E') е енгізіледі.
FOLLOW жиындарын есептеу кезінде 2-ші қадамда FOLLOW(E)-ге $ енгізіліп қойылады3-ші қадамда F (E) шығару ережесіне сәйкес FOLLOW(E)-ге оң жақ жақша да қосылады. E TE' ережесіне қолданылған 4-ші қадамда FOLLOW(E')-ге $ мен оң жақ жақша енгізіледі. E'*e болғандықтан олар FOLLOW(T) жиынына да қосылады. E TE' шығару ережесіне сәйкес 3-ші қадамда FOLLOW(T)-ға FIRST(E')-дегі е-ден бөлек барлық элементтер де қосылады.
Достарыңызбен бөлісу: |