Анализа навише — разлика између измена

Садржај обрисан Садржај додат
м Бот: Селим 7 међујезичких веза, које су сад на Википодацима на d:q894902
Autobot (разговор | доприноси)
м Разне исправке; козметичке измене
Ред 7:
 
== Рачунарство ==
У [[Рачунарство|рачунарству]], анализа навише се примењује у изградњи [[компајлер]]а. Овај метод се заснива на идентификацији [[терминални симболи|терминалних симбола]] који затим учествују у стварању [[нетерминални симболи|нетерминалних симбола]]. Резултати анализе се користе у изградњи [[дрво анализе|дрвета анализе]] програма написаног на [[изворни језик|изворном језику]].
Различити програмски језици захтевају различите технике анализе, није неуобичајено да се у анализи користе технике које су моћније од захтеваних.
 
У пракси се често користе анализатори навише ({{Јез-ен|bottom-up parsers}}) опште примене, који могу да анализирају дати језик или могу да генеришу анализатор за [[програмски језик|програмски језик]] који је задат својом [[граматика|граматиком]]. Најпознатији алати који генеришу анализаторе за програмске језике су ''-{[[YACC]]}-'' и ''-{[[GNU bison]]}-''.
 
== Пример илуструје како се гради дрво анализе ==
Овај тривијалан пример илуструје разлике у анализи наниже и навише. Нека је граматика задата са:
 
S → Ax<br />
A → a<br />
A → b<br />
 
За улазну ниску ax, најлевље [[извођење]] је
Ред 48:
 
== Типови анализатора навише ==
* [[ЛР анализатор]]
** [[СЛР (1)]], ({{Јез-ен|Simple LR}}) - Користи један предувидни симбол
** [[ЛАЛР (1)]], ({{Јез-ен|Lookahead}}) – Једноставнија од ЛР (1), погодна је за имплементацију. ''-{[[YACC]]}-'' имплементира овај језик
** [[ЛР (1)]] – општији језик од претходних, сложен је за имплементацију
** [[ЛР (n)]], n је позитиван цео број - Могу се изградити језици који захтевају n предувидних симбола, уобичајено је да овакви језици захтевају велики број линија кода и простора за податке, па се из тих разлога у пракси ретко користе.
 
== ''-{Shift-reduce}-'' анализатори ==
Ред 60:
== ''-{Action}-'' таблице ==
''-{Action}-'' таблице служе за одређивање наредног корака у раду анализатора. Акције које се налазе у таблици су:
* Пребацивање ({{јез-ен|shift}}) - токен се поставља на стек
* Свођење ({{јез-ен|reduce}}) - ручка се уклања са стека, и замењује одговарајућим нетерминалом
* Прихватење ({{јез-ен|accept}}) – реченица је прихваћена, улазна линија је празна а на стеку се налази јединствени симбол
* Грешка ({{јез-ен|error}}) - до грешке долази уколико ништа од претходног није могуће урадити, односно улазна ниска тада није реченица језика
 
== ''-{Shift – Reduce}-'' ==
Ред 72:
== Пример ''-{shift-reduce}-'' анализе ==
 
# Почетна [[реченична форма]] је реченица која се анализира
# Док се не појави реченична форма која је састоји само од почетног симбола понављају се следећи кораци
## Улаз се скенира док се не препозна [[ручка]]
## Десна страна правила се замењује одговарајућом левом страном
 
Анализатор чији се рад заснива на применама корака 2.1 и 2.2 назива се ''-{shift-reduce}-'' анализатор. У пракси су често имплементирани помоћу стека. Дакле, рад ''-{shift-reduce}-'' анализатора се заснива на примени следећих акција:
 
* На почетку је стек празан
* ''-{Shift}-'' акција одговара пребацивању улазних симбола на стек
* ''-{Reduce}-'' акција се примењује када се на врху стека налази [[ручка]]. Тада се ручка скида са стека, а на стек се поставља нетерминал који одговара левој стани правила
 
=== Пример 1 ===
Ред 129:
(2) (* [ 1 + 3 ] ) -{shift}-
(Фактор) (* [ 1 + 3 ] ) -{reduce}-
(Фактор * ) ( [ 1 + 3 ] ) -{shift}-
(Фактор * [ ) (1 + 3 ] ) -{shift}-
(Фактор * [ 1 ) (+ 3 ] ) -{shift}-
(Фактор * [ Терм ) ( + 3 ] ) -{reduce}-
(Фактор * [ Терм + ) ( 3 ] ) -{shift}-
(Фактор * [ Терм + 3 ) (] ) -{shift}-
(Фактор * [ Терм + Израз) (] ) -{reduce}-
(Фактор * [ Израз ) (] ) -{reduce}-
(Фактор * [ Израз ] ) ( ) -{shift}-
(Фактор * Фактор ) ( ) -{reduce}-
(Фактор * Терм ) ( ) -{reduce}-
(Терм ) ( ) -{reduce}-
(Израз ) ( ) -{reduce}-
(Израз ) ( ) успех
 
</pre>