Aina za wafasiri. sheria A:x inapaswa kuchaguliwa ikiwa a iko kwenye FIRST(x). Kwa nini ni muhimu

  • Anwani. Kifaa kinachofanya kazi ambacho hubadilisha anwani pepe kuwa anwani halisi.
  • Mazungumzo. Hutoa matumizi ya lugha ya programu katika hali ya kushiriki wakati.
  • Pasi nyingi. Huunda moduli ya kitu juu ya maoni kadhaa ya programu chanzo.
  • Nyuma. Sawa na kitafsiri. Tazama pia: decompiler, disassembler.
  • Pasi moja. Huunda moduli ya kitu katika utazamaji mmoja mfululizo wa programu chanzo.
  • Kuboresha. Hutekeleza uboreshaji wa msimbo katika moduli ya kitu kilichozalishwa.
  • Inayoelekezwa kisintaksia (inaendeshwa kisintaksia). Hupokea kama ingizo maelezo ya sintaksia na semantiki ya lugha na maandishi katika lugha iliyofafanuliwa, ambayo hutafsiriwa kwa mujibu wa maelezo yaliyotolewa.
  • Mtihani. Seti ya amri kuu za lugha ya kusanyiko ambazo hukuruhusu kuweka taratibu mbalimbali za utatuzi katika programu zilizoandikwa kwa lugha ya kusanyiko.

Kusudi la utangazaji- kubadilisha maandishi kutoka lugha moja hadi nyingine, ambayo inaeleweka kwa mpokeaji wa maandishi. Kwa upande wa programu za watafsiri, anayeandikiwa ni kifaa cha kiufundi (processor) au programu ya mkalimani.

Lugha ya wasindikaji (msimbo wa mashine) kawaida huwa ya kiwango cha chini. Kuna mifumo inayotumia lugha ya mashine ngazi ya juu(kwa mfano, iAPX-432), lakini ni ubaguzi kwa sheria kutokana na ugumu wao na gharama kubwa. Mtafsiri anayebadilisha programu kuwa lugha ya mashine inayopokelewa na kutekelezwa moja kwa moja na kichakataji huitwa mkusanyaji.

Mchakato wa ujumuishaji kawaida huwa na hatua kadhaa: uchanganuzi wa kileksia, kisintaksia na kisemantiki (uchambuzi wa Semantiki ya Kiingereza), uundaji wa msimbo wa kati, uboreshaji na uundaji wa msimbo wa mashine unaosababishwa. Kwa kuongezea, mpango kawaida hutegemea huduma zinazotolewa na mfumo wa uendeshaji na maktaba za watu wengine (kwa mfano, faili I/O au kiolesura cha picha), na msimbo wa mashine ya programu lazima uhusishwe na huduma hizi. Kuunganisha na maktaba ya tuli hufanywa na kiunganishi au kiunganishi (ambacho kinaweza kuwa programu tofauti au sehemu ya mkusanyaji), huku kuunganishwa na mfumo wa uendeshaji na maktaba yenye nguvu hufanyika wakati kipakiaji kinapoanza kutekeleza programu.

Faida ya mkusanyaji: programu imeundwa mara moja na hakuna mabadiliko ya ziada yanahitajika kila wakati inapotekelezwa. Ipasavyo, mkusanyaji hauhitajiki kwenye mashine inayolengwa ambayo programu imeundwa. Hasara: Hatua tofauti ya ujumuishaji hupunguza kasi ya uandishi na utatuzi na inafanya kuwa vigumu kuendesha programu ndogo, rahisi, au za mara moja.

Njia nyingine ya utekelezaji ni wakati programu inatekelezwa kwa kutumia mkalimani hakuna matangazo kabisa. Programu ya mkalimani ni mfano wa mashine ambayo mzunguko wake wa utekelezaji wa kuleta hufanya kazi kwa maagizo katika lugha za kiwango cha juu, badala ya maagizo ya mashine. Hii uundaji wa programu huunda mashine virtual, ambayo hutekeleza lugha. Njia hii inaitwa tafsiri safi. Tafsiri safi kawaida hutumiwa kwa lugha zilizo na muundo rahisi (kwa mfano, APL au Lisp). Wakalimani mstari wa amri kuchakata amri katika hati katika UNIX au faili za kundi (.bat) katika MS-DOS, pia kwa kawaida katika hali halisi ya ukalimani.

Faida ya mkalimani safi: kutokuwepo kwa vitendo vya kati vya tafsiri hurahisisha utekelezaji wa mkalimani na kuifanya iwe rahisi kutumia, pamoja na katika hali ya mazungumzo. Ubaya ni kwamba mkalimani lazima awepo kwenye mashine inayolengwa ambapo programu itatekelezwa.

Kuna maelewano kati ya ujumuishaji na tafsiri safi katika utekelezaji wa lugha za programu, wakati mkalimani, kabla ya kutekeleza programu, anaitafsiri kwa lugha ya kati (kwa mfano, kwa bytecode au p-code), rahisi zaidi kwa tafsiri (ambayo ni, tunazungumza juu ya mkalimani aliye na mtafsiri aliyejengewa ndani) . Njia hii inaitwa utekelezaji mchanganyiko. Mfano wa utekelezaji wa lugha mchanganyiko ni Perl. Mbinu hii inachanganya faida zote mbili za mkusanyaji na mkalimani ( kasi kubwa utekelezaji na urahisi wa matumizi) na hasara (tafsiri na uhifadhi wa programu katika lugha ya kati inahitaji rasilimali za ziada; mkalimani lazima atolewe kutekeleza programu kwenye mashine inayolengwa). Pia, kama ilivyo kwa mkusanyaji, utekelezaji mchanganyiko unahitaji kwamba msimbo wa chanzo usiwe na makosa (lexical, syntactic na semantic) kabla ya utekelezaji.

Tangaza Na tafsiri - michakato tofauti: Tafsiri inahusika na tafsiri ya programu kutoka lugha moja hadi nyingine, huku ukalimani unawajibika kwa utekelezaji wa programu. Hata hivyo, kwa kuwa madhumuni ya tafsiri ni kawaida kuandaa programu kwa ajili ya tafsiri, taratibu hizi kwa kawaida huzingatiwa pamoja. Kwa mfano, lugha za programu mara nyingi hujulikana kama "iliyokusanywa" au "iliyofasiriwa", kulingana na ikiwa mkusanyiko au tafsiri hutawala matumizi ya lugha. Zaidi ya hayo, karibu lugha zote za kiwango cha chini na za kizazi cha tatu, kama vile kusanyiko, C au Modula-2, zinakusanywa, wakati lugha za kiwango cha juu, kama vile Python au SQL, zinafasiriwa.

Kwa upande mwingine, kuna mwingiliano wa michakato ya utafsiri na ukalimani: wakalimani wanaweza kuwa wanatunga (pamoja na mkusanyo unaobadilika), na watafsiri wanaweza kuhitaji tafsiri ya miundo ya upangaji programu (kwa mfano, kwa macros katika lugha ya mkusanyiko, mkusanyiko wa masharti katika C, au kwa violezo katika C++).

Zaidi ya hayo, lugha sawa ya programu inaweza kutafsiriwa na kufasiriwa, na katika hali zote mbili lazima kuwe na hatua za kawaida za uchambuzi na utambuzi wa miundo na maelekezo ya lugha chanzi. Hii inatumika kwa utekelezaji wa programu na maunzi - kwa mfano, wasindikaji wa familia ya x86, kabla ya kutekeleza maagizo ya lugha ya mashine, fanya usimbaji wao, ukiangazia katika opcodes nyanja za uendeshaji (rejista, anwani za kumbukumbu, maadili ya haraka), kina kidogo, n.k. ., na ndani Wasindikaji wa Pentium kwa usanifu wa NetBurst, msimbo wa mashine kwa ujumla hutafsiriwa katika mfuatano wa utendakazi mdogo kabla ya kuhifadhiwa kwenye akiba ya ndani.

SEHEMU YA 7. Tafsiri, mkusanyo na tafsiri

Programu ni mlolongo wa maagizo yaliyoundwa kutekelezwa na kompyuta. Hivi sasa, programu zimeundwa kama maandishi, ambayo yameandikwa kwa faili. Maandishi haya ni matokeo ya shughuli za mtayarishaji programu na, licha ya maelezo maalum ya lugha rasmi, bado programu kwa ajili ya programu.

Mchakato wa kuunda programu unajumuisha hatua kadhaa. Hatua ya kubuni programu inafuatiwa na hatua ya programu. Katika hatua hii, mpango umeandikwa. Kwa watayarishaji programu, maandishi haya ni rahisi kuelewa kuliko msimbo wa binary kwa sababu kumbukumbu na majina mbalimbali yana maelezo ya ziada.

Faili ya chanzo cha programu (pia inaitwa moduli ya chanzo) inachakatwa mfasiri , ambayo hutafsiri programu kutoka kwa lugha ya programu hadi kwenye mlolongo wa misimbo inayoweza kusomeka na mashine.

Mfasiri - programu au njia za kiufundi, akiigiza utangazaji wa programu. Programu ya mashine ambayo hutafsiri kutoka lugha moja hadi nyingine na, haswa, kutoka lugha moja ya programu hadi nyingine. Programu ya usindikaji iliyoundwa ili kubadilisha programu ya chanzo kuwa moduli ya kitu.

Mtafsiri kawaida pia hugundua makosa, huunda kamusi za vitambulisho, hutoa maandishi ya programu kwa uchapishaji, nk.

Matangazo ya programu - mabadiliko ya programu iliyotolewa katika moja ya lugha za programu katika programu katika lugha nyingine na, kwa maana fulani, sawa na ya kwanza.

Lugha ambayo programu ya kuingiza inawasilishwa inaitwa lugha asilia, na programu yenyewe - msimbo wa chanzo. Lugha ya pato inaitwa lugha lengwa au msimbo wa kitu.

Aina za wafasiri

Watafsiri wamegawanywa katika:

· Anwani. Kifaa kinachofanya kazi ambacho hubadilisha anwani pepe Anwani pepe) kwa anwani halisi (Kiingereza) Anwani ya kumbukumbu).

· Mazungumzo. Hutoa matumizi ya lugha ya programu katika hali ya kushiriki wakati.

· Pasi nyingi. Huunda moduli ya kitu juu ya maoni kadhaa ya programu chanzo.

· Nyuma. Sawa na kitafsiri. Tazama pia: decompiler, disassembler.

· Pasi moja. Huunda moduli ya kitu katika utazamaji mmoja mfululizo wa programu chanzo.

· Kuboresha. Hutekeleza uboreshaji wa msimbo katika moduli ya kitu kilichozalishwa.

· Yenye mwelekeo wa kisintaksia (inayoendeshwa na kisintaksia). Hupokea kama ingizo maelezo ya sintaksia na semantiki ya lugha na maandishi katika lugha iliyofafanuliwa, ambayo hutafsiriwa kwa mujibu wa maelezo yaliyotolewa.

· Mtihani. Seti ya amri kuu za lugha ya kusanyiko ambazo hukuruhusu kuweka taratibu mbalimbali za utatuzi katika programu zilizoandikwa kwa lugha ya kusanyiko.



Watafsiri wanatekelezwa katika fomu wakusanyaji au wakalimani . Kwa upande wa kufanya kazi, mkusanyaji na mkalimani ni tofauti sana.

Mkusanyaji(Kiingereza) mkusanyaji- mkusanyaji, mkusanyaji) - mtafsiri anayebadilisha programu iliyokusanywa ndani lugha asilia, kwenye moduli ya kitu. Programu inayotafsiri maandishi ya programu katika lugha ya kiwango cha juu hadi programu sawa ya lugha ya mashine.

· Programu iliyoundwa kutafsiri lugha ya kiwango cha juu hadi msimbo kamili au, wakati mwingine, katika lugha ya mkusanyiko. Taarifa ya ingizo kwa mkusanyaji (msimbo wa chanzo) ni maelezo ya algoriti au programu katika lugha inayolengwa na tatizo, na matokeo ya mkusanyaji ni maelezo sawa ya algoriti katika lugha inayolengwa na mashine (msimbo wa kitu).

Mkusanyiko-tafsiri ya programu iliyoandikwa katika lugha chanzi katika moduli ya kitu. Imefanywa na mkusanyaji.

Unganisha - kutafsiri programu ya mashine kutoka kwa lugha inayolenga tatizo hadi lugha inayoelekezwa na mashine.

Mkusanyaji anasoma programu nzima kabisa, hutafsiri na kuunda toleo kamili la programu katika lugha ya mashine, ambayo inatekelezwa.

Mkalimani(Kiingereza) mkalimani- mkalimani, mkalimani) hutafsiri na kutekeleza programu mstari kwa mstari. Mkalimani huchukua mwendeshaji wa lugha inayofuata kutoka kwa maandishi ya programu, anachanganua muundo wake na kisha kuutekeleza mara moja (kawaida baada ya uchanganuzi, opereta hutafsiriwa katika uwakilishi wa kati au hata msimbo wa mashine kwa utekelezaji mzuri zaidi). Ni baada tu ya kauli ya sasa kutekelezwa kwa ufanisi ndipo mkalimani ataendelea na inayofuata. Zaidi ya hayo, ikiwa mwendeshaji sawa atatekelezwa katika programu mara nyingi, mkalimani ataitekeleza kana kwamba ilipatikana kwa mara ya kwanza. Matokeo yake, programu zinazohitaji kiasi kikubwa cha hesabu zitaendesha polepole. Kwa kuongeza, kuendesha programu kwenye kompyuta nyingine, kuna lazima pia kuwa na mkalimani - baada ya yote, bila hiyo, maandishi ni seti ya wahusika.



Kwa njia nyingine, tunaweza kusema kwamba mkalimani huiga mashine fulani ya kompyuta ambayo kwayo maelekezo ya msingi Sio amri za msingi za usindikaji zinazotumika, lakini waendeshaji wa lugha ya programu.

Tofauti kati ya mkusanyiko na tafsiri.

1. Programu inapoundwa, programu ya chanzo wala mkusanyaji hazihitajiki tena. Wakati huo huo, programu iliyochakatwa na mkalimani lazima tena uhamisho kwa lugha ya mashine kila wakati programu inapozinduliwa.

2. Programu zilizokusanywa huendesha haraka, lakini zilizofasiriwa ni rahisi kurekebisha na kubadilisha.

3. Kila lugha mahususi huelekezwa ama katika mkusanyo au tafsiri - kutegemeana na madhumuni ambayo iliundwa kwa ajili yake. Kwa mfano, Pascal kawaida hutumika kutatua shida ngumu ambazo kasi ya programu ni muhimu. Kwa hivyo, lugha hii kawaida hutekelezwa kwa kutumia mkusanyaji.

Upande mwingine, MSINGI iliundwa kama lugha ya waandaaji wa programu wanaoanza, ambao utekelezaji wa mpango kwa mstari una faida zisizoweza kuepukika.

Takriban lugha zote za kiwango cha chini na za kizazi cha tatu, kama vile mkusanyiko, C, au Modula-2, hukusanywa, wakati lugha za kiwango cha juu, kama vile Python au SQL, zinafasiriwa.

Wakati mwingine kwa lugha moja kuna na mkusanyaji, na mkalimani. Katika kesi hii, unaweza kutumia mkalimani kuendeleza na kupima programu, na kisha kukusanya programu iliyotatuliwa ili kuboresha kasi ya utekelezaji wake. Kuna mwingiliano wa michakato ya utafsiri na ukalimani: wakalimani wanaweza kuwa wanatunga (ikiwa ni pamoja na mkusanyo unaobadilika), na watafsiri wanaweza kuhitaji tafsiri ya miundo ya metaprogramming (kwa mfano, kwa makro katika lugha ya mkusanyiko, mkusanyiko wa masharti katika C, au kwa violezo katika C++).

4. Tafsiri na ukalimani ni michakato tofauti: tafsiri inahusika na tafsiri ya programu kutoka lugha moja hadi nyingine, na ukalimani ni wajibu wa utekelezaji wa programu. Hata hivyo, kwa kuwa madhumuni ya tafsiri ni kawaida kuandaa programu kwa ajili ya tafsiri, taratibu hizi kwa kawaida huzingatiwa pamoja.

Hitimisho: Kikwazo cha mkusanyaji ni ugumu wa kutafsiri lugha za programu zinazozingatia usindikaji wa data ya miundo tata, mara nyingi haijulikani mapema au kubadilika kwa nguvu wakati programu inaendesha. Kisha unapaswa kuingiza hundi nyingi za ziada kwenye msimbo wa mashine, kuchambua upatikanaji wa rasilimali za mfumo wa uendeshaji, kukamata kwa nguvu na kuzifungua, kuziunda na kuzichakata kwenye kumbukumbu ya kompyuta. vitu tata, ambayo ni ngumu sana kutekeleza kwa kiwango cha maagizo ya mashine ngumu, na karibu haiwezekani kwa kazi hiyo.

Kwa msaada wa mkalimani, kinyume chake, inawezekana kusimamisha programu wakati wowote, kuchunguza yaliyomo kwenye kumbukumbu, kupanga mazungumzo na mtumiaji, kufanya mabadiliko magumu ya kiholela, na wakati huo huo kufuatilia daima hali ya mazingira ya programu na vifaa vinavyozunguka, na hivyo kufikia uaminifu mkubwa wa uendeshaji. Wakati wa kutekeleza kila taarifa, mkalimani huangalia sifa nyingi za mfumo wa uendeshaji na, ikiwa ni lazima, hujulisha msanidi programu kwa undani iwezekanavyo kuhusu matatizo yanayojitokeza. Kwa kuongezea, mkalimani ni rahisi sana kutumia kama zana ya kujifunza programu, kwani hukuruhusu kuelewa kanuni za utendakazi wa mwendeshaji yeyote katika lugha.


Mchakato wa mkusanyiko umegawanywa katika hatua kadhaa:

1. Preprocessor. Programu ya chanzo inachakatwa kwa kubadilisha macros zilizopo na faili za kichwa.

2. Uchambuzi wa kileksia na kisintaksia. Programu inabadilishwa kuwa mlolongo wa ishara na kisha kuwa uwakilishi wa ndani wa mti.

3. Uboreshaji wa kimataifa. Uwakilishi wa ndani wa programu hubadilishwa mara kwa mara ili kupunguza ukubwa na muda wa utekelezaji wa programu.

4. Uzalishaji wa kanuni. Uwakilishi wa ndani hubadilishwa kuwa vizuizi vya maagizo ya processor, ambayo hubadilishwa kuwa maandishi ya kusanyiko au msimbo wa kitu.

5. Bunge. Ikiwa maandishi ya kusanyiko yanatolewa, hukusanywa ili kupata msimbo wa kitu.

6. Bunge. Kikusanyaji huchanganya faili kadhaa za vitu kuwa faili inayoweza kutekelezwa au maktaba.

Kwenye awamu uchambuzi wa kileksika (LA) programu ya kuingiza, ambayo ni mkondo wa wahusika, imegawanywa katika leksemu - maneno kwa mujibu wa ufafanuzi wa lugha. Urasmi kuu unaotokana na utekelezaji wa vichanganuzi vya kileksika ni mashine za hali ya mwisho na semi za kawaida. Kichanganuzi cha kileksika kinaweza kufanya kazi kwa njia kuu mbili: ama kama njia ndogo inayoitwa na kichanganuzi baada ya kila ishara, au kama kibali kamili, ambacho matokeo yake ni faili ya ishara. Katika mchakato wa kutenganisha leksemu, LA inaweza kuunda jedwali za majina na viambatisho kwa kujitegemea, na kutoa maadili kwa kila leksemu wakati mwingine inapofikiwa. Katika kesi hii, meza ya majina imejengwa katika awamu zinazofuata (kwa mfano, wakati wa mchakato wa kuchanganua).

Katika hatua ya LA, baadhi ya makosa (rahisi) hugunduliwa (herufi zisizo sahihi, rekodi isiyo sahihi ya nambari, vitambulisho, nk).

Hebu tuangalie kwa karibu hatua ya uchanganuzi wa kileksika.

Kazi kuu ya uchanganuzi wa kileksika - mapumziko maandishi ya kuingiza, inayojumuisha mfuatano wa herufi moja, mfuatano wa maneno, au leksimu, i.e. chagua maneno haya kutoka kwa mfuatano unaoendelea wa wahusika. Kwa mtazamo huu, herufi zote za mfuatano wa ingizo zimegawanywa katika herufi ambazo ni za leksemu fulani, na herufi zinazotenganisha leksemu (delimiters). Katika baadhi ya matukio, kunaweza kuwa hakuna watenganishaji kati ya ishara. Kwa upande mwingine, katika lugha zingine, ishara zinaweza kuwa na herufi zisizo na maana (kwa mfano, herufi ya nafasi katika Fortran). Katika C, thamani ya kutenganisha ya vibambo delimiter inaweza kuzuiwa ("\" mwishoni mwa mstari ndani ya "...").

Kwa kawaida, leksemu zote zimegawanywa katika madarasa. Mifano ya madarasa kama haya ni nambari (jumla, octal, hexadecimal, halisi, nk), vitambulisho, nyuzi. Maneno muhimu na alama za uakifishaji (wakati mwingine huitwa herufi delimiter) zimeangaziwa kando. Kwa kawaida, manenomsingi ni baadhi ya vitambulishi vidogo vyenye ukomo. Katika baadhi ya lugha (kwa mfano, PL/1), maana ya leksemu inaweza kutegemea muktadha wake na haiwezekani kufanya uchanganuzi wa kileksia kwa kutengwa na uchanganuzi wa kisintaksia.

Kwa mtazamo wa awamu zaidi za uchanganuzi, kichanganuzi cha kileksika hutoa habari za aina mbili: kwa uchanganuzi wa kisintaksia, ambao hufanya kazi baada ya ile ya kileksia, habari juu ya mlolongo wa madarasa ya leksemu, delimiters na maneno ni muhimu, na kwa uchambuzi wa muktadha, kufanya kazi baada ya ile ya kisintaksia, habari kuhusu maana mahususi za leksemu za kibinafsi (vitambulisho, nambari, n.k.) ni muhimu.

Kwa hivyo, mpango wa jumla wa operesheni ya analyzer ya lexical ni kama ifuatavyo. Kwanza, ishara moja hutolewa (labda kwa kutumia wahusika wa delimiter). Manenomsingi yanatambuliwa ama kwa utoboaji dhahiri moja kwa moja kutoka kwa maandishi, au kwa kutoa kwanza kitambulisho na kisha kuangalia ikiwa ni cha seti ya manenomsingi.

Ikiwa leksemu iliyochaguliwa ni kikomo, basi (kwa usahihi zaidi, baadhi ya sifa zake) hutolewa kama matokeo ya uchanganuzi wa kileksika. Ikiwa leksemu iliyochaguliwa ni neno kuu, basi sifa ya neno kuu linalolingana huonyeshwa. Ikiwa ishara iliyochaguliwa ni kitambulisho, sifa ya kitambulisho hutolewa, na kitambulisho yenyewe kinahifadhiwa tofauti. Mwishowe, ikiwa ishara iliyochaguliwa ni ya darasa zingine za ishara (kwa mfano, ishara ni nambari, kamba, n.k.), basi sifa ya darasa linalolingana inarudishwa, na thamani ya ishara huhifadhiwa kando. .

Kichanganuzi cha kileksika kinaweza kuwa awamu huru ya tafsiri au utaratibu mdogo unaofanya kazi kwa kanuni ya "toa ishara". Katika kesi ya kwanza (Mchoro 3.1, a) pato la analyzer ni faili ya lexeme, kwa pili (Mchoro 3.1, b) lexeme hutolewa kila wakati analyzer inapatikana (katika kesi hii, kama sheria, sifa ya darasa la leksemu inarejeshwa kama tokeo la chaguo za kukokotoa za "kichanganuzi kileksia" , na thamani ya tokeni hupitishwa kupitia kigezo cha kimataifa). Kwa upande wa maadili ya usindikaji wa ishara, kichanganuzi kinaweza kutoa tu thamani ya kila ishara, katika hali ambayo ujenzi wa jedwali la kitu (vitambulisho, kamba, nambari, n.k.) huahirishwa kwa awamu za baadaye, au inaweza kuunda meza za kitu. yenyewe. Katika kesi hii, thamani ya ishara ni pointer kwa kuingia kwenye meza inayofanana.

Mchele. 3.1:

Uendeshaji wa kichanganuzi cha leksimu hubainishwa na mashine fulani ya hali ya mwisho. Walakini, maelezo ya moja kwa moja mashine ya hali ya mwisho usumbufu kutoka kwa mtazamo wa vitendo. Kwa hivyo, kutaja kichanganuzi cha lexical, kama sheria, usemi wa kawaida au sarufi ya mkono wa kulia hutumiwa. Taratibu zote tatu (mashine za hali ya mwisho, semi za kawaida na sarufi zenye mstari wa kulia) zina nguvu sawa ya kujieleza. Hasa, kulingana na kujieleza mara kwa mara au sarufi yenye mstari wa kulia, mtu anaweza kuunda kiotomatiki chenye kikomo kinachotambua lugha sawa.

Kazi kuu ya kuchanganua - uchambuzi wa muundo wa programu. Kama sheria, muundo unaeleweka kama mti unaolingana na uchanganuzi katika sarufi isiyo na muktadha wa lugha. Hivi sasa, uchanganuzi wa LL(1) (na lahaja - asili ya kujirudia), au uchanganuzi wa LR(1) na anuwai zake (LR(0), SLR(1), LALR(1) na zingine) hutumiwa mara nyingi. . Asili ya kujirudia hutumiwa mara nyingi zaidi wakati wa kupanga kichanganuzi kwa mikono, LR(1) - wakati wa kutumia mifumo ya otomatiki ya kuunda vichanganuzi.

Matokeo ya uchanganuzi ni mti wa sintaksia na viungo vya jedwali la majina. Mchakato wa kuchanganua pia unaonyesha makosa yanayohusiana na muundo wa programu.

Katika hatua ya uchambuzi wa muktadha vitegemezi vinatambuliwa kati ya sehemu za programu ambazo haziwezi kuelezewa kwa sintaksia isiyo na muktadha. Hizi ni viunganisho vya "maelezo-matumizi", haswa uchambuzi wa aina za vitu, uchambuzi wa upeo, mawasiliano ya vigezo, lebo na zingine. Katika mchakato wa uchambuzi wa muktadha, jedwali la alama hujengwa, ambalo linaweza kuzingatiwa kama jedwali la majina, linaloongezewa na habari juu ya maelezo (mali) ya vitu.

Urasmi mkuu unaotumika katika uchanganuzi wa kimuktadha ni sarufi sifa. Matokeo ya awamu ya uchanganuzi wa muktadha ni mti wa programu unaohusishwa. Habari juu ya vitu inaweza kutawanywa kwenye mti yenyewe au kujilimbikizia kwenye meza tofauti za alama. Wakati wa mchakato wa uchanganuzi wa muktadha, makosa yanayohusiana na matumizi yasiyo sahihi ya vitu yanaweza pia kugunduliwa.

Kisha programu inaweza kuwa kuhamishwa kwa uwakilishi wa ndani . Hii inafanywa kwa madhumuni ya uboreshaji na/au urahisi wa kutengeneza msimbo. Kusudi lingine la kubadilisha programu kuwa uwakilishi wa ndani ni hamu ya kuwa nayo mkusanyaji portable. Halafu ni awamu ya mwisho tu (kizazi cha msimbo) inategemea mashine. Nukuu ya kiambishi awali au kiambishi cha posta, grafu iliyoelekezwa, triples, quadruples na nyinginezo zinaweza kutumika kama uwakilishi wa ndani.

Kunaweza kuwa na awamu kadhaa za uboreshaji . Uboreshaji kawaida kugawanywa katika kutegemea mashine na mashine-huru, ndani na kimataifa. Uboreshaji fulani unaotegemea mashine hufanywa wakati wa awamu ya kuunda msimbo. Uboreshaji wa kimataifa inajaribu kuzingatia muundo wa mpango mzima, wa ndani - tu vipande vyake vidogo. Uboreshaji wa kimataifa unategemea uchanganuzi wa mtiririko wa kimataifa, ambao unafanywa kwenye grafu ya programu na kimsingi inawakilisha mabadiliko ya grafu hii. Katika kesi hii, mali kama vile uchambuzi wa utaratibu, uchambuzi wa kati, uchambuzi wa maeneo ya maisha ya vigezo, nk inaweza kuzingatiwa.

Hatimaye, utengenezaji wa kanuni- awamu ya mwisho ya utangazaji. Matokeo yake ni moduli ya mkusanyiko au moduli ya kitu (au mzigo). Wakati wa mchakato wa kutengeneza msimbo, baadhi ya hatua zinaweza kufanywa. uboreshaji wa ndani, kama vile mgao wa rejista, uteuzi wa matawi marefu au mafupi, kuzingatia gharama za maagizo wakati wa kuchagua mlolongo maalum wa maagizo. Mbinu mbalimbali zimetengenezwa kwa ajili ya utengenezaji wa msimbo kama vile majedwali ya maamuzi, ulinganishaji wa ruwaza ikijumuisha upangaji wa programu mahiri, mbinu mbalimbali za kisintaksia.

Bila shaka, awamu fulani za mtafsiri zinaweza kutokuwepo kabisa au kuunganishwa. Katika hali rahisi zaidi ya mfasiri wa pasi moja, hakuna awamu ya wazi ya kutoa uwakilishi wa kati na uboreshaji; awamu zilizosalia zimeunganishwa kuwa moja, na hakuna mti wa sintaksia uliojengwa wazi.

Tuma kazi yako nzuri katika msingi wa maarifa ni rahisi. Tumia fomu iliyo hapa chini

Kazi nzuri kwa tovuti">

Wanafunzi, wanafunzi waliohitimu, wanasayansi wachanga wanaotumia msingi wa maarifa katika masomo na kazi zao watakushukuru sana.

Iliyotumwa kwenye http://www.allbest.ru

Utangulizi

1.1 Uchambuzi wa juu chini

1.2 Uchambuzi wa chini-juu

1.2.1 LR(k) - sarufi

1.2.1.1 LR(0) - sarufi

1.2.2 LALR(1) - sarufi

2. Ukuzaji wa mfasiri

2.1 Uchambuzi wa mahitaji

2.2 Muundo

2.2.1 Kubuni kichanganuzi cha kileksika

2.2.4 Utekelezaji wa programu ya kichanganuzi

2.3 Kuweka msimbo

2.4 Upimaji

Hitimisho

Orodha ya vyanzo vilivyotumika

Kiambatisho A. Uorodheshaji wa maandishi ya programu ya mfasiri

Kiambatisho B. Matokeo ya mtihani

Kiambatisho B. Mchoro wa programu ya Mtafsiri

Utangulizi

Siku nyingi zimepita wakati, kabla ya kuandika programu, ilibidi uelewe na kukumbuka maagizo kadhaa ya mashine. Mpangaji programu wa kisasa huunda kazi zake katika lugha za kiwango cha juu cha programu na hutumia lugha ya kusanyiko tu katika hali za kipekee. Kama inavyojulikana, lugha za algorithmic hupatikana kwa programu tu baada ya kuunda watafsiri kutoka kwa lugha hizi.

Lugha za programu ni tofauti kabisa kutoka kwa kila mmoja kwa kusudi, muundo, ugumu wa semantic, na njia za utekelezaji. Hii inaweka vipengele vyake maalum juu ya maendeleo ya watafsiri maalum.

Lugha za programu ni zana za kutatua shida katika maeneo tofauti ya somo, ambayo huamua maalum ya shirika lao na tofauti za kusudi. Mifano ni pamoja na lugha kama vile Fortran, ambayo inaelekezwa kwa mahesabu ya kisayansi, C, ambayo imekusudiwa kwa programu ya mifumo, Prolog, ambayo inaelezea kwa ufanisi shida za uelekezaji, na Lisp, ambayo hutumiwa kwa usindikaji wa orodha ya kujirudia. Mifano hii inaweza kuendelea. Kila eneo la somo huweka mahitaji yake juu ya shirika la lugha yenyewe. Kwa hiyo, tunaweza kutambua aina mbalimbali za uwakilishi wa waendeshaji na maneno, tofauti katika seti ya shughuli za msingi, na kupungua kwa ufanisi wa programu wakati wa kutatua matatizo yasiyohusiana na eneo la somo. Tofauti za kiisimu pia hujitokeza katika muundo wa wafasiri. Lisp na Prolog mara nyingi hutekelezwa katika hali ya ukalimani kutokana na ukweli kwamba hutumia uzalishaji wa aina za data wakati wa kukokotoa. Watafsiri wa Fortran wana sifa ya uboreshaji mkali wa msimbo wa mashine unaosababishwa, ambao unawezekana kwa sababu ya semantiki rahisi ya muundo wa lugha - haswa, kwa sababu ya kukosekana kwa njia za kutaja mbadala wa vigeu kupitia viashiria au marejeleo. Uwepo wa viashiria katika lugha C unawasilisha mahitaji maalum Kwa usambazaji wa nguvu kumbukumbu.

Muundo wa lugha unaashiria uhusiano wa kidaraja kati ya dhana zake, ambazo zinaelezewa na kanuni za kisintaksia. Lugha za programu zinaweza kutofautiana sana kutoka kwa kila mmoja katika shirika la dhana za mtu binafsi na uhusiano kati yao. Lugha ya programu ya PL/1 inaruhusu uwekaji kiota kiholela wa taratibu na utendakazi, ilhali katika C vipengele vyote lazima ziwe katika kiwango cha nje cha kuota. Lugha ya C++ inaruhusu vigeu kutangazwa wakati wowote katika programu kabla ya matumizi yake ya kwanza, wakati katika vigeu vya Pascal lazima vifafanuliwe katika eneo maalum la tamko. Kuchukua hii hata zaidi ni PL/1, ambayo inaruhusu kutofautisha kutangazwa baada ya kutumika. Au unaweza kuacha maelezo kabisa na kutumia sheria chaguo-msingi. Kulingana na uamuzi uliochukuliwa, mtafsiri anaweza kuchambua programu kwa njia moja au zaidi, ambayo huathiri kasi ya tafsiri.

Semantiki za lugha za programu hutofautiana sana. Wanatofautiana sio tu katika vipengele vya utekelezaji wa shughuli za mtu binafsi, lakini pia katika dhana za programu, ambazo huamua tofauti za msingi katika mbinu za maendeleo ya programu. Maelezo mahususi ya utekelezaji wa shughuli yanaweza kuhusisha muundo wa data inayochakatwa na sheria za kuchakata aina sawa za data. Lugha kama vile PL/1 na APL inasaidia matrix na uendeshaji wa vekta. Lugha nyingi hufanya kazi hasa na scalars, kutoa taratibu na kazi zilizoandikwa na watengeneza programu kwa ajili ya usindikaji wa safu. Lakini hata wakati wa kufanya operesheni ya kuongeza nambari mbili, lugha kama C na Pascal zinaweza kuishi tofauti.

Pamoja na jadi programu ya utaratibu, pia huitwa muhimu, kuna dhana kama vile programu ya kufanya kazi, programu ya mantiki na upangaji unaolenga kitu. Muundo wa dhana na vitu vya lugha hutegemea sana dhana iliyochaguliwa, ambayo pia huathiri utekelezaji wa mtafsiri.
Hata lugha moja inaweza kutekelezwa kwa njia kadhaa. Hii ni kutokana na ukweli kwamba nadharia ya sarufi rasmi inaruhusu mbinu mbalimbali za kuchanganua sentensi zilezile. Kwa mujibu wa hili, watafsiri wanaweza kupata matokeo sawa (mpango wa kitu) kutoka kwa maandishi asilia kwa njia tofauti.
Wakati huo huo, lugha zote za programu zina idadi ya sifa za jumla na vigezo. Hali hii ya kawaida pia huamua kanuni za kupanga wafasiri ambazo zinafanana kwa lugha zote.
Lugha za programu zimeundwa ili kurahisisha programu. Kwa hivyo, waendeshaji wao na miundo ya data ina nguvu zaidi kuliko ile ya lugha za mashine.
Ili kuongeza uwazi wa programu, badala ya nambari za nambari, ishara au uwakilishi wa picha miundo ya lugha ambayo ni rahisi zaidi kwa mtazamo wa kibinadamu.
Kwa lugha yoyote inafafanuliwa:
- alama nyingi ambazo zinaweza kutumika kuandika programu sahihi (alfabeti), vipengele vya msingi,
- programu nyingi sahihi (syntax),
- "maana" ya kila mpango sahihi (semantiki).
Bila kujali maalum ya lugha, mtafsiri yeyote anaweza kuchukuliwa kuwa kigeuzi kazi F, kutoa ramani ya kipekee kutoka X hadi Y, ambapo X ni programu katika lugha ya chanzo, Y ni programu katika lugha ya pato. Kwa hiyo, mchakato wa tafsiri yenyewe unaweza kuwakilishwa rasmi kwa urahisi na kwa uwazi kabisa: Y = F(X).
Rasmi, kila mmoja programu sahihi X ni mfuatano wa herufi kutoka kwa baadhi ya alfabeti A, iliyogeuzwa kuwa mfuatano wake Y, unaojumuisha herufi kutoka kwa alfabeti B.
Lugha ya programu, kama mfumo wowote changamano, inafafanuliwa kupitia safu ya dhana ambayo inafafanua uhusiano kati ya vipengele vyake. Dhana hizi zimeunganishwa kwa mujibu wa kanuni za kisintaksia. Kila programu iliyojengwa kulingana na sheria hizi ina muundo wa kihierarkia unaolingana.
Katika suala hili, sifa zifuatazo za kawaida zinaweza kutofautishwa zaidi kwa lugha zote na programu zao: kila lugha lazima iwe na sheria zinazoruhusu kutengeneza programu zinazolingana na lugha hii au kutambua mawasiliano kati ya programu zilizoandikwa na lugha fulani.

Kipengele kingine cha tabia ya lugha zote ni semantiki zao. Huamua maana ya utendakazi wa lugha na usahihi wa oparesheni. Minyororo ambayo ina muundo sawa wa kisintaksia katika lugha tofauti za programu inaweza kutofautiana katika semantiki (ambayo, kwa mfano, inazingatiwa katika C ++, Pascal, Msingi). Ujuzi wa semantiki za lugha hukuruhusu kuitenganisha na sintaksia yake na kuitumia kwa ubadilishaji hadi lugha nyingine (kutoa msimbo).

Madhumuni ya kazi hii ya kozi ni kukuza mfasiri wa kielimu kutoka kwa lugha fulani ya maandishi iliyorahisishwa ya kiwango cha juu.

1. Mbinu za uchanganuzi wa sarufi

Hebu tuangalie mbinu za kimsingi za uchanganuzi wa kisarufi.

1.1 Uchambuzi wa juu chini

Wakati wa kuchanganua kutoka juu hadi chini, miongozo ya kati husogea kando ya mti kwa mwelekeo kutoka kwa mizizi hadi majani. Katika kesi hii, wakati wa kutazama mnyororo kutoka kushoto kwenda kulia, hitimisho la mkono wa kushoto litapatikana kwa kawaida. Katika uchanganuzi wa kubainisha, tatizo litakuwa ni sheria ipi itatumika kutatua nonterminal ya kushoto kabisa.

1.1.1 LL(k) - lugha na sarufi

Fikiria mti wa uelekezaji katika mchakato wa kupata pato la kushoto la mnyororo. Msururu wa kati katika mchakato wa uelekezaji unajumuisha msururu wa vituo w, sehemu ya kushoto kabisa isiyo ya mwisho A, sehemu iliyoelekezwa chini ya x:

-S--

/ \

/ -A-x-\

/ | \

-w---u----

Kielelezo cha 1

Ili kuendelea kuchanganua, ni muhimu kuchukua nafasi ya nonterminal A kulingana na moja ya sheria za fomu A:y. Ikiwa unataka uchanganuzi uwe wa kuamua (hakuna kurudi), sheria hii inahitaji kuchaguliwa kwa njia maalum. Sarufi inasemekana kuwa na sifa ya LL(k) ikiwa, ili kuchagua sheria, inatosha kuzingatia tu wAx na herufi za k za kwanza za mfuatano ambao haujachunguzwa u. Herufi ya kwanza L (Kushoto) inahusu kutazama mnyororo wa pembejeo kutoka kushoto kwenda kulia, ya pili inahusu pato la kushoto linalotumika.

Wacha tufafanue seti mbili za minyororo:

a) KWANZA(x) ni seti ya mifuatano ya mwisho inayotokana na x, iliyofupishwa hadi herufi k.

b) FUATA (A) - seti ya minyororo ya mwisho iliyofupishwa kwa herufi k, ambayo inaweza kufuata mara moja A kwenye minyororo ya pato.

Sarufi ina sifa ya LL(k) ikiwa, kutokana na kuwepo kwa minyororo miwili ya makisio ya kushoto:

S:: wAx: wzx:: wu

S:: wAx: wtx:: wv

kutoka kwa hali ya KWANZA(u)=KWANZA(v) inafuata z=t.

Katika kesi ya k = 1, kuchagua sheria kwa A, inatosha kujua tu isiyo ya terminal A na a - tabia ya kwanza ya mnyororo u:

- kanuni A:x inapaswa kuchaguliwa ikiwa a imejumuishwa katika FIRST(x),

- kanuni A:e inapaswa kuchaguliwa ikiwa a imejumuishwa katika FOLLOW(A).

Sifa ya LL(k) inaweka vizuizi vikali kwenye sarufi. Kwa mfano, LL(2) sarufi S: as | a haina mali ya LL(1), kwa sababu KWANZA(aS)=KWANZA(a)=a. Katika kesi hii, unaweza kupunguza thamani ya k kwa kutumia "factorization" (kuondoa sababu kwenye mabano):

S: aA

A: S | e

Sarufi yoyote ya LL(k) haina utata. Sarufi ya urejeshaji wa kushoto si ya darasa LL(k) kwa k yoyote. Wakati mwingine inawezekana kubadilisha sarufi isiyo ya LL(1) kuwa sarufi LL(1) sawa kwa kuondoa urejeshaji wa kushoto na uanzishaji. Hata hivyo, tatizo la kuwepo kwa sarufi LL(k)-sawa kwa sarufi isiyo ya LL(k)-kiholela haliwezi kuamuliwa.

1.1.2 Mbinu ya mteremko wa kujirudia

Njia ya asili ya kujirudia inalenga matukio hayo wakati mkusanyaji amepangwa katika mojawapo ya lugha za kiwango cha juu, wakati matumizi ya taratibu za kurudia inaruhusiwa.

Wazo kuu la asili ya kujirudia ni kwamba kila nonterminal ya sarufi ina utaratibu unaolingana ambao unatambua mlolongo wowote unaozalishwa na nonterminal hii. Taratibu hizi huitana zinapohitajika.

Asili ya kujirudi inaweza kutumika kwa sarufi yoyote ya LL(1). Kila isiyo ya mwisho ya sarufi ina utaratibu unaolingana, ambao huanza na mpito kwa lebo iliyohesabiwa na ina msimbo unaofanana na kila kanuni kwa hii isiyo ya mwisho. Kwa alama hizo za ingizo ambazo ni za seti ya uteuzi ya kanuni hii, mpito uliokokotwa huhamisha udhibiti kwa msimbo unaolingana na sheria hiyo. Kwa alama za pembejeo zilizobaki, udhibiti huhamishiwa kwa utaratibu wa kushughulikia makosa.

Nambari ya sheria yoyote ina utendakazi kwa kila herufi iliyojumuishwa upande wa kulia kanuni. Shughuli zimepangwa kwa utaratibu ambao alama zinaonekana katika sheria. Kufuatia operesheni ya mwisho, msimbo una kurudi kutoka kwa utaratibu.

Kutumia asili ya kujirudia katika lugha ya kiwango cha juu hurahisisha upangaji na utatuzi.

1.2 Uchambuzi wa chini-juu

Wacha tuzingatie uchanganuzi wa chini-juu, ambao pini za kati huhamishwa kando ya mti kuelekea mzizi. Ukisoma herufi kwenye kamba kutoka kushoto kwenda kulia, mti wa kuchambua utaonekana kama hii:

-S--

/ \

/-x-\

/ | \

--w--b--u-

Kielelezo cha 2

Pato la kati lina fomu ya xbu, ambapo x ni mlolongo wa vituo na zisizo za vituo, ambayo sehemu inayotazamwa ya mnyororo wa mwisho w ni pato, bu ni sehemu isiyoonekana ya mnyororo wa terminal, b ni ishara inayofuata. Ili kuendelea na uchanganuzi, unaweza kuongeza herufi b kwenye sehemu inayotazamwa ya mnyororo (fanya kinachojulikana kama "shift"), au uchague mwisho wa x mnyororo kama huo z (x=yz) ambayo moja ya sheria za sarufi B:z zinaweza kutumika kwa z na kubadilishwa x kwa mnyororo yB (kufanya kinachojulikana kama "convolution"):

-S-- -S--

/ \ / \

/-x-b-\ /yB-\

/ | \ / | \

--w--b--u- --w--b--u-

Kielelezo 3 - Baada ya zamu Kielelezo 4 - Baada ya ubadilishaji

Ikiwa convolution inatumika tu kwa wahusika wa mwisho x, basi tutapokea matokeo sahihi ya mnyororo. Uchanganuzi huu unaitwa LR, ambapo ishara L (Kushoto, kushoto) inarejelea kutazama mnyororo kutoka kushoto kwenda kulia, na R (Kulia, kulia) inarejelea matokeo yanayotokana.

Mlolongo wa shughuli za kuhama na kukunja ni muhimu. Kwa hivyo, uchanganuzi wa kibainishi unahitaji kuchagua kati ya mabadiliko na ubadilishaji (na sheria tofauti za ubadilishaji) kwa kila wakati.

1.2.1 LR(k) - sarufi

Ikiwa, katika mchakato wa uchanganuzi wa LR, inawezekana kufanya uamuzi wa kuamua kuhusu kuhama/kupunguza, kwa kuzingatia tu kamba x na herufi za k ya kwanza za sehemu isiyoonekana ya kamba ya pembejeo u (herufi hizi za k huitwa kamba ya mapema. ), sarufi inasemekana kuwa na mali ya LR(k).

-S--

/ \

/-x-\

--w----u--

Kielelezo cha 5

Tofauti kati ya sarufi LL(k) na LR(k) katika suala la mti wa uelekezaji:

-S-

/ | \

/A\

/ / \ \

-w---v---u-

Kielelezo cha 6

Kwa upande wa LL(k)-sarufi, kanuni inayotumika kwa A inaweza kuamuliwa kipekee na w na herufi k ya kwanza ya vu, na katika kesi ya LR(k)-sarufi, kwa w,v na k ya kwanza. wahusika wa u. Hoja hii isiyo ya ukali inaonyesha kuwa LL(k)-lugha< LR(k)-языки (при k > 0).

1.2.1.1 LR(0) - sarufi

Hebu kwanza tuzingatie sarufi rahisi zaidi za darasa hili - LR(0). Wakati wa kuchanganua mfuatano katika lugha ya LR(0), si lazima utumie mnyororo wa mapema hata kidogo - chaguo kati ya shift na fold hufanywa kulingana na mnyororo x. Kwa kuwa wakati wa kuchanganua hubadilika tu kutoka mwisho wa kulia, inaitwa stack. Tutadhani kuwa katika sarufi hakuna wahusika wasio na maana na tabia ya kuanzia haitokei kwenye pande za haki za sheria - basi convolution kwa mhusika anayeanza huashiria kukamilika kwa mafanikio ya uchanganuzi. Wacha tujaribu kuelezea seti ya minyororo ya vituo na visivyo vya vituo vinavyoonekana kwenye rafu wakati wote wa uchanganuzi wa LR (kwa maneno mengine, makisio yote ya mkono wa kulia kutoka kwa sarufi).

Wacha tufafanue seti zifuatazo:

L(A:v) - muktadha wa kushoto wa sheria A:v - seti ya hali za rafu mara moja kabla ya v kukunjwa kuwa A wakati wa uchanganuzi wote wa LR uliofaulu. Ni wazi, kila mlolongo katika L(A:v) unaishia katika mst. Ikiwa mkia v wa minyororo yote kama hiyo umekatwa, basi tunapata seti ya minyororo inayotokea upande wa kushoto wa A wakati wa makisio yote ya mkono wa kulia yaliyofaulu. Wacha tuonyeshe seti hii kama L(A) - muktadha wa kushoto wa nonterminal A.

Wacha tujenge sarufi kwa seti ya L(A). Viingilio vya sarufi mpya vitakuwa viambishi na viambishi visivyo vya sarufi asilia; viambishi visivyo vya sarufi mpya vitaashiriwa na ,... - maadili yao yatakuwa muktadha wa kushoto wa nonterminals ya sarufi asili. Ikiwa S ni ishara ya mwanzo ya sarufi asilia, basi sarufi ya miktadha ya kushoto itakuwa na kanuni : e - muktadha wa kushoto S ina mnyororo tupu Kwa kila kanuni ya sarufi asili, kwa mfano, A: B C d E

na ongeza sheria kwa sarufi mpya:

: - L(B) inajumuisha L(A)

: B - L(C) inajumuisha L(A) B

: B C d - L(E) inajumuisha L(A) B C d

Sarufi inayotokana ina muundo maalum (sarufi kama hizo huitwa mstari wa kushoto), kwa hivyo, seti za miktadha ya mkono wa kushoto.

- mara kwa mara. Inafuata kwamba ikiwa mfuatano ni wa muktadha wa kushoto wa nonterminal inaweza kuhesabiwa kwa kufata kwa kutumia mashine ya hali ya kikomo, kuchanganua mfuatano kutoka kushoto kwenda kulia. Hebu tueleze mchakato huu kwa kujenga.

Wacha tuite hali ya LR(0) kuwa sheria ya sarufi iliyo na alama moja kati ya alama za upande wa kulia wa sheria. Kwa mfano, kwa sarufi S:A; A:aAA; A:b LR(0)-hali zifuatazo zipo: S:_A; S:A_; A:_aAA; A:a_AA; A:aA_A; A:aAA_; A:_b; A:b_. (nafasi inaonyeshwa kwa kusisitiza).

Tutasema kwamba mnyororo x unalingana na hali A:b_c ikiwa x=ab na a ni ya L(A). (Kwa maneno mengine, matokeo ya LR yanaweza kuendelezwa x_... = ab_...:: abc_...:: aA_...:: S_.) Kwa maneno haya, L(A:b) ni seti ya masharti yanayolingana na hali A:b_, L(A)

- minyororo inayolingana na hali A:_b, kwa kanuni yoyote A:b.

Acha V(u) iwe seti ya hali zinazolingana na u. Hebu tuonyeshe kwamba chaguo la kukokotoa V ni la kufata neno.

Ikiwa seti V(u) inajumuisha hali A:b_cd, basi hali A:bc_d ni ya V(uc). (c - terminal au isiyo ya mwisho; b, d - mlolongo (inaweza kuwa tupu) ya vituo na zisizo za mwisho). Hakuna hali zingine za fomu A:b_d, na isiyo tupu b katika V(uc). Inabakia kuongeza hali za fomu C:_... kwa V(uc), kwa kila C isiyo ya terminal ambayo muktadha wake wa kushoto una uc. Ikiwa hali A:..._C... (C-nonterminal) ni ya seti V(uc), basi uc ni ya L(C) na V(uc) inajumuisha hali za fomu C:_... kwa kanuni zote za C za sarufi.

V(e) ina hali S:_... (S-starting character), pamoja na hali A:_... ikiwa nonterminal A hutokea mara baada ya _ katika hali ambazo tayari zimejumuishwa katika V(e).

Hatimaye, tuko tayari kufafanua sarufi ya LR(0). Wacha uwe yaliyomo kwenye rafu wakati wa uchanganuzi wa LR, na V(u) iwe seti ya hali za LR(0) zinazolingana na u. Ikiwa V(u) ina hali ya fomu A:x_ (x-mfuatano wa vituo na visivyo vituo), basi u ni mali ya L(A:x) na ubadilishaji wa x hadi A unaruhusiwa. Ikiwa V(u ) ina hali A:..._a. .. (a-terminal), basi mabadiliko yanaruhusiwa. Mzozo wa mabadiliko ya mabadiliko unasemekana kuwepo ikiwa mabadiliko na ubadilishaji vinaruhusiwa kwa mfuatano ule ule. Mzozo wa kupunguza mapinduzi unasemekana kuwepo iwapo mienendo kwa mujibu wa sheria tofauti itaruhusiwa.

Sarufi inaitwa LR(0) ikiwa hakuna migongano ya kupunguza-badilisha au kupunguza mara kwa hali zote za rafu wakati wa makisio ya LR.

1.2.1.2 LR(k) - sarufi

Hali ya mrundikano pekee ndiyo inatumika kuamua kati ya kugeuza na kukunja katika uchanganuzi wa LR(0). Uchanganuzi wa LR(k) pia huzingatia herufi k za kwanza za sehemu isiyoonekana ya mnyororo wa kuingiza data (kinachojulikana kama mnyororo wa mapema). Ili kuhalalisha njia, unapaswa kurudia kwa uangalifu hoja ya aya iliyotangulia, ukifanya mabadiliko kwa ufafanuzi.

Pia tutajumuisha mlolongo wa mapema katika muktadha wa kushoto wa sheria. Ikiwa pato la kulia linatumia pato wAu: wvu, basi jozi wv,FIRSTk(u) ni ya Lk(A:v), na jozi w,FIRSTk(u) ni ya Lk(A). Seti ya muktadha wa kushoto, kama ilivyo kwa LR(0), inaweza kuhesabiwa kwa kutumia induction kwenye mnyororo wa kushoto. Wacha tuite hali ya LR(k)-jozi: kanuni ya sarufi iliyo na alama na mlolongo wa urefu usiozidi k. Tutatenganisha utawala kutoka kwa mlolongo wa mapema na mstari wa wima.

Tutasema kwamba mnyororo x unalingana na hali A:b_c|t ikiwa kuna pato la LR: x_yz = ab_yz:: abc_z:: aA_z:: S_, na FIRSTk(z) = t. Sheria za kuhesabu kwa inductive seti ya majimbo Vk ni kama ifuatavyo.

Vk(e) ina hali S:_a|e kwa sheria zote S:a, ambapo S ndio herufi inayoanza. Kwa kila hali A:_Ba|u kutoka Vk(e), kila kanuni B:b na mnyororo x mali ya FIRSTk(au), ni muhimu kuongeza hali B:_b|x kwa Vk(e).

Ikiwa Vк(w) inajumuisha hali A:b_cd|u, basi hali A:bc_d|u itakuwa ya Vk(wc). Kwa kila hali A:b_Cd|u kutoka Vk(wc), kila kanuni C:f na mnyororo x mali ya FIRSTk(du) ni muhimu kuongeza hali C:_f|x kwa Vk(wc).

Tunatumia seti zilizoundwa za majimbo ya LR(k) kutatua suala la mabadiliko ya mabadiliko. Wacha uwe yaliyomo kwenye safu na x uwe mkufunzi. Ni wazi, ubadilishaji kulingana na sheria A:b unaweza kufanywa ikiwa Vk(u) ina hali A:b_|x. Kuamua ikiwa zamu inaruhusiwa kunahitaji uangalifu ikiwa sarufi ina sheria za kielektroniki. Katika hali A:b_c|t (c sio tupu), mabadiliko yanawezekana ikiwa c inaanza kutoka kwa terminal na x ni ya FIRSTk(ct). Kuzungumza kwa njia isiyo rasmi, unaweza kushinikiza ishara ya kushoto kabisa ya upande wa kulia wa sheria kwenye rundo, ukitayarisha ubadilishaji unaofuata. Ikiwa c inaanza na nonterminal (hali inaonekana kama A:b_Cd|t), kisha kusukuma alama kwenye rundo ili kujiandaa kwa ubadilishaji kuwa C kunawezekana tu ikiwa C haitoi mnyororo tupu. Kwa mfano, katika hali V(e)= S:_A|e; A:_AaAb|e,a, A:_|e,a hakuna zamu zinazoruhusiwa, kwa sababu Wakati wa kupata minyororo ya mwisho kutoka kwa A, kwa hatua fulani inahitajika kutumia sheria A: e kwa isiyo ya mwisho A iko kwenye mwisho wa kushoto wa mnyororo.

Wacha tufafanue seti ya EFFk(x), inayojumuisha vitu vyote vya seti FIRSTk(x), wakati wa kupata ambayo nonterminal kwenye mwisho wa kushoto wa x (ikiwa kuna moja) haijabadilishwa na mnyororo tupu. Katika masharti haya, mabadiliko yanaruhusiwa ikiwa katika kuweka Vk(u) kuna hali A:b_c|t, c sio tupu na x ni ya EFFk(ct).

Sarufi inaitwa LR(k)-sarufi ikiwa hakuna hali ya LR(k) iliyo na hali mbili A:b_|u na B:c_d|v kwamba wewe ni wa EFFk(dv). Jozi kama hizo zinalingana na mzozo wa kupunguza mara ikiwa d haina kitu, na mzozo wa shift-fold ikiwa d sio tupu.

Kwa mazoezi, sarufi ya LR(k) haitumiki kwa k>1. Kuna sababu mbili za hii. Kwanza: sana idadi kubwa LR(k) inasema. Pili: kwa lugha yoyote inayofafanuliwa na LR(k)-sarufi, kuna LR(1)-sarufi; Zaidi ya hayo, kwa lugha yoyote ya kibainishi ya KS kuna sarufi ya LR(1).

Idadi ya LR(1) inasema kwa vitendo sarufi za kuvutia pia ni kubwa kabisa. Sarufi kama hizo mara chache huwa na sifa ya LR(0). Kwa mazoezi, njia ya kati kati ya LR(0) na LR(1), inayojulikana kama LALR(1), hutumiwa mara nyingi zaidi.

1.2.2 LALR(1) - sarufi

Mbinu hizi mbili zinatokana na wazo moja. Wacha tujenge seti ya kanuni za LR(0)-hali za sarufi. Ikiwa seti hii haina migogoro, basi kichanganuzi cha LR(0) kinaweza kutumika. Vinginevyo, tutajaribu kutatua migogoro ambayo imetokea kwa kuzingatia mlolongo wa mapema wa herufi moja. Kwa maneno mengine, wacha tujaribu kuunda kichanganuzi cha LR(1) na majimbo mengi ya LR(0).

Mbinu ya LALR(1) (Angalia Mbele) ni kama ifuatavyo. Wacha tuanzishe uhusiano wa usawa kwenye seti ya hali za LR(1): tutazingatia hali mbili sawa ikiwa zinatofautiana tu katika minyororo yao inayoongoza. Kwa mfano, hali A:Aa_Ab|e na A:Aa_Ab|a ni sawa. Wacha tuunde seti ya kisheria ya majimbo ya LR(1) na tuchanganye majimbo yanayojumuisha seti ya hali sawa.

Ikiwa seti inayotokana ya majimbo haina migogoro ya LR(1), na kwa hivyo inaruhusu ujenzi wa kichanganuzi cha LR(1), basi sarufi inasemekana kuwa na mali ya LR(1).

2. Ukuzaji wa mfasiri

2.1 Uchambuzi wa mahitaji

Katika kazi hii ya kozi, inahitajika kukuza mfasiri wa kielimu katika mfumo wa mkalimani kutoka kwa lugha iliyofafanuliwa na sarufi rasmi inayolingana. Kuna hatua kuu nne za kukuza mkalimani:

Kubuni kichanganuzi cha kileksika;

Ubunifu wa mashine ya kuuza;

Utekelezaji wa programu ya mchanganuzi;

Maendeleo ya moduli ya tafsiri.

Maendeleo yatafanywa kwa kutumia mfumo wa uendeshaji wa Windows XP kwenye mtu binafsi Kompyuta ya IBM PC na processor Intel Pentium IV.

Kulingana na mitindo ya ukuzaji programu, lugha ya utayarishaji ya C# katika mazingira ya Visual Studio 2010 ilichaguliwa ili kutekeleza mfasiri wa elimu.

2.2 Muundo

2.1.1 Kubuni kichanganuzi cha kileksika

Lexical uchanganuzi unahusisha kuchanganua programu (chanzo) iliyotafsiriwa na kutambua leksimu zinazounda sentensi za matini chanzi. Ishara ni pamoja na, haswa, maneno muhimu, ishara za operesheni, vitambulisho, viunga, vibambo maalum, nk.

Matokeo ya kazi ya uchanganuzi wa lexical (skana) ni mlolongo wa ishara, na kila ishara kawaida huwakilishwa na msimbo fulani wa urefu usiobadilika (kwa mfano, nambari kamili), na vile vile kizazi cha ujumbe kuhusu makosa ya kisintaksia (lexical). , kama ipo. Ikiwa ishara ni, kwa mfano, neno la msingi, basi kanuni yake inatoa taarifa zote muhimu. Katika kesi ya, kwa mfano, kitambulisho, jina la kitambulisho kinachotambuliwa linahitajika zaidi, ambalo kawaida hurekodiwa kwenye jedwali la vitambulisho, lililopangwa, kama sheria, kwa kutumia orodha. Jedwali sawa linahitajika kwa mara kwa mara.

Leksemu inaweza kuelezewa na sifa kuu mbili. Mojawapo ni kwamba leksemu ni ya darasa fulani (vigeu, vibadilishi, vitendawili, n.k.) Sifa ya pili inafafanua kipengele maalum cha darasa hili.

Aina mahususi ya jedwali la ishara (muundo wa data) haijalishi kwa mchanganuzi au mchanganuzi. Zote mbili zinahitaji tu kutoa uwezo wa kupata faharasa ambayo hutambulisha kwa njia ya kipekee, kwa mfano, kigezo fulani na kurudisha thamani ya faharasa ili kujaza maelezo kuhusu jina fulani tofauti katika jedwali la ishara.

Kuangalia jedwali la kitambulisho hufanya kazi kuu mbili:

a) kurekodi jina jipya kwenye jedwali wakati wa kuchakata maelezo tofauti;

b) kutafuta jina lililorekodiwa hapo awali kwenye jedwali.

Hii hukuruhusu kutambua hali zenye makosa kama vile maelezo mengi ya kigezo na uwepo wa kigezo ambacho hakijabainishwa.

Ukuzaji wa uchanganuzi wa kileksika ni sehemu ya kuiga otomatiki mbalimbali kwa ajili ya kutambua vitambulisho, viunga, maneno yaliyohifadhiwa nk Ikiwa ishara aina tofauti anza na mhusika sawa au mlolongo sawa wa wahusika, inaweza kuwa muhimu kuchanganya utambuzi wao.

Kwa kuendesha kichanganuzi cha lexical, tunavunja programu yetu kuwa ishara, baada ya hapo kila ishara hupita hundi ya urefu (ishara haiwezi kuwa zaidi ya wahusika 11). Baada ya kukamilisha hatua hii kwa ufanisi, tunaangalia eneo sahihi la ishara (maneno muhimu var, start, end, for, to, do, end_for). Kisha tunachambua leksemu zinazobadilika - hazipaswi kuwa na nambari katika maelezo yao na hazipaswi kurudiwa. Katika hatua ya mwisho, tunaangalia tahajia sahihi ya leksemu (maneno muhimu, vitambulisho visivyojulikana). Ikiwa angalau moja ya hundi itashindwa, kichanganuzi cha lexical huchapisha hitilafu.

Mchoro wa programu ya uchanganuzi wa kileksika umeonyeshwa katika Kiambatisho B katika Kielelezo B.1.

2.2.2 Muundo wa mashine ya kuuza

Hebu tufafanue sarufi ifuatayo:

G: (Vt, Va, I, R),

ambapo Vt ni seti ya alama za mwisho, Va ni seti ya alama zisizo za mwisho, mimi ni hali ya awali ya sarufi, R ni seti ya kanuni za sarufi.

Kwa sarufi hii, tunafafanua seti za alama za mwisho na zisizo za mwisho:

Wacha tutunge sheria za sarufi yetu G na kuziwasilisha katika Jedwali 1.

Jedwali 1 - kanuni za sarufi

Kanuni Na.

Upande wa kushoto wa sheria

Upande wa kulia wa kanuni

f ID = EX t EX d LE n;

Muendelezo wa jedwali 1.

Kanuni Na.

Upande wa kushoto wa sheria

Upande wa kulia wa kanuni

Uteuzi wa leksemu, tafsiri ya leksemu katika misimbo na orodha ya majina ya sarufi yametolewa katika jedwali 2, 3, 4, mtawalia.

Jedwali 2 - Uteuzi wa leksemu

Uteuzi wa ishara

neno kuu "anza" (mwanzo wa maelezo ya vitendo)

neno kuu "mwisho" (mwisho wa maelezo ya kitendo)

neno kuu "var" (maelezo ya kutofautisha)

neno kuu "soma" (opereta wa kuingiza data)

neno kuu "andika" (opereta wa pato la data)

neno kuu "kwa" (taarifa ya kitanzi)

neno kuu "kwa"

neno kuu "fanya"

neno kuu "end_case" (mwisho wa taarifa ya kitanzi)

aina tofauti "integer"

operesheni ya kuongeza

operesheni ya kutoa

operesheni ya kuzidisha

kitenganishi herufi ":"

mhusika wa kitenganishi ";"

kitenganishi herufi "("

kitenganishi herufi ")"

kitenganishi herufi ","

Uteuzi wa ishara

herufi ya kitenganishi "="

Jedwali la 3 - Tafsiri ya leksemu kuwa misimbo

<цифра>

<буква>

Jedwali 4 - Orodha ya alama za sarufi

Uteuzi

Maelezo

Mpango

Maelezo ya mahesabu

Maelezo ya Vigezo

Orodha ya vigezo

Opereta

Mgawo

Kujieleza

Usemi mdogo

Uendeshaji wa binary

Operesheni za Unary

Orodha ya kazi

Kitambulisho

Mara kwa mara

Wacha tujenge kitambulisho cha kuamua kutoka chini kwenda juu.

Fikiria uhusiano ufuatao ili kuunda kitambuaji kinachoamua kutoka chini kwenda juu:

a) Iwapo kuna alama ya kundi B kiasi kwamba kanuni fulani ya sarufi inajumuisha mnyororo AB na kuna ishara xFIRST"(B), basi tutachukulia kwamba mahusiano x BAADA ya A yamebainishwa kati ya alama x na A.

b) Ikiwa katika sarufi fulani kuna kanuni B -> bAb A, BV a, b basi uhusiano A JALADA x huamuliwa kati ya A na x.

Sarufi yetu yote inabaki sawa, ambayo ni:

G: (Vt, Va, I, R),

na kanuni za sarufi G zimetolewa katika Jedwali la 5.

Jedwali la 5 - sheria za sarufi

Kanuni Na.

Upande wa kushoto wa sheria

Upande wa kulia wa kanuni

f ID = EX t EX d LE n;?

Muendelezo wa jedwali 5.

Kanuni Na.

Upande wa kushoto wa sheria

Upande wa kulia wa kanuni

Wapi? - alama kwa mwisho wa mnyororo.

Wacha tufafanue kesi kadhaa:

a) Kitambulisho kina herufi nyingi Alfabeti ya Kilatini, yaani tutachukulia kuwa u = ( a, b, c, d, e, f,g, h, i,j,k, l,m, n, o, p,q,r,s, t. , u, v, w, x, y, z)

b) CO mara kwa mara ina nambari, ambayo ni, tutafikiria kuwa k = (0,1,2,3,4,5,6,7,8,9)

Ili sarufi yetu iwe mkakati mseto wa utangulizi, masharti yafuatayo lazima yatimizwe:

a) Ukosefu wa sheria za kielektroniki

b) Je, kuna sheria chini yake, x BAADA ya A? A VERT x =?

c) A -> bYg

na ni muhimu kwamba KATIKA AFTER x? B VERT x =?

yaani, katika sarufi watatekelezwa KATIKA AFTER x au A AFTER x, ambapo x ni ishara ya kihusishi cha mnyororo b.

a) KWANZA"(PG)=(PG?)

KWANZA"(RG) = KWANZA(DE) = (RG, v,:, i,;)

KWANZA" (AL) = KWANZA (b LE e)= (AL, b, e)

KWANZA" (DE) = KWANZA (v LV: i;) = (DE, v,:, i,;)

KWANZA" (LV) = KWANZA (Kitambulisho, LV) = (LV, kitambulisho)

KWANZA" (OP) =(OP, ID, CO)

KWANZA" (EQ) = KWANZA(KITAMBULISHO = EX;) = (EQ, =,;)

KWANZA" (EX) = (EX, SB, -)

KWANZA" (BO) =(B0, +,*,-)

KWANZA" (SB) = KWANZA((EX)SB) ? KWANZA(OP) ? KWANZA(BO)=(SB, (,), OP, BO);

KWANZA" (LE) = KWANZA(EQ) = (LE, (,), =,;, f, t, d, n, w, r)

KWANZA" (UO) = (UO,-)

KWANZA" (ID)= KWANZA" (u) = (u)

KWANZA" (CO) = KWANZA" (k) = (k) KWANZA" (e) =( e)

KWANZA" (b) =( b)

KWANZA" (e) =( e)

KWANZA" (v) =( v)

KWANZA" (w) =( w)

KWANZA" (r) =( r)

KWANZA" (i) =( i)

KWANZA" (f) =( f)

KWANZA" (d) =(d)

KWANZA" (n) =( n)

KWANZA" (c) =( c)

KWANZA" (+) =( +)

KWANZA" (*) =( *)

KWANZA" (-) =( -)

KWANZA" (,) =(,)

KWANZA" (;) =(;)

KWANZA" (:) =(:)

KWANZA" (=) = ( =)

KWANZA" (() =( ()

KWANZA" ()) =())

KWANZA" (u) =(u)

KWANZA" (k) =(k)

b) TRACE `(AL) = (?)? TRACE"(PG)=(?,b,e)

INAYOFUATA ` (DE) = (?)? KWANZA"(AL)= (?, b, e)

INAYOFUATA ` (LV) = (?)?KWANZA"(:)= (?,:)

INAYOFUATA ` (OP) = (?)?KWANZA"(SB)= (?,;,), d, t, +, -, *)

FUATILIA ` (EQ) = (?)?KWANZA"(LE)=(?, (,),;, f, =, t, d, n,w,r )

FUATILIA ` (EX) = (?)?KWANZA"(t)?KWANZA"(d)?KWANZA"(;)?KWANZA"())=(?, t,d,;,))

INAYOFUATA ` (BO) = (?)? KWANZA"(SB)= (?, (,), OP, BO)

INAYOFUATA ` (UO) = (?)? KWANZA"(SB)= (?, (,), OP, BO)

TRACE ` (SB) = (?)? TAFUTA"(EX)= (?, t,d,;,), +, *, -)

FUATILIA ` (LE) = (?) ?KWANZA"(e) ?KWANZA"(n) = (?, e, n)

TAFUTA `(ID)= (?)? INAYOFUATA" (OP) ? KWANZA" (=) =(?,;,), d, t, +, -, *, =)

TAFUTA `(CO) = (?)? TRACE" (OP)= (?,;,), d, t, +, -, *, =)

INAYOFUATA ` (b) =(?)?KWANZA"(LE)= (?, u, =,;)

FUATILIA ` (e) =(?)? FUATILIA"(AL)= (?, b)

INAYOFUATA ` (v) =(?)?KWANZA"(LV)= (?, u)

INAYOFUATA ` (w) =(?)? KWANZA"(()= (?, ()

INAYOFUATA ` (r) =(?)?KWANZA"(() = (?, ()

INAYOFUATA ` (i) =(?)?KWANZA"(;)= (?,;)

INAYOFUATA ` (f) =(?)?KWANZA"(Kitambulisho) = (?, u)

INAYOFUATA ` (d) =(?)?KWANZA"(LE)= (?, u, =,;)

INAYOFUATA ` (n) =(?)? KWANZA"(i) = (?, i )

FUATILIA ` (+) =(?)? FUATA"(NDANI) = (?, +,*,-)

FUATILIA ` (-) =(?)? FUATA"(NDANI) = (?, +,*,-)

FUATILIA ` (*) =(?)? FUATA"(NDANI) = (?, +,*,-)

FUATILIA ` (;) =(?)?FUATILIA" (DE)?FUATILIA `(LE1)?TRACK" (EQ) = (?, b, e, l, u)

INAYOFUATA ` (:) =(?)? KWANZA"(i)= (?, i )

INAYOFUATA ` (=) = (?)? KWANZA"(EX) = (? (,), u, k, +, -, *)

INAYOFUATA ` (() =(?)?KWANZA"(DE)= (?, v,:, i,;)

TAFUTA ` ()) =(?)? KWANZA"(;) = (?,;)

TAFUTA ` (,) =(?)? KWANZA"(LV) = (?, u)

TAFUTA `(u) =(?)? KWANZA" (ID)= ( u, ?)

TAFUTA `(k) =(?)? KWANZA (CO)= (?, k)

c) PG ->DE AL

AL BAADA YA DE = (b,e) BAADA YA DE = ((b DE), (e DE) )

e BAADA YA LE = ((e LE))

LE AFTER b = ((,), =,;, f, t, d, n, w, r) BAADA ya b = ((b), ()b), (=b), (;b), ( f b), (t b), (d b), (n b), (w b), (r b))

;BAADA ya mimi = ((; i))

i BAADA YA: = ( (i:) )

: BAADA YA LV = ( (: LV) )

LV BAADA YA v = ( (Kitambulisho, v) )

LV BAADA, = ((Kitambulisho,))

BAADA YA ID = ((,u))

LE AFTER EQ = ((,), =,;, f, t, d, n, w, r ) BAADA YA EQ = (((EQ), () EQ), (= EQ), (; EQ), ( f EQ), (t EQ), (d EQ), (n EQ), (w EQ), (r EQ))

LE -> r (DE);

; BAADA) = ((;)))

) BAADA YA DE = (((DE))

DE AFTER (= (= ((v)), (:)), (i)), (;)), (e)))

(BAADA r = (((r)))

LE -> w (DE);

; BAADA) = ((;)))

) DE MWISHO = (((DE))

DE AFTER (= ((v)), (:)), (i)), (;)), (e)))

(BAADA ya w = (((w)))

LE -> f ID = EX t EX d LE n;

; BAADA ya n = ((;n))

n BAADA YA LE = ( (n, LE))

LE AFTER d = ( ((,), =,;, f, t, d, n, w, r)) ? BAADA ya d = (((d), ()d), (;d), (f d), (t d), (d d), (n d), (w d), (r d))

d BAADA YA EX = ((d, EX))

EX AFTER t = (BO, -) ? BAADA YA t = ((BO t), (- t))

t BAADA YA EX = ( t EX)

EX BAADA = = ((BO, -) ? BAADA = = ((BO =), (- =))

BAADA YA ID = ((= ID))

KITAMBULISHO BAADA YA f = ((ID f))

EQ -> ID = EX;

; BAADA YA EX = ((; EX )

EX BAADA = = (BO, -) ? BAADA = = ((BO =), (- =))

BAADA ya wewe = ((=u))

SB AFTER UO = ( (,), OP, BO ) AFTER UO = (((UO), (OP UO), (BO UO) )

) BAADA YA EX = ( () EX) )

EX BAADA YA (= (BO, -) ? BAADA YA (= ((BO (), (- ())

SB->SB BO SB

SB BAADA YA BO = ((,), OP, BO) BAADA YA BO = ((BO), ()BO), (OP BO), (BO BO))

BO BAADA YA SB = (+,*,-) BAADA YA SB = ((+SB), (*SB), (-SB))

KITAMBULISHO BAADA YA u = ((u, u))

G) PG ->DE AL

AL COLLECTION PG = AL COLLECTION TRACE" (PG) = ((AL?))

e KUKUSANYA AL = e UFUATILIAJI WA KUKUSANYA"(AL)= ((eb), (e?))

=; NJIA YA KUSANYA"(DE) = ((;b), (;?))

UKUSANYAJI WA LV LV = NJIA YA KUKUSANYA YA LV" (LV) = ((LV:), (LV?))

UKUSANYAJI WA KITAMBULISHO LV = NJIA YA KUKUSANYA KITAMBULISHO" (LV) = ((KITAMBULISHO:), (KITAMBULISHO ?))

; KUNJA LE =; NJIA YA KUKUSANYA" (LE) = ((; e), (;?), (; n))

LE -> f ID = EX t EX d LE n;

; KUNJA LE =; NJIA YA KUKUSANYA" (LE) = ((; e), (;?), (; n))

EQ COLLECTION LE = EQ COVER TRACE" (LE) = ((EQ e), (EQ?), (EQ n))

EQ -> ID = EX;

; KUNJA EQ =; NJIA YA KUSANYA" (EQ) = ((; (), (;)), (;;), (;f), (;?), (;=), (;t), (;d), (; n), (;w), (;r))

SB COLLECTION EX = SB COVER TRACE" (EX) = ((SB t), (SB?), (SB d), (SB)), (SB;), (SB(), (SB=), (SBf ), (SBn), (SBw), (SBr))

) KUKUSANYA SB = UFUATILIAJI WA KUKUSANYA WA SB" (SB) = (() t), ()?), () d), ())), ();))

OP COLLECTION SB = OP COLLECTION TRACE" (SB) = ((OP t), (OP?), (OP d), (OP)), (OP;))

SB->SB BO SB

SB KUKUSANYA SB = SB COVER TRACE" (SB) = ((SB, t), (SBd), (SB;). (SB)), (SB+), (SB-), (SB*), (SB? ) }

KUKUSANYA UO = - NJIA YA KUKUSANYA" (UO) = ( (-?), (--))

BO YA KUKUSANYA = + TRACK YA KUKUSANYA" (BO) = ((++), (+?), (+*), (+-))

* KUKUSANYA BO = * NJIA YA KUSANYA" (BO) = ((*), (*?), (**), (*-))

BO YA KUKUSANYA = - NJIA YA KUKUSANYA" (BO) = ((-+), (-?), (-*), (--))

KUKUSANYA KITAMBULISHO OP = UFUATILIAJI WA UFUATILIAJI WA KITAMBULISHO" (OP) = ((KITAMBULISHO+), (KITAMBULISHO?), (KITAMBULISHO*), (KITAMBULISHO-))

JALADA OP = UFUATILIAJI WA JALADA" (OP) = ((CO+), (CO?), (CO*), (CO-), (CO;), (COd), (COt), (CO)))

KITAMBULISHO CHA KUKUSANYA = NJIA YA KUKUSANYA KITAMBULISHO" (KITAMBULISHO) = ((KITAMBULISHO)), (KITAMBULISHO ?), (Kitambulisho k), (KITAMBULISHO+), (KITAMBULISHO-), (KITAMBULISHO*), (ID=), (IDt) , (ID)))

u KITAMBULISHO CHA KUKUSANYA = l NJIA YA KUKUSANYA" (KITAMBULISHO) = ((u)), (u?), (uk), (u+), (u-), (u*), (u=), (ut), (ud)))

COVER CO = TRACE COVER" (CO) = (CO+), (CO?), (CO*), (CO-), (CO;), (COd), (COt), (CO)))

k KUKUSANYA CO = k UFUATILIAJI WA KUKUSANYA" (CO) = (k+), (k?), (k*), (k-), (k;), (kd), (kt), (k)))

Hali moja ya migogoro iligunduliwa wakati sheria zinaporomoka

OP -> ID na ID -> u ID

Ingiza ID1 -> Kitambulisho, kwa hivyo tunaandika upya kanuni ID1 -> u ID

Kwa hiyo, tutafanya shughuli za convolution.

KITAMBULISHO CHA KUKUSANYA CHA ID1 = NJIA YA KUSANYA ID1" (ID) = ((ID1)), (ID1 ?), (ID1 k), (ID1+), (ID1-), (ID1*), (ID1=), (ID1t) , (ID1d)))

Kwa kila jozi (x, A)? x BAADA ya A tunaunda kitendakazi cha mpito ambacho huamua kitendo cha kuhamisha??(S 0 , x, A) = (S 0 , A)

? (S0, b, DE) = (S0, DEb)

? (S0, e, DE) = (S0, DEe)

? (S0, e, LE) = (S0, LEe)

? (S0,), b) = (S0, b))

? (S0,;, b) = (S0, b;)

? (S0, (, b) = (S0, b()

? (S0, =, b) = (S0, b=)

? (S0, f, b) = (S0, bf)

? (S0, t, b) = (S0, bt)

? (S0, d, b) = (S0, bd)

? (S0, n, b) = (S0, bn)

? (S0, w, b) = (S0, bw)

? (S0, r, b) = (S0, br)

? (S0,;, i) = (S0, i;)

? (S0, i,:) = (S0, i:)

? (S0,:LV) = (S0,LV:)

? (S0, ID, v) = (S0, vID)

? (S0,ID,) = (S0,ID)

? (S0, u) = (S0, u,)

? (S0, (, EQ)= (S0, EQ()

? (S0,), EQ)= (S0, EQ))

? (S0, =, EQ)= (S0, EQ=)

? (S0,;, EQ)= (S0, EQ;)

? (S0, f, EQ)= (S0, EQf)

? (S0, t, EQ)= (S0, EQt)

? (S0, d, EQ)= (S0, EQd)

? (S0, n, EQ)= (S0, EQn)

? (S0, w, EQ)= (S0, EQw)

? (S0, r, EQ)= (S0, EQr)

? (S0,;,)) = (S0,);)

? (S0, (, DE) = (S0, DE()

? (S0, v,)) = (S0,)v)

? (S0,;,)) = (S0,);)

? (S0, i,)) = (S0,)i)

? (S0,:,)) = (S0,):)

? (S0, e,)) = (S0,)e)

? (S0, (, r) = (S0, r()

? (S0, (, w) = (S0, w()

? (S0,;, n) = (S0, n;)

? (S0, n, LE) = (S0, LEn)

? (S0, (, d) = (S0, d()

? (S0,), d) = (S0, d))

? (S0,;, d) = (S0, d;)

? (S0, f, d) = (S0, df)

? (S0, t, d) = (S0, dt)

? (S0, d, d) = (S0, dd)

? (S0, n, d) = (S0, dn)

? (S0, w, d) = (S0, dw)

? (S0, r, d) = (S0, dr)

? (S0, d, EX) = (S0, EXd)

? (S0, BO, t) = (S0, tBO)

? (S0, -, t) = (S0, t-)

? (S0, t, EX) = (S0, EXt)

? (S0, BO, =) = (S0, =BO)

? (S0, -, =) = (S0, =-)

? (S0, =, ID) = (S0, ID=)

? (S0, ID, f) = (S0, fID)

? (S0,;, EX) = (S0, EX;)

? (S0, =, u) = (S0, u=)

? (S0, (, UO) = (S0, UO()

? (S0, OP, UO) = (S0, UO OP)

? (S0, BO, UO) = (S0, UO BO)

? (S0,), EX) = (S0, EX))

? (S0, BO, () = (S0, (BO)

? (S0, BO, -) = (S0, -BO)

? (S0, (, BO) = (S0, BO()

? (S0,),BO) = (S0,)BO)

? (S0, OP, BO) = (S0, BOOP)

? (S0, +, SB) = (S0, SB+)

? (S0, *, SB) = (S0, SB*)

? (S0, -, SB) = (S0, SB-)

? (S0, u, u) = (S0, uu)

Kwa kila jozi (x, A)? Na CONVERT x tunaunda kitendakazi cha mpito ambacho huamua kitendo cha ubadilishaji? * (S 0, x, bA) = (S 0, B), ambapo B->bA

? * (S 0 , AL, ?) = (S 0 , PG)

? * (S 0 , e, b) = (S 0 , AL)

? * (S 0 , n, ?) = (S 0 , AL)

? * (S 0 ,;, b) = (S 0, DE)

? * (S 0 ,;, ?) = (S 0 , DE)

? * (S 0 ,;, e) = (S 0, DE)

? * (S 0 , LV,:) = (S 0, LV)

? * (S 0 , LV, ?) = (S 0, LV)

? * (S 0 , ID, ?) = (S 0 , LV)

? * (S 0 , ID, e) = (S 0, LV)

? * (S 0 ,;, e) = (S 0 , LE)

? * (S 0 ,;, ?) = (S 0 , LE)

? * (S 0 ,;, n) = (S 0, LE)

? * (S 0 , EQ, n) = (S 0, LE)

? * (S 0 , EQ, e) = (S 0, LE)

? * (S 0 , EQ, ?) = (S 0 , LE)

? * (S 0 ,;, e) = (S 0 , LE)

? * (S 0 ,;, ?) = (S 0 , LE)

? * (S 0 ,;, () = (S 0, EQ)

? * (S 0 ,;,)) = (S 0, EQ)

? * (S 0 ,;, f) = (S 0, EQ)

? * (S 0 ,;, =) = (S 0, EQ)

? * (S 0 ,;, t) = (S 0, EQ)

? * (S 0 ,;, d) = (S 0, EQ)

? * (S 0 ,;, n) = (S 0, EQ)

? * (S 0 ,;, w) = (S 0, EQ)

? * (S 0 ,;, r) = (S 0, EQ)

? * (S 0 , SB, ?) = (S 0 , EX)

? * (S 0 , SB, d) = (S 0 , EX)

? * (S 0 , SB,)) = (S 0 , EX)

? * (S 0 , SB,;) = (S 0 , EX)

? * (S 0 , SB, w) = (S 0 , EX)

? * (S 0 , SB, r) = (S 0 , EX)

? * (S 0 , SB, f) = (S 0 , EX)

? * (S 0 , SB, =) = (S 0 , EX)

? * (S 0 , SB, t) = (S 0 , EX)

? * (S 0 , SB, ?) = (S 0 , SB)

? * (S 0 , SB, () = (S 0, SB)

? * (S 0 , SB,)) = (S 0 , SB)

? * (S 0 , SB, u) = (S 0, SB)

? * (S 0 , SB, k) = (S 0, SB)

? * (S 0 , SB, +) = (S 0 , SB)

? * (S 0 , SB, -) = (S 0 , SB)

? * (S 0 , SB, *) = (S 0 , SB)

? * (S 0 , SB, e) = (S 0, SB)

? * (S 0 ,), t) = (S 0, SB)

? * (S 0 ,), ?) = (S 0 , SB)

? * (S 0 ,), t) = (S 0, SB)

(S 0 ,),)) = (S 0, SB)

? * (S 0 ,),;) = (S 0, SB)

? * (S 0 , -, ?) = (S 0 , UO)

? * (S 0 , -, -) = (S 0 , UO)

? * (S 0 , +, +) = (S 0, BO)

? * (S 0 , +, ?) = (S 0, BO)

? * (S 0 , +, *) = (S 0, BO)

? * (S 0 , -, +) = (S 0, BO)

? * (S 0 , -, ?) = (S 0 , BO)

? * (S 0 , -, *) = (S 0, BO)

? * (S 0 , -, -)) = (S 0 , BO)

? * (S 0 , *, +) = (S 0, BO)

? * (S 0 , *, ?) = (S 0 , BO)

? * (S 0 , *, *) = (S 0, BO)

? * (S 0 , *, -)) = (S 0 , BO)

? * (S 0 , u, +) = (S 0, BO)

? * (S 0 , u, ?)= (S 0 , BO)

? * (S 0 , u, *) = (S 0, BO)

? * (S 0 , u, -)) = (S 0 , BO)

? * (S 0 , k, +) = (S 0, BO)

? * (S 0 , k, ?) = (S 0 , BO)

? * (S 0 , k, *) = (S 0, BO)

? * (S 0 , k, -)) = (S 0 , BO)

? * (S 0 , CO, ?) = (S 0, OP)

? * (S 0 , CO, +) = (S 0, OP)

? * (S 0 , CO, *) = (S 0, OP)

? * (S 0 , CO, -) = (S 0 , OP)

? * (S 0 , CO,;) = (S 0, OP)

? * (S 0 , CO, d) = (S 0, OP)

? * (S 0 , CO, t) = (S 0, OP)

? * (S 0 , ID, -) = (S 0 , OP)

? * (S 0 , ID, *) = (S 0 , OP)

? * (S 0 , ID, ?) = (S 0 , OP)

? * (S 0 , ID, () = (S 0 , OP)

? * (S 0 , ID,)) = (S 0 , OP)

? * (S 0 , ID, u) = (S 0 , OP)

? * (S 0 , ID, k) = (S 0 , OP)

? * (S 0 , ID, -) = (S 0 , OP)

? * (S 0 , ID, +) = (S 0 , OP)

? * (S 0 , u,)) = (S 0, I OP)

? * (S 0 , ID1, *) = (S 0 , ID)

? * (S 0 , ID1, ?) = (S 0 , ID)

? * (S 0 , ID1, () = (S 0 , ID)

? * (S 0 , ID1,)) = (S 0 , ID)

? * (S 0 , ID1, u) = (S 0 , ID)

? * (S 0 , ID1, k) = (S 0 , ID)

? * (S 0 , ID1, -) = (S 0 , ID)

? * (S 0 , ID1, +) = (S 0 , ID)

? * (S 0 , u,)) = (S 0 , ID)

? * (S 0 , u, ?) = (S 0 , BO)

? * (S 0 , u, k) = (S 0 , ID)

? * (S 0 , u, *)) = (S 0 , ID)

? * (S 0 , u, -)) = (S 0 , ID)

? * (S 0 , u, +)) = (S 0 , ID)

? * (S 0 , u, d)) = (S 0 , ID)

? * (S 0 , u, t)) = (S 0 , ID)

? * (S 0 , u, =)) = (S 0 , ID)

? * (S 0 , CO, ?) = (S 0 , CO)

? * (S 0 , CO, +) = (S 0 , CO)

? * (S 0 , CO, -) = (S 0 , CO)

? * (S 0 , CO, *) = (S 0, CO)

? * (S 0, CO,;) = (S 0, CO)

? * (S 0 , CO, d) = (S 0, CO)

? * (S 0 , CO, t) = (S 0 , CO)

? * (S 0 , CO,)) = (S 0 , CO)

? * (S 0 , k, +) = (S 0, CO)

? * (S 0 , k, -) = (S 0 , CO)

? * (S 0 , k, *) = (S 0 , CO)

? * (S 0 , k,;) = (S 0, CO)

?? * (S 0 , k, d) = (S 0 , CO)

? * (S 0 , k, t) = (S 0 , CO)

? * (S 0 , k,)) = (S 0 , CO)

? * (S 0 , k, () = (S 0 , CO)

2.2.3 Utekelezaji wa programu ya kichanganuzi

Kichanganuzi cha kisintaksia (kichanganuzi) husoma faili ya leksemu inayozalishwa na kichanganuzi cha kileksika, hufanya uchanganuzi wa kisarufi, huonyesha ujumbe kuhusu makosa ya kisintaksia ikiwa yapo, na kuunda aina ya kati ya kurekodi programu chanzo. Msingi wa ukuzaji wa kichanganuzi ni muundo na utekelezaji wa mashine inayolingana ya jarida.

Kwa uchanganuzi wa chini-juu kwa kichanganuzi kinachoamua kutoka chini-juu baada ya kuipunguza aina sahihi Inahitajika kutumia vipengele vya BAADA na ROLL ili kuunda mashine ya duka yenye maelezo ya kina ya mabadiliko yote ndani ya chaguo la kukokotoa la mpito.

Wakati wa kutengeneza mashine ya kuuza, tulijenga kazi za mpito ambazo zitakuwa msingi wa kichanganuzi. Kazi zote za mpito zinaweza kugawanywa katika aina mbili:

Mzunguko wa uendeshaji wa mashine ya gazeti bila kusoma alama ya pembejeo (mzunguko tupu);

Mbinu ya uendeshaji wa mashine ya gazeti kwa kusoma ishara ya ingizo.

Wakati wa kutekeleza uchanganuzi wa kileksika, tuligawa programu katika leksemu na kuziandika katika orodha. Kisha tunachakata orodha hii kwenye kichanganuzi. Tunatuma programu yetu (orodha), ishara ya awali (PG) na alama ya chini ya mashine ya gazeti (h0) kwa pembejeo, baada ya hapo tunachagua. kazi inayohitajika mpito na simu ya kujirudia inafanywa.

Mchoro wa programu ya uchanganuzi umeonyeshwa katika Kiambatisho B katika Mchoro B.2.

2.2.4 Maendeleo ya moduli ya tafsiri

Wakati wa kuunda moduli ya tafsiri kama aina ya kati ya programu asili Njia ya postfix ya nukuu hutumiwa mara nyingi, ambayo inafanya kuwa rahisi sana kutekeleza mchakato wa kutekeleza (kutafsiri) programu iliyotafsiriwa.

Wacha tuzingatie kanuni za msingi za kuunda na kutekeleza fomu ya maandishi ya maandishi.

Sheria za msingi za kubadilisha usemi wa infix kuwa postfix ni kama ifuatavyo.

Operesheni zilizosomwa huongezwa kwa nukuu ya urekebishaji wa posta na shughuli zimeandikwa kwenye rafu.

Ikiwa operesheni iliyo juu ya stack ina kipaumbele cha juu (au sawa) kuliko uendeshaji uliosomwa sasa, basi operesheni kwenye stack huongezwa kwenye ingizo la postfix, na operesheni ya sasa inasukumwa kwenye stack. Vinginevyo (kwa kipaumbele cha chini), operesheni ya sasa tu inasukumwa kwenye stack.

Mabano ya ufunguzi yaliyosomwa yanasukumwa kwenye rafu.

Baada ya kusoma kwa brace ya kufunga, shughuli zote hadi ufunguzi wa kwanza wa ufunguzi hupigwa kutoka kwenye stack na kuongezwa kwenye uingizaji wa postfix, baada ya hapo vifungo vyote vya kufungua na kufunga vinatupwa, i.e. hazijawekwa kwenye rekodi ya postfix au kwenye stack.

Baada ya usemi mzima kusomwa, shughuli zilizobaki kwenye mrundikano huongezwa kwenye ingizo la postfix.

Nukuu ya postfix ya usemi inaruhusu kuhesabiwa kama ifuatavyo.

Ikiwa ishara ni operand, imeandikwa kwa stack. Ikiwa ishara ni operesheni, basi operesheni maalum inafanywa kwenye vipengele vya mwisho (kipengele cha mwisho) kilichoandikwa kwa stack, na vipengele hivyo (kipengele) vinabadilishwa kwenye stack na matokeo ya operesheni.

Ikiwa uchanganuzi wa kileksia na kisintaksia umekamilika kwa mafanikio, basi tunaendelea na tafsiri. Kwanza, tunatengeneza sentensi kutoka kwa maneno, kisha tunatafsiri misemo kuwa nukuu ya postfix na kuhesabu.

Mchoro wa operesheni ya mkalimani umeonyeshwa katika Kiambatisho B katika Kielelezo B.3.

2.3 Kuweka msimbo

Mpango huu unatekelezwa katika lugha ya C# katika mazingira ya programu ya Visual Studio 2010. Maandishi ya programu yamewasilishwa katika Kiambatisho A.

Programu ina madarasa matano. Kiolesura cha mtumiaji kinatekelezwa kwa kutumia darasa la MainForn. Kwa kutumia darasa la LexAnalysis, moduli ya uchanganuzi wa kileksia inatekelezwa, SynAnalysis ni moduli ya uchanganuzi wa kisintaksia, Mfasiri ni moduli ya tafsiri, ProgramisciJakPolska ni darasa kisaidizi la kutafsiri semi kwa nukuu ya Kipolandi kinyume (postfix).

Madhumuni ya taratibu na kazi zinazotekelezwa katika programu zimeelezwa katika meza 6,7,8.

Jedwali 6 - Madhumuni ya taratibu na kazi za uchanganuzi wa kileksika

Nyaraka zinazofanana

    Mtafsiri kama programu au njia za kiufundi zinazotafsiri programu. Kuzingatia sifa kuu za ujenzi wa analyzer ya lexical. Utangulizi wa hatua za kukuza mtafsiri kutoka sehemu ndogo ya lugha ya kiwango cha juu.

    kazi ya kozi, imeongezwa 08/06/2013

    Ubunifu wa kimsamiati na uchanganuzi lugha ya kielimu. Sheria za kubadilisha misemo yenye mantiki kuwa POLYZ. Uundaji wa triads, uboreshaji wa orodha yao. Muundo wa mantiki wa programu. Kujaribu moduli za mfasiri-mkalimani.

    kazi ya kozi, imeongezwa 05/28/2013

    Tabia za jumla na tathmini ya uwezo wa lugha ya programu ya C-Sharp, vipengele vyake sawa na tofauti kutoka kwa C ++ na Java. Ukuzaji wa uchanganuzi wa kileksika na kisintaksia kwa kutumia lugha hii ya utayarishaji. Kukusanya meza za uchanganuzi.

    kazi ya kozi, imeongezwa 06/11/2010

    Kubuni programu ya uchanganuzi inayojumuisha sehemu mbili: kichanganuzi cha kileksika ambacho hugawanya matini chanzo cha programu katika leksemu na kujaza jedwali la majina; kichanganuzi kinachokagua maandishi kwa kufuata sarufi fulani.

    kazi ya kozi, imeongezwa 06/14/2010

    Kuandika programu ambayo hufanya uchanganuzi wa kileksika na kisintaksia wa lugha ya programu ya ingizo, hutoa jedwali la leksemu zinazoonyesha aina na maadili yao, na pia huunda mti wa sintaksia; maandishi ya lugha ya pembejeo huingizwa kutoka kwa kibodi.

    kazi ya kozi, imeongezwa 02/23/2012

    Mbinu ya ukuzaji na utekelezaji wa sehemu ya mfasiri wa lugha ya C kwa kutumia lugha ya C++, ambayo hugawanya msururu wa wahusika katika miundo midogo isiyoweza kugawanywa kulingana na msamiati wa lugha. Uchambuzi wa uendeshaji wa programu.

    kazi ya kozi, imeongezwa 03/19/2012

    Muundo, uainishaji na mahitaji ya utekelezaji wa mkusanyaji. Ubunifu na utekelezaji wa sehemu ya kuchanganua ya mkusanyaji wa lugha ya C++. Mbinu za kutekeleza uchanganuzi wa kileksika. Algorithm ya uendeshaji wa kichanganuzi. Kanuni za utekelezaji wa programu.

    kazi ya kozi, imeongezwa 01/26/2013

    Uundaji wa mtafsiri ambaye huchakata msimbo wa programu katika Pascal na, kwa kutumia waendeshaji sawa, hutengeneza programu katika C. Makala ya vipimo vya nje na uendeshaji wa analyzer lexical. Muundo wa programu, kuonyesha matokeo kwenye skrini.

    kazi ya kozi, imeongezwa 07/02/2011

    Mbinu za uchanganuzi wa kisarufi. Ukuzaji wa muundo wa mfasiri wa elimu katika lugha ya msingi ya programu Kitu Pascal katika mazingira ya programu ya kuona yenye mwelekeo wa kitu Borland DELPHI 6.0 kwa kutumia mfumo wa uendeshaji wa Windows XP.

    kazi ya kozi, imeongezwa 05/12/2013

    Utekelezaji wa programu programu ya desktop kutumia lugha ya programu ya C #. Ubunifu na muundo wa kiolesura cha mtumiaji, mahitaji yake na tathmini ya utendaji. Maendeleo ya mwongozo wa mtumiaji na matumizi yake.

Kila kompyuta ina lugha yake ya programu - lugha ya amri au lugha ya mashine - na inaweza kutekeleza programu zilizoandikwa katika lugha hii pekee. Kimsingi, algorithm yoyote inaweza kuelezewa kwa kutumia lugha ya mashine, lakini gharama za programu zitakuwa za juu sana. Hii ni kwa sababu ya ukweli kwamba lugha ya mashine hukuruhusu kuelezea na kusindika tu miundo ya data ya zamani - bits, byte, maneno. Kupanga katika misimbo ya mashine kunahitaji maelezo mengi ya programu na inapatikana tu kwa waandaaji wa programu ambao wana ufahamu mzuri wa muundo na utendaji wa kompyuta. Lugha za kiwango cha juu (Fortran, PL/1, Pascal, C, Ada, nk) zilizo na miundo ya data iliyotengenezwa na njia za usindikaji ambazo hazitegemei lugha ya kompyuta fulani zilifanya iwezekane kushinda ugumu huu.

Lugha za algorithmic za kiwango cha juu huwezesha programu kuelezea kwa urahisi na kwa urahisi algoriti za kutatua shida nyingi zinazotumika. Maelezo haya yanaitwa programu asili, na lugha ya kiwango cha juu ni lugha ya kuingiza.

Kichakataji cha lugha ni programu ya lugha ya mashine inayoruhusu kompyuta kuelewa na kutekeleza programu katika lugha ya ingizo. Kuna aina mbili kuu za wasindikaji lugha: wakalimani na wafasiri.

Mkalimani ni programu inayokubali programu katika lugha ya ingizo kama ingizo na, jinsi lugha ya ingizo inavyotambulika, huitekeleza, na kutoa matokeo ya hesabu zilizowekwa na programu ya chanzo.

Mfasiri ni programu inayokubali programu asili kama ingizo na kutoa programu katika matokeo yake ambayo kiutendaji ni sawa na ya asili, inayoitwa. kitu. Mpango wa kitu umeandikwa kwa lugha ya kitu. Katika hali fulani, lugha ya mashine inaweza kutumika kama lugha ya kitu, na katika kesi hii, programu iliyopatikana kwa matokeo ya mtafsiri inaweza kutekelezwa mara moja kwenye kompyuta (iliyofasiriwa). Katika kesi hii, kompyuta ni mkalimani wa programu ya kitu katika msimbo wa mashine. Kwa ujumla, lugha ya kitu sio lazima iwe mashine au kitu karibu nayo (autocode). Lugha fulani ya kitu inaweza kutumika kama lugha ya kati- lugha iliyo kati ya ingizo na lugha za mashine.

Ikiwa lugha ya kati inatumiwa kama lugha ya kitu, basi chaguzi mbili za kuunda mtafsiri zinawezekana.

Chaguo la kwanza ni kwamba kwa lugha ya kati kuna (au inaendelezwa) mfasiri mwingine kutoka lugha ya kati hadi lugha ya mashine, na inatumika kama sehemu ya mwisho ya mfasiri iliyoundwa.

Chaguo la pili la kujenga mfasiri kwa kutumia lugha ya kati ni kujenga mkalimani kwa amri za lugha za kati na kuitumia kama sehemu ya mwisho ya mfasiri. Faida ya wakalimani inaonyeshwa katika utatuzi na watafsiri shirikishi, ambao huhakikisha kuwa mtumiaji anaweza kufanya kazi katika hali ya mwingiliano, hadi kufanya mabadiliko kwenye programu bila kutafsiri tena kabisa.

Wakalimani pia hutumiwa katika uigaji wa programu - utekelezaji kwenye mashine ya kiteknolojia ya programu zilizokusanywa kwa mashine nyingine (kitu). Chaguo hili, hasa, hutumiwa wakati wa kurekebisha kwa madhumuni ya jumla programu za kompyuta ambazo zitatekelezwa kwenye kompyuta maalumu.

Mtafsiri anayetumia lugha iliyo karibu na lugha ya mashine (msimbo otomatiki au kiunganishi) kama lugha ya ingizo huitwa kitamaduni. mkusanyaji. Mfasiri wa lugha ya hali ya juu anaitwa mkusanyaji.

Katika kujenga compiler kwa miaka iliyopita Maendeleo makubwa yamepatikana. Wakusanyaji wa kwanza walitumia kinachojulikana njia za matangazo ya moja kwa moja- Hizi ni mbinu za kiheuristic ambazo, kulingana na wazo la jumla, kwa kila ujenzi wa lugha, algoriti yake ya kutafsiri katika mashine inayolingana iliundwa. Njia hizi zilikuwa za polepole na zisizo na muundo.

Mbinu ya kubuni kwa watunzi wa kisasa inategemea njia ya utunzi inayoendeshwa kisintaksia usindikaji wa lugha. Ya utunzi kwa maana ya kwamba mchakato wa kubadilisha programu chanzo kuwa mpango wa kifaa unatekelezwa na uundaji wa uundaji huru unaofanya kazi na miundo ya data ya pembejeo na matokeo iliyotambulishwa kwa uwazi. Uchoraji huu wa ramani hutengenezwa kutokana na kuzingatia programu chanzo kama muundo wa vipengele vikuu (viwango) vya maelezo ya lugha ya ingizo: msamiati, sintaksia, semantiki na pragmatiki, na kubainisha vipengele hivi kutoka kwa programu chanzo wakati wa utungaji wake. Wacha tuzingatie mambo haya ili kupata mfano rahisi wa mkusanyaji.

Msingi wa lugha yoyote ya asili au ya bandia ni alfabeti- seti ya herufi za kimsingi zinazoruhusiwa katika lugha (herufi, nambari na wahusika wa huduma). Ishara zinaweza kuunganishwa maneno- miundo ya kimsingi ya lugha, inayozingatiwa katika maandishi (mpango) kama alama zisizoweza kugawanywa ambazo zina maana fulani.


Neno pia linaweza kuwa mhusika mmoja. Kwa mfano, katika lugha ya Pascal, maneno ni vitambulishi, maneno muhimu, vidhibiti, na viambatanisho, hasa viendeshaji hesabu na kimantiki, mabano, koma na alama nyinginezo. Msamiati wa lugha, pamoja na maelezo ya njia zinazowakilishwa, huunda Msamiati lugha.

Maneno katika lugha hujumuishwa katika miundo changamano zaidi - sentensi. Katika lugha za programu, sentensi rahisi zaidi ni opereta. Sentensi hujengwa kutokana na maneno na sentensi rahisi zaidi kulingana na kanuni za sintaksia. Sintaksia Lugha ni maelezo ya sentensi sahihi. Maelezo ya maana ya sentensi, i.e. maana za maneno na viunganishi vyake vya ndani, ni semantiki lugha. Kwa kuongezea, tunaona kuwa programu maalum ina athari fulani kwa mtafsiri - pragmatism. Ikichukuliwa pamoja, sintaksia, semantiki na pragmatism ya umbo la lugha semiotiki lugha.

Kutafsiri programu kutoka lugha moja hadi nyingine, kwa ujumla, inajumuisha kubadilisha alfabeti, msamiati na syntax ya lugha ya programu wakati wa kudumisha semantiki yake. Mchakato wa kutafsiri programu ya chanzo katika mpango wa kitu kawaida hugawanywa katika subprocesses kadhaa huru (awamu za tafsiri), ambazo zinatekelezwa na vitalu vya mtafsiri vinavyofanana. Inafaa kuzingatia uchanganuzi wa kileksika, uchanganuzi wa kisintaksia, uchanganuzi wa kisemantiki na

usanisi wa programu ya kitu. Walakini, katika wakusanyaji wengi wa kweli awamu hizi zimegawanywa katika sehemu ndogo kadhaa, na kunaweza pia kuwa na awamu zingine (kwa mfano, uboreshaji wa nambari ya kitu). Katika Mtini. 1.1 inaonyesha kilichorahisishwa mfano wa kazi mfasiri.

Kulingana na mtindo huu, programu ya uingizaji kimsingi inategemea usindikaji wa kileksia. Madhumuni ya uchanganuzi wa lexical ni kutafsiri programu ya chanzo katika lugha ya ndani ya mkusanyaji, ambapo maneno, vitambulisho, lebo na vipengele vya kudumu hupunguzwa kwa muundo mmoja na kubadilishwa na kanuni za masharti: nambari au ishara, ambazo huitwa descriptors. Kila kielezi kina sehemu mbili: darasa (aina) ya ishara na pointer kwa anwani ya kumbukumbu ambapo habari kuhusu ishara maalum huhifadhiwa. Kawaida habari hii imepangwa katika meza. Sambamba na tafsiri ya programu chanzo katika lugha ya ndani, katika hatua ya uchanganuzi wa kileksika, udhibiti wa kileksika- kutambua maneno yasiyokubalika katika programu.

Kichanganuzi huchukua matokeo ya kichanganuzi cha kileksika na kutafsiri mlolongo wa picha za ishara katika mfumo wa programu ya kati. Mpango wa kati kimsingi ni uwakilishi wa mti wa sintaksia wa programu. Mwisho unaonyesha muundo wa programu ya awali, i.e. utaratibu na uhusiano kati ya waendeshaji wake. Wakati wa ujenzi wa mti wa syntax udhibiti wa kisintaksia - kutambua makosa ya sintaksia katika programu.

Matokeo halisi ya kichanganuzi inaweza kuwa mlolongo wa amri zinazohitajika ili kuunda programu ya kati, majedwali ya saraka ya ufikiaji, na kutoa ujumbe wa uchunguzi inapohitajika.

Mchele. 1.1. Muundo wa utendaji uliorahisishwa wa mfasiri

Mchanganyiko wa programu ya kitu huanza, kama sheria, na usambazaji na ugawaji wa kumbukumbu kwa vitu kuu vya programu. Kila sentensi katika programu chanzi huchunguzwa na sentensi zinazolingana kisemantiki katika lugha ya kifaa hutolewa. Taarifa ya pembejeo hapa ni mti wa syntax wa programu na meza za pato za analyzer ya lexical - meza ya vitambulisho, meza ya mara kwa mara, na wengine. Mchanganuo wa miti inaruhusu sisi kutambua mlolongo wa amri zinazozalishwa za mpango wa kitu, na kwa kutumia jedwali la vitambulisho, tunaamua aina za amri ambazo ni halali kwa maadili ya uendeshaji katika amri zinazozalishwa (kwa mfano, ambayo inaamuru). haja ya kuzalishwa: hatua ya kudumu au ya kuelea, nk).

Kizazi halisi cha programu ya kitu mara nyingi hutanguliwa na uchambuzi wa kisemantiki, ambayo inahusisha aina mbalimbali za usindikaji wa semantic. Aina moja ni kuangalia mikusanyiko ya kisemantiki katika programu. Mifano ya makusanyiko hayo: maelezo ya kipekee ya kila kitambulisho katika programu, ufafanuzi wa kutofautiana hufanywa kabla ya kutumika, nk. Uchambuzi wa kisemantiki unaweza kufanywa katika awamu za baadaye za tafsiri, kwa mfano, katika awamu ya uboreshaji wa programu, ambayo inaweza pia kujumuishwa katika mtafsiri. Lengo la uboreshaji ni kupunguza muda au rasilimali kumbukumbu ya ufikiaji bila mpangilio inahitajika kutekeleza programu ya kitu.

Haya ndiyo mambo makuu ya mchakato wa tafsiri kutoka kwa lugha za kiwango cha juu. Mpangilio wa awamu mbalimbali za tafsiri na mbinu za vitendo zinazohusiana kwa maelezo yao ya hisabati zimejadiliwa hapa chini.

Malengo na malengo ya taaluma. Dhana za kimsingi na ufafanuzi. Sifa za Jumla lugha za programu na watafsiri. Muundo wa jumla wa mtafsiri. Chaguo za mwingiliano wa vizuizi vya watafsiri.

Malengo na malengo ya taaluma

Hivi sasa, lugha za bandia zinazotumia uwakilishi wa maandishi kuelezea eneo la somo hutumiwa sana sio tu katika upangaji, lakini pia katika maeneo mengine. Kwa msaada wao, muundo wa kila aina ya nyaraka, tatu-dimensional ulimwengu wa kweli, violesura vya picha mtumiaji na vitu vingine vingi vinavyotumiwa katika mifano na katika ulimwengu wa kweli. Ili maelezo haya ya maandishi yameundwa kwa usahihi, na kisha kutambuliwa kwa usahihi na kufasiriwa, mbinu maalum za uchambuzi na mabadiliko yao hutumiwa. Njia hizo zinatokana na nadharia ya lugha na sarufi rasmi, na pia nadharia ya automata. Mifumo ya programu, iliyoundwa kuchambua na kufasiri matini, huitwa wafasiri.

Licha ya ukweli kwamba maelfu ya lugha tofauti na watafsiri wao wameendelezwa hadi sasa, mchakato wa kuunda programu mpya katika eneo hili hauacha. Hii ni kwa sababu ya maendeleo ya teknolojia ya uzalishaji wa mifumo ya kompyuta na hitaji la kutatua shida zinazoendelea kutumika. Kwa kuongezea, vipengele vya nadharia ya lugha na sarufi rasmi vinatumika katika maeneo mengine tofauti, kwa mfano, wakati wa kuelezea muundo wa data, faili, picha, ambazo hazijawasilishwa kwa maandishi, lakini katika muundo wa binary. Njia hizi pia ni muhimu wakati wa kuunda watafsiri wako mwenyewe, hata pale ambapo analogi zinazolingana tayari zipo. Maendeleo hayo yanaweza kuwa kutokana na sababu mbalimbali, hasa, mapungufu ya kazi, ukosefu wa ujanibishaji, na ufanisi mdogo. Kwa mfano, moja ya maendeleo ya hivi karibuni Microsoft ni lugha ya programu ya C #, na moja ya sababu za kuundwa kwake ni tamaa ya kupunguza umaarufu wa lugha ya programu ya Java. Kuna mifano mingine mingi ambapo kukuza mtafsiri wako mwenyewe kunaweza kuwa muhimu. Kwa hivyo, misingi ya nadharia ya lugha na sarufi rasmi, na vile vile mbinu za vitendo Ukuzaji wa wafasiri uko kwenye msingi wa elimu ya uhandisi katika sayansi ya kompyuta na sayansi ya kompyuta.

Nyenzo iliyopendekezwa inagusa misingi ya njia za kukuza watafsiri na ina habari muhimu kusoma mantiki ya utendakazi wao, vifaa vya hesabu vilivyotumika (nadharia). lugha rasmi na sarufi rasmi, lugha za metali). Inatumika kama sehemu ya kozi za mihadhara ya muhula mrefu zinazotolewa kwa taaluma mbali mbali katika Kitivo cha Informatics na Sayansi ya Kompyuta cha Chuo Kikuu cha Ufundi cha Jimbo la Krasnoyarsk. Wakati wa kazi ya maabara, ujuzi wa moja kwa moja na mbinu za mtu binafsi za kuunda watafsiri hufanyika.

Kusudi la taaluma: kutoa maarifa juu ya misingi ya nadharia ya lugha na sarufi rasmi, nadharia ya automata, njia za kukuza watafsiri.

Ili kufikia lengo hili, kazi zifuatazo zinatatuliwa wakati wa kufundisha nidhamu:

  1. Kozi ya mihadhara inachunguza kanuni za jumla za kuandaa mchakato wa tafsiri na muundo wa wafasiri. Misingi ya nadharia ya kuwajenga wafasiri inasomwa.
  2. Wakati wa madarasa ya maabara na wakati kazi ya kujitegemea ujumuishaji wa vitendo wa maarifa yaliyopatikana ya kinadharia hufanywa: mtafsiri wa lugha rahisi ya programu anaandaliwa.

Dhana za kimsingi na ufafanuzi

Ufafanuzi mwingi unaozingatiwa umekopwa kutoka [ARNFTS Kamusi ya ufafanuzi ya Kiingereza-Kirusi-Kijerumani-Kifaransa juu ya teknolojia ya kompyuta na usindikaji wa data, maneno 4132. Chini ya. mh. A.A. Dorodnitsyna. M.: 1978. 416 p.) ].

Mfasiri - programu ya huduma, ambayo hubadilisha programu chanzo iliyotolewa katika lugha ya programu ya kuingiza katika programu ya kufanya kazi iliyotolewa katika lugha ya kifaa.

Ufafanuzi ulio hapo juu unatumika kwa aina zote za programu za utangazaji. Hata hivyo, kila moja ya programu hizi inaweza kuwa na sifa zake katika kuandaa mchakato wa utangazaji. Hivi sasa, watafsiri wamegawanywa katika vikundi vitatu kuu: wakusanyaji, wakusanyaji na wakalimani.

Mkusanyaji - programu ya matumizi ya mfumo ambayo inabadilisha miundo ya ishara kuwa maagizo ya lugha ya mashine. Kipengele maalum cha wakusanyaji ni kwamba hufanya tafsiri ya neno moja ya maagizo ya mfano katika maagizo ya mashine moja. Kwa hivyo, lugha ya mkutano (pia inaitwa autocode) imeundwa ili kuwezesha mtazamo wa mfumo wa amri ya kompyuta na kuharakisha programu katika mfumo huu wa amri. Ni rahisi zaidi kwa mpanga programu kukumbuka uteuzi wa mnemonic wa maagizo ya mashine kuliko msimbo wao wa binary. Kwa hiyo, faida kuu haipatikani kwa kuongeza nguvu za amri za mtu binafsi, lakini kwa kuongeza ufanisi wa mtazamo wao.

Wakati huo huo, lugha ya kusanyiko, pamoja na analogues ya amri za mashine, ina maagizo mengi ya ziada ambayo yanawezesha, hasa, kusimamia rasilimali za kompyuta, kuandika vipande vya kurudia, na kujenga programu za moduli nyingi. Kwa hiyo, uwazi wa lugha ni tajiri zaidi kuliko lugha ya ishara ya coding, ambayo inaboresha sana ufanisi wa programu.

Mkusanyaji - ni programu ya huduma inayotafsiri programu iliyoandikwa katika lugha chanzo cha programu hadi lugha ya mashine. Kama tu mkusanyaji, mkusanyaji hubadilisha programu kutoka lugha moja hadi nyingine (mara nyingi, hadi lugha ya kompyuta mahususi). Wakati huo huo, amri za lugha chanzi hutofautiana sana katika shirika na nguvu kutoka kwa amri za lugha ya mashine. Kuna lugha ambazo amri moja ya lugha ya asili hutafsiriwa kwa amri za mashine 7-10. Walakini, pia kuna lugha ambazo kila amri inaweza kuwa na amri 100 au zaidi za mashine (kwa mfano, Prolog). Kwa kuongezea, lugha chanzo mara nyingi hutumia uchapaji madhubuti wa data, unaofanywa kupitia maelezo yao ya awali. Kupanga kunaweza kutegemea si kusimba algoriti, lakini kufikiria kwa makini kuhusu miundo au madarasa ya data. Mchakato wa kutafsiri kutoka kwa lugha kama hizo kawaida huitwa mkusanyiko, na lugha asilia kawaida huainishwa kama lugha za kiwango cha juu cha programu (au lugha za kiwango cha juu). Kuondolewa kwa lugha ya programu kutoka kwa mfumo wa amri ya kompyuta ilisababisha kuundwa kwa kujitegemea kwa aina mbalimbali za lugha zinazozingatia kutatua matatizo maalum. Lugha zimeonekana kwa mahesabu ya kisayansi, mahesabu ya kiuchumi, ufikiaji wa hifadhidata, na zingine.

Mkalimani - programu au kifaa kinachotekeleza tafsiri ya opereta-kwa-opereta na utekelezaji wa programu asili. Tofauti na mkusanyaji, mkalimani hatoi programu ya lugha ya mashine kama pato. Baada ya kutambua amri katika lugha ya chanzo, huitekeleza mara moja. Wakusanyaji na wakalimani hutumia mbinu sawa za uchanganuzi maandishi ya chanzo programu. Lakini mkalimani hukuruhusu kuanza usindikaji wa data baada ya kuandika hata amri moja. Hii inafanya mchakato wa kuunda na kurekebisha programu kubadilika zaidi. Kwa kuongezea, kutokuwepo kwa msimbo wa mashine ya pato hufanya iwezekane "kutokusanya" vifaa vya nje na faili za ziada, na mkalimani yenyewe inaweza kubadilishwa kwa urahisi kwa usanifu wowote wa mashine, baada ya kuitengeneza mara moja tu katika lugha ya programu inayotumiwa sana. Kwa hivyo, lugha zilizofasiriwa kama vile Hati ya Java, Hati ya VB, imeenea sana. Hasara ya wakalimani ni kasi ya chini ya utekelezaji wa programu. Kwa kawaida, programu zilizotafsiriwa huendesha polepole mara 50 hadi 100 kuliko programu za asili.

Kiigaji - programu au zana ya maunzi ambayo hutoa uwezo, bila kupanga upya, kutekeleza kwenye kompyuta fulani programu inayotumia misimbo au mbinu za kufanya shughuli tofauti na kompyuta husika.. Emulator ni sawa na mkalimani kwa kuwa inatekeleza moja kwa moja programu iliyoandikwa katika lugha fulani. Walakini, mara nyingi ni lugha ya mashine au nambari ya kati. Zote mbili zinawakilisha maagizo katika msimbo wa binary ambayo yanaweza kutekelezwa mara tu baada ya msimbo wa uendeshaji kutambuliwa. Tofauti na programu za maandishi, hakuna haja ya kutambua muundo wa programu au kuchagua uendeshaji.

Emulators hutumiwa mara nyingi kwa madhumuni anuwai. Kwa mfano, wakati wa kuunda mifumo mpya ya kompyuta, emulator huundwa kwanza ambayo inaendesha programu zilizotengenezwa kwa kompyuta ambazo bado hazipo. Hii inakuwezesha kutathmini mfumo wa amri na kuendeleza msingi programu hata kabla ya vifaa vinavyofanana kuundwa.

Mara nyingi, emulator hutumiwa kuendesha programu za zamani kwenye mpya. kompyuta. Kwa kawaida, kompyuta mpya zaidi zina kasi na zina ubora bora vifaa vya pembeni. Hii hukuruhusu kuiga programu za zamani kwa ufanisi zaidi kuliko kuziendesha kwenye kompyuta za zamani. Mfano wa mbinu hii ni maendeleo ya emulators kwa kompyuta ya nyumbani ya ZX Spectrum na microprocessor ya Z80. Bado kuna watu ambao wanapenda kucheza michezo kwenye emulator ambayo imepitwa na wakati, lakini bado hawajapoteza rufaa yao ya zamani, programu za mchezo. Emulator pia inaweza kutumika kama analog ya bei nafuu ya kisasa mifumo ya kompyuta, huku ikitoa utendaji unaokubalika sawa na mifano ya hali ya chini ya familia fulani ya usanifu. Mfano ni emulators za IBM PC kompyuta zinazoendana, kutekelezwa kwenye kompyuta za Apple zenye nguvu zaidi. Idadi ya emulators zilizoandikwa kwa ajili ya IBM PC kwa mafanikio kuchukua nafasi ya consoles mbalimbali za mchezo.

Emulator ya uwakilishi wa kati, pamoja na mkalimani, inaweza kuhamishwa kwa urahisi kutoka kwa usanifu wa kompyuta hadi nyingine, kuruhusu kuundwa kwa programu ya simu. Ni mali hii ambayo ilitanguliza mafanikio ya lugha ya programu ya Java, ambayo programu inatafsiriwa kuwa nambari ya kati. Inatekeleza nambari hii java ya kawaida mashine si kitu zaidi ya emulator inayoendesha mfumo wowote wa uendeshaji wa kisasa.

Transcoder - programu au kifaa cha programu, kutafsiri programu zilizoandikwa katika lugha ya mashine ya kompyuta moja katika programu katika lugha ya mashine ya kompyuta nyingine. Ikiwa emulator ni analog isiyo na akili ya mkalimani, basi transcoder hufanya kwa uwezo sawa kuhusiana na mkusanyaji. Vile vile, msimbo wa mashine ya chanzo (na kawaida ya binary) au uwakilishi wa kati hubadilishwa kuwa msimbo mwingine sawa na maagizo moja na bila uchanganuzi wowote wa jumla wa muundo wa programu chanzo. Transcoders ni muhimu wakati wa kuhamisha programu kutoka kwa usanifu wa kompyuta hadi nyingine. Zinaweza pia kutumiwa kuunda upya maandishi ya programu ya kiwango cha juu kutoka kwa msimbo wa binary uliopo.

Macroprocessor - programu ambayo inachukua nafasi ya mlolongo mmoja wa wahusika na mwingine[Brown]. Hii ni aina ya mkusanyaji. Inazalisha maandishi ya pato kwa kuchakata viingilio maalum vilivyo katika maandishi chanzo. Viingilio hivi vimeundwa kwa njia maalum na ni vya miundo ya lugha inayoitwa lugha kubwa. Macroprocessors mara nyingi hutumiwa kama nyongeza kwa lugha za programu, na kuongeza utendaji wa mifumo ya programu. Karibu mkusanyiko wowote una macroprocessor, ambayo huongeza ufanisi wa kuendeleza programu za mashine. Mifumo kama hiyo ya programu kawaida huitwa macroassemblers.

Macroprocessors pia hutumiwa na lugha za kiwango cha juu. Wanaongeza utendakazi wa lugha kama vile PL/1, C, C++. Wasindikaji wa Macro hutumiwa sana katika C na C ++, na kuifanya iwe rahisi kuandika programu. Mfano wa matumizi makubwa ya wasindikaji macroprocessors ni maktaba ya darasa la Microsoft Foundation Classes (MFC). Kupitia kuingiza macro, hutumia kadi za ujumbe na zingine vitu vya programu. Wakati huo huo, macroprocessors huongeza ufanisi wa programu bila kubadilisha syntax na semantics ya lugha.

Sintaksia - seti ya kanuni za lugha fulani zinazoamua uundaji wa vipengele vyake. Kwa maneno mengine, hii seti ya kanuni za uundaji wa mfuatano muhimu wa kisemantiki wa wahusika katika lugha fulani. Sintaksia hubainishwa kwa kutumia kanuni zinazoelezea dhana za lugha. Mifano ya dhana ni: kutofautiana, kujieleza, opereta, utaratibu. Mlolongo wa dhana na matumizi yao yanayokubalika katika sheria huamua miundo sahihi ya kisintaksia inayounda programu. Ni safu ya vitu, na sio jinsi wanavyoingiliana, ambayo hufafanuliwa kupitia syntax. Kwa mfano, taarifa inaweza tu kutokea kwa utaratibu, kujieleza katika taarifa, kutofautiana kunaweza kuwa na jina na fahirisi za hiari, nk. Sintaksia haihusiani na matukio kama hayo katika programu kama vile "kuruka kwenye lebo ambayo haipo" au "kigeu kilicho na jina lililotolewa hakijafafanuliwa." Hivi ndivyo semantiki hufanya.

Semantiki - kanuni na masharti ambayo huamua uhusiano kati ya vipengele vya lugha na maana zao za kisemantiki, pamoja na tafsiri ya maana ya maana ya miundo ya kisintaksia ya lugha.. Vitu vya lugha ya programu haziwekwa tu katika maandishi kwa mujibu wa uongozi fulani, lakini pia huunganishwa kwa ziada kupitia dhana nyingine zinazounda vyama mbalimbali. Kwa mfano, kigezo, ambacho syntax inafafanua eneo halali tu katika matamko na baadhi ya taarifa, ina aina maalum, inaweza kutumika kwa idadi ndogo ya shughuli, ina anwani, ukubwa, na lazima itangazwe kabla haijaweza. kutumika katika programu.

Kichanganuzi cha kisintaksia - kijenzi cha mkusanyaji ambacho hukagua taarifa za chanzo kwa utiifu wa kanuni za kisintaksia na semantiki za lugha fulani ya programu.. Licha ya jina lake, analyzer huangalia syntax na semantiki. Inajumuisha vitalu kadhaa, ambayo kila mmoja hutatua matatizo yake mwenyewe. Itajadiliwa kwa undani zaidi wakati wa kuelezea muundo wa mfasiri.

Vipengele vya jumla vya lugha za programu na watafsiri

Lugha za programu ni tofauti kabisa kutoka kwa kila mmoja kwa kusudi, muundo, ugumu wa semantic, na njia za utekelezaji. Hii inaweka vipengele vyake maalum juu ya maendeleo ya watafsiri maalum.

Lugha za programu ni zana za kutatua shida katika maeneo tofauti ya somo, ambayo huamua maalum ya shirika lao na tofauti za kusudi. Mifano ni pamoja na lugha kama vile Fortran, ambayo inaelekezwa kwa mahesabu ya kisayansi, C, ambayo imekusudiwa kwa programu ya mifumo, Prolog, ambayo inaelezea kwa ufanisi shida za uelekezaji, na Lisp, ambayo hutumiwa kwa usindikaji wa orodha ya kujirudia. Mifano hii inaweza kuendelea. Kila eneo la somo huweka mahitaji yake juu ya shirika la lugha yenyewe. Kwa hiyo, tunaweza kutambua aina mbalimbali za uwakilishi wa waendeshaji na maneno, tofauti katika seti ya shughuli za msingi, na kupungua kwa ufanisi wa programu wakati wa kutatua matatizo yasiyohusiana na eneo la somo. Tofauti za kiisimu pia hujitokeza katika muundo wa wafasiri. Lisp na Prolog mara nyingi hutekelezwa katika hali ya ukalimani kutokana na ukweli kwamba hutumia uzalishaji wa aina za data wakati wa kukokotoa. Watafsiri wa Fortran wana sifa ya uboreshaji mkali wa msimbo wa mashine unaosababishwa, ambao unawezekana kwa sababu ya semantiki rahisi ya muundo wa lugha - haswa, kwa sababu ya kukosekana kwa njia za kutaja mbadala wa vigeu kupitia viashiria au marejeleo. Uwepo wa viashiria katika lugha C huweka mahitaji maalum ya ugawaji wa kumbukumbu ya nguvu.

Muundo wa lugha unaashiria uhusiano wa kidaraja kati ya dhana zake, ambazo zinaelezewa na kanuni za kisintaksia. Lugha za programu zinaweza kutofautiana sana kutoka kwa kila mmoja katika shirika la dhana za mtu binafsi na uhusiano kati yao. Lugha ya programu ya PL/1 inaruhusu uwekaji kiota kiholela wa taratibu na utendakazi, ilhali katika C vipengele vyote lazima ziwe katika kiwango cha nje cha kuota. Lugha ya C++ inaruhusu vigeu kutangazwa wakati wowote katika programu kabla ya matumizi yake ya kwanza, wakati katika vigeu vya Pascal lazima vifafanuliwe katika eneo maalum la tamko. Kuchukua hii hata zaidi ni PL/1, ambayo inaruhusu kutofautisha kutangazwa baada ya kutumika. Au unaweza kuacha maelezo kabisa na kutumia sheria chaguo-msingi. Kulingana na uamuzi uliofanywa, mtafsiri anaweza kuchambua programu kwa njia moja au kadhaa, ambayo inathiri kasi ya tafsiri.

Semantiki za lugha za programu hutofautiana sana. Wanatofautiana sio tu katika vipengele vya utekelezaji wa shughuli za mtu binafsi, lakini pia katika dhana za programu, ambazo huamua tofauti za msingi katika mbinu za maendeleo ya programu. Maelezo mahususi ya utekelezaji wa shughuli yanaweza kuhusisha muundo wa data inayochakatwa na sheria za kuchakata aina sawa za data. Lugha kama vile PL/1 na APL inasaidia matrix na uendeshaji wa vekta. Lugha nyingi hufanya kazi hasa na scalars, kutoa taratibu na kazi zilizoandikwa na watengeneza programu kwa ajili ya usindikaji wa safu. Lakini hata wakati wa kufanya operesheni ya kuongeza nambari mbili, lugha kama C na Pascal zinaweza kuishi tofauti.

Pamoja na upangaji wa kitaratibu wa kitamaduni, unaoitwa pia lazima, kuna dhana kama vile upangaji kazi, upangaji wa mantiki na upangaji unaolenga kitu. Natumai kwamba dhana ya upangaji wa kiutaratibu-parametric niliyopendekeza itachukua nafasi yake katika mfululizo huu [Legalov2000]. Muundo wa dhana na vitu vya lugha hutegemea sana dhana iliyochaguliwa, ambayo pia huathiri utekelezaji wa mtafsiri.

Hata lugha moja inaweza kutekelezwa kwa njia kadhaa. Hii ni kutokana na ukweli kwamba nadharia ya sarufi rasmi inaruhusu mbinu mbalimbali za kuchanganua sentensi zilezile. Kwa mujibu wa hili, watafsiri wanaweza kupata matokeo sawa (mpango wa kitu) kutoka kwa maandishi asilia kwa njia tofauti.

Wakati huo huo, lugha zote za programu zina idadi ya sifa na vigezo vya kawaida. Hali hii ya kawaida pia huamua kanuni za kupanga wafasiri ambazo zinafanana kwa lugha zote.

  1. Lugha za programu zimeundwa ili kurahisisha programu. Kwa hivyo, waendeshaji wao na miundo ya data ina nguvu zaidi kuliko ile ya lugha za mashine.
  2. Ili kuongeza mwonekano wa programu, badala ya nambari za nambari, uwakilishi wa kielelezo au picha wa muundo wa lugha hutumiwa, ambayo ni rahisi zaidi kwa mtazamo wa mwanadamu.
  3. Kwa lugha yoyote inafafanuliwa:
  • Alama nyingi ambazo zinaweza kutumika kuandika programu sahihi (alfabeti), vipengele vya msingi.
  • Programu nyingi sahihi (syntax).
  • "Maana" ya kila mpango sahihi (semantiki).

Bila kujali maalum ya lugha, mtafsiri yeyote anaweza kuchukuliwa kuwa kigeuzi kazi F, kutoa ramani ya kipekee kutoka X hadi Y, ambapo X ni programu katika lugha ya chanzo, Y ni programu katika lugha ya pato. Kwa hivyo, mchakato wa tafsiri yenyewe unaweza kuwasilishwa rasmi kwa urahisi na kwa uwazi:

Hapo awali, kila mpango sahihi X ni msururu wa alama kutoka kwa baadhi ya alfabeti A, iliyobadilishwa kuwa mnyororo wake Y, unaojumuisha alama za alfabeti B.

Lugha ya programu, kama mfumo wowote changamano, inafafanuliwa kupitia safu ya dhana ambayo inafafanua uhusiano kati ya vipengele vyake. Dhana hizi zimeunganishwa kwa mujibu wa kanuni za kisintaksia. Kila programu iliyojengwa kulingana na sheria hizi ina muundo wa kihierarkia unaolingana.

Katika suala hili, sifa zifuatazo za kawaida zinaweza kutofautishwa zaidi kwa lugha zote na programu zao: kila lugha lazima iwe na sheria zinazoruhusu kutengeneza programu zinazolingana na lugha hii au kutambua mawasiliano kati ya programu zilizoandikwa na lugha fulani.

Uhusiano kati ya muundo wa programu na lugha ya programu inaitwa ramani ya kisintaksia.

Kama mfano, fikiria uhusiano kati ya muundo wa daraja na safu ya alama zinazofafanua usemi ufuatao wa hesabu:

Katika lugha nyingi za programu, usemi huu unafafanua safu ya vitu vya programu, ambavyo vinaweza kuonyeshwa kama mti (Mchoro 1.1.):

Miduara inawakilisha alama zinazotumika kama miundo msingi, na mistatili inawakilisha dhana zenye mchanganyiko ambazo zina muundo wa daraja na uwezekano wa kujirudia. Uongozi huu unafafanuliwa kwa kutumia kanuni za kisintaksia zilizoandikwa kwa lugha maalum inayoitwa metalanguage (metalanguage zitajadiliwa kwa undani zaidi wakati wa kusoma sarufi rasmi):

<выражение> ::= <слагаемое> | <выражение> + <слагаемое>

<слагаемое> ::= <множитель> | <слагаемое> * <множитель>

<множитель> ::= <буква> | (<выражение>)

<буква>

Kumbuka. Alama "::=" inasomwa kama "hii ni". Bomba "|" inasomeka kama "au".

Ikiwa sheria zimeandikwa tofauti, basi muundo wa kihierarkia. Kwa mfano, tunaweza kutoa sheria zifuatazo za uandishi:

<выражение> ::= <операнд> | <выражение> + < операнд > | <выражение> * < операнд >

<операнд> ::= <буква> | (<выражение>)

<буква>::=a | b | c | d | mimi | f | g | h | mimi | j | k | l | m | n | o | p | q | r | s | t | wewe | v | w | x | y | z

Kama matokeo ya kuchanganua sawa usemi wa hesabu muundo wa kihierarkia utajengwa, umeonyeshwa kwenye Mtini. 1.2.


Ikumbukwe kwamba muundo wa hierarkia katika kesi ya jumla hauwezi kuhusishwa na semantiki ya usemi. Katika hali zote mbili, kipaumbele cha shughuli kinaweza kutekelezwa kwa mujibu wa sheria zinazokubaliwa kwa ujumla, wakati kuzidisha kunatangulia kuongezwa (au kinyume chake, shughuli zote zinaweza kuwa na kipaumbele sawa chini ya seti yoyote ya sheria). Hata hivyo, muundo wa kwanza unaunga mkono kwa uwazi utekelezaji zaidi wa kipaumbele kinachokubalika kwa ujumla, wakati wa pili unafaa zaidi kwa kutekeleza shughuli kwa kipaumbele sawa na kuzitekeleza kutoka kulia kwenda kushoto.

Mchakato wa kutafuta muundo wa kisintaksia wa programu fulani unaitwa kuchanganua.

Muundo wa kisintaksia ambao ni sahihi katika lugha moja unaweza kuwa si sahihi katika lugha nyingine. Kwa mfano, katika lugha ya Forth usemi uliotolewa hautatambuliwa. Walakini, kwa lugha hii usemi sahihi wa postfix ni:

Muundo wake wa kisintaksia unaelezewa na sheria:

<выражение> ::= <буква> | <операнд> <операнд> <операция>

< операнд > ::= < буква > | < выражение >

< операция > ::= + | *

<буква>::=a | b | c | d | mimi | f | g | h | mimi | j | k | l | m | n | o | p | q | r | s | t | wewe | v | w | x | y | z

Mti wa kihierarkia unaofafanua muundo wa kisintaksia umewasilishwa kwenye Mtini. 1.3.

Kipengele kingine cha tabia ya lugha zote ni semantiki zao. Huamua maana ya utendakazi wa lugha na usahihi wa oparesheni. Minyororo ambayo ina muundo sawa wa kisintaksia katika lugha tofauti za programu inaweza kutofautiana katika semantiki (ambayo, kwa mfano, inazingatiwa katika C ++, Pascal, Msingi kwa kipande cha juu cha usemi wa hesabu).

Ujuzi wa semantiki za lugha hukuruhusu kuitenganisha na sintaksia yake na kuitumia kwa ubadilishaji hadi lugha nyingine (kutoa msimbo).

Ufafanuzi wa semantiki na utambuzi wa usahihi wake ni kawaida sehemu inayohitaji nguvu kazi nyingi na yenye nguvu zaidi ya mfasiri, kwani ni muhimu kuhesabu na kuchambua chaguzi nyingi kwa mchanganyiko halali wa shughuli na uendeshaji.

Muundo wa mtafsiri wa jumla

Sifa na muundo wa kawaida ni asili katika lugha tofauti za programu na watafsiri kutoka lugha hizi. Wanapitia michakato sawa ya kubadilisha maandishi chanzo. Licha ya ukweli kwamba mwingiliano wa taratibu hizi unaweza kupangwa kwa njia tofauti, inawezekana kutambua kazi ambazo utekelezaji wake husababisha matokeo sawa. Wacha tuite kazi kama hizi awamu za mchakato wa tafsiri.

Kwa kuzingatia kufanana kati ya mkusanyaji na mkalimani, hebu tuangalie awamu zilizopo kwenye mkusanyaji. Inaangazia:

  1. Awamu ya uchanganuzi wa kimsamiati.
  2. Awamu ya uchanganuzi inayojumuisha:
  • utambuzi wa muundo wa kisintaksia;
  • uchambuzi wa kisemantiki, wakati ambapo kazi na majedwali inafanywa, kutoa uwakilishi wa kati wa kisemantiki au mfano wa kitu lugha.
  • Awamu ya utengenezaji wa kanuni, ambayo:
    • uchambuzi wa kisemantiki wa vipengele vya uwakilishi wa kati au kielelezo cha kitu cha lugha;
    • kutafsiri kiwakilishi cha kati au kielelezo cha kitu katika msimbo wa kitu.

    Pamoja na awamu kuu za mchakato wa tafsiri, awamu za ziada pia zinawezekana:

      2a. Awamu ya uchunguzi wa uwakilishi wa kati na uboreshaji, inayojumuisha:
    2a.1. kuchambua usahihi wa uwakilishi wa kati;
    2a.2. uboreshaji wa uwakilishi wa kati.
      3a. Awamu ya uboreshaji wa msimbo wa kitu.

    Mkalimani hutofautiana kwa kuwa awamu ya kuunda msimbo kawaida hubadilishwa na awamu ya kuiga vipengele vya uwakilishi wa kati au modeli ya kitu cha lugha. Kwa kuongezea, mfasiri kwa kawaida hatoi uwakilishi wa kati, lakini huiga mara moja.

    Kwa kuongeza, inawezekana kutofautisha mchakato wa uchambuzi na urekebishaji wa makosa yaliyopo katika maandishi ya chanzo yaliyochakatwa ya programu ambayo ni sare kwa awamu zote.

    Muundo wa jumla wa mkusanyaji, kwa kuzingatia awamu zilizopo ndani yake, umewasilishwa kwenye Mtini. 1.4.

    Inajumuisha uchanganuzi wa kileksika, kichanganuzi, jenereta ya msimbo, na uchanganuzi wa makosa. Badala ya jenereta ya kificho, mkalimani hutumia emulator (Mchoro 1.5), ambayo, pamoja na vipengele vya uwakilishi wa kati, data ya chanzo huhamishwa. Pato la emulator ni matokeo ya mahesabu.

    Kichanganuzi cha kileksika (pia hujulikana kama kichanganuzi) husoma mfuatano wa vibambo na kuziweka katika miundo msingi inayoitwa leksemu. Kila ishara ina darasa na maana. Kwa kawaida, watahiniwa wa dhima ya leksemu ni viunzi vya lugha ya msingi, kwa mfano, kitambulisho, nambari halisi, maoni. Ishara zinazosababishwa hupitishwa kwa mchanganuzi. Scanner sio sehemu ya lazima ya mfasiri. Hata hivyo, inakuwezesha kuongeza ufanisi wa mchakato wa tafsiri. Uchambuzi wa kileksika unajadiliwa kwa undani zaidi katika mada: "Shirika la uchanganuzi wa kileksika."

    Kichanganuzi huchanganua programu chanzo kwa kutumia leksemu zinazoingia, huunda muundo wa kisintaksia wa programu na uchanganuzi wa kisemantiki kwa kuunda kielelezo cha kitu cha lugha. Kielelezo cha kitu kinawakilisha muundo wa kisintaksia, unaokamilishwa na uhusiano wa kisemantiki kati ya dhana zilizopo. Viunganisho hivi vinaweza kuwa:

    • marejeleo ya vigezo, aina za data na majina ya utaratibu yaliyowekwa kwenye jedwali la majina;
    • viunganisho vinavyoamua mlolongo wa utekelezaji wa amri;
    • miunganisho ambayo huamua uwekaji wa vipengee vya modeli ya kitu cha lugha na zingine.

    Kwa hivyo, kichanganuzi ni kizuizi cha mtafsiri changamano. Kwa hivyo, inaweza kugawanywa katika sehemu zifuatazo:

    • kitambua;
    • kizuizi cha uchambuzi wa semantic;
    • kielelezo cha kitu, au uwakilishi wa kati, unaojumuisha jedwali la majina na muundo wa kisintaksia.

    Muundo wa jumla wa kichanganuzi unaonyeshwa kwenye Mtini. 1.6.

    Mtambuaji hupokea mlolongo wa leksemu na, kwa kuzingatia hilo, hufanya uchanganuzi kwa mujibu wa sheria zinazotumiwa. Ishara, juu ya uchanganuzi mzuri wa sheria, huhamishiwa kwa mchanganuzi wa semantic, ambao huunda jedwali la majina na rekodi za vipande vya muundo wa kisintaksia. Kwa kuongezea, miunganisho ya ziada ya kisemantiki imerekodiwa kati ya jedwali la majina na muundo wa kisintaksia. Matokeo yake, mfano wa kitu cha programu huundwa, huru kutoka kwa kuunganisha kwa syntax ya lugha ya programu. Mara nyingi, badala ya muundo wa kisintaksia ambao unakili kabisa safu ya vitu vya lugha, analog yake iliyorahisishwa huundwa, ambayo inaitwa uwakilishi wa kati.

    Mchanganuzi wa makosa hupokea habari kuhusu makosa yanayotokea katika vizuizi mbalimbali vya watafsiri. Kwa kutumia taarifa iliyopokelewa, inazalisha ujumbe kwa mtumiaji. Mbali na hilo, block hii inaweza kujaribu kurekebisha hitilafu ili kuendelea na uchambuzi zaidi. Pia anajibika kwa vitendo vinavyohusiana na ukamilishaji sahihi wa programu katika tukio ambalo haiwezekani kuendelea na utangazaji.

    Jenereta ya msimbo huunda msimbo wa mashine ya kitu kulingana na uchanganuzi wa muundo wa kitu au uwakilishi wa kati. Ujenzi wa msimbo unaambatana na uchambuzi wa ziada wa semantic kuhusiana na haja ya kubadilisha amri za jumla katika kanuni za kompyuta maalum. Katika hatua ya uchambuzi huo, uwezekano wa mabadiliko hatimaye umeamua, na chaguzi za ufanisi huchaguliwa. Uzalishaji wa kanuni yenyewe ni kuweka upya amri moja hadi nyingine.

    Chaguo za mwingiliano wa vizuizi vya watafsiri

    Shirika la michakato ya tafsiri, ambayo huamua utekelezaji wa awamu kuu, inaweza kufanyika kwa njia mbalimbali. Hii imedhamiriwa na chaguzi mbalimbali za mwingiliano wa vizuizi vya mtafsiri: kichanganuzi cha lexical, kichanganuzi na jenereta ya msimbo. Licha ya matokeo sawa ya mwisho, chaguzi mbalimbali mwingiliano wa vizuizi vya watafsiri hutoa chaguzi mbalimbali za kuhifadhi data ya kati. Kuna chaguzi kuu mbili za mwingiliano wa vizuizi vya watafsiri:

    • shirika la kupita nyingi, ambalo kila awamu ni mchakato wa kujitegemea ambao huhamisha udhibiti kwa awamu inayofuata tu baada ya usindikaji kamili wa data zake;
    • shirika la kupitisha moja, ambapo awamu zote zinawakilisha mchakato mmoja na kusambaza data kwa kila mmoja katika vipande vidogo.

    Kulingana na chaguzi kuu mbili, unaweza pia kuunda mchanganyiko mbalimbali wao.

    Shirika la pasi nyingi la mwingiliano kati ya vizuizi vya watafsiri

    Toleo hili la mwingiliano wa vitalu, kwa kutumia mkusanyaji kama mfano, linawasilishwa kwenye Mchoro 1.7.


    Kichanganuzi cha kileksika huchakata kikamilifu matini chanzi, na kutengeneza msururu wa pato unaojumuisha leksemu zote zilizopokewa. Tu baada ya hii ni kudhibiti kuhamishiwa kwa kichanganuzi. Kichanganuzi hupokea msururu unaozalishwa wa leksemu na, kwa kuzingatia hilo, huunda uwakilishi wa kati au kielelezo cha kitu. Baada ya kupokea mfano mzima wa kitu, hupitisha udhibiti kwa jenereta ya msimbo. Jenereta ya msimbo, kulingana na mfano wa kitu cha lugha, huunda msimbo wa mashine unaohitajika

    Faida za njia hii ni pamoja na:

    1. Kutengwa kwa awamu za mtu binafsi, ambayo inaruhusu utekelezaji wao wa kujitegemea na matumizi.
    2. Uwezo wa kuhifadhi data iliyopatikana kama matokeo ya uendeshaji wa kila awamu kwenye vifaa vya uhifadhi wa nje na kuzitumia kama inahitajika.
    3. Uwezo wa kupunguza kiasi cha RAM kinachohitajika kuendesha kitafsiri kwa kupiga simu kwa awamu mfululizo.

    Hasara ni pamoja na:

    1. Uwepo wa idadi kubwa ya habari ya kati, ambayo wakati huu Sehemu ndogo tu ya wakati inahitajika.
    2. Kupungua kwa kasi ya utangazaji kwa sababu ya utekelezaji mfuatano wa awamu na matumizi ya vifaa vya hifadhi ya nje ili kuokoa RAM.

    Njia hii inaweza kuwa rahisi wakati wa kuunda watafsiri kutoka kwa lugha za programu na muundo changamano wa kisintaksia na kisemantiki (kwa mfano, PL/I). Katika hali kama hizi, tafsiri ni ngumu kutimiza kwa kupita moja, kwa hivyo ni rahisi kuwakilisha matokeo ya kupita zilizopita kama data ya ziada ya kati. Ikumbukwe kwamba miundo changamano ya kisemantiki na kisintaksia ya lugha inaweza kusababisha vipashio vya ziada vinavyohitajika ili kuweka vitegemezi vinavyohitajika. Jumla ya idadi ya pasi inaweza kuwa zaidi ya kumi. Idadi ya pasi pia inaweza kuathiriwa na matumizi ya programu ya vipengele maalum vya lugha, kama vile kutangaza vigezo na taratibu baada ya kutumika, kutumia sheria za tamko chaguo-msingi, na kadhalika.

    Shirika la pasi moja la mwingiliano kati ya vizuizi vya watafsiri

    Moja ya chaguzi za mwingiliano wa vizuizi vya mkusanyaji na shirika la kupitisha moja imewasilishwa kwenye Mtini. 1.8.

    Katika kesi hii, mchakato wa kutafsiri unaendelea kama ifuatavyo. Kichanganuzi cha kileksika husoma kipande cha matini chanzi kinachohitajika ili kupata leksemu moja. Baada ya ishara kuundwa, huita kichanganuzi na kuipitisha ishara iliyoundwa kama parameta. Ikiwa mchanganuzi anaweza kuunda kipengele kinachofuata cha uwakilishi wa kati, basi hufanya hivyo na kupitisha kipande kilichojengwa kwa jenereta ya kanuni. Vinginevyo, kichanganuzi kinarejesha udhibiti kwa kichanganuzi, na hivyo kuweka wazi kuwa ishara inayofuata imechakatwa na data mpya inahitajika.

    Jenereta ya msimbo hufanya kazi kwa njia sawa. Kulingana na kipande kilichopokelewa cha uwakilishi wa kati, huunda kipande kinachofanana cha msimbo wa kitu. Baada ya hayo, udhibiti unarudi kwa kichanganuzi.

    Baada ya kukamilisha maandishi ya chanzo na kukamilika kwa usindikaji wa data zote za kati kwa kila moja ya vitalu, analyzer ya lexical huanzisha mchakato wa kusitisha programu.

    Mara nyingi, watafsiri wa moja-pass hutumia mpango tofauti wa udhibiti, ambao mpangaji ana jukumu la kizuizi kikuu (Mchoro 1.9).

    Kichanganuzi cha kileksika na jenereta ya msimbo hufanya kama njia ndogo ambazo inaita. Mara tu kichanganuzi kinahitaji ishara nyingine, huita kichanganuzi. Wakati wa kupokea kipande cha uwakilishi wa kati, simu inapigwa kwa jenereta ya msimbo. Kukamilika kwa mchakato wa tafsiri hutokea baada ya ishara ya mwisho kupokelewa na kuchakatwa na kuanzishwa na mchanganuzi.

    Faida za mpango wa kupita moja ni pamoja na kutokuwepo kwa idadi kubwa ya data ya kati, kasi kubwa usindikaji kutokana na mchanganyiko wa awamu katika mchakato mmoja na kutokuwepo kwa upatikanaji wa vifaa vya hifadhi ya nje.

    Ubaya ni pamoja na: kutowezekana kwa utekelezaji wa mpango kama huo wa kutafsiri kwa lugha zilizo na muundo tata na ukosefu wa data ya kati ambayo inaweza kutumika kwa uchanganuzi mgumu na utoshelezaji.

    Mpango huu mara nyingi hutumiwa kwa lugha za programu ambazo ni rahisi katika miundo ya semantic na kisintaksia, katika watunzi na wakalimani. Mfano wa lugha kama hizi ni Msingi na Pascal. Mkalimani wa kawaida hujengwa kwa kutumia mpango wa kupita moja, kwani utekelezaji wa moja kwa moja unafanywa kwa kiwango cha vipande vya mtu binafsi vya uwakilishi wa kati. Shirika la mwingiliano kati ya vizuizi vya mkalimani kama huyo linaonyeshwa kwenye Mtini. 1.10.

    Miingiliano iliyojumuishwa ya vizuizi vya watafsiri

    Michanganyiko ya miradi ya tafsiri ya kupita nyingi na pasi moja hutoa chaguzi mbalimbali za pamoja, ambazo nyingi hutumiwa kwa mafanikio. Kwa mfano, tunaweza kufikiria baadhi yao.

    Katika Mtini. Mchoro 1.11 unaonyesha mchoro wa mwingiliano wa vizuizi vya watafsiri, ukigawanya mchakato mzima katika kupita mbili. Pasi ya kwanza hutoa uwakilishi kamili wa kati wa programu, na ya pili hutoa msimbo. Kutumia mpango kama huo hukuruhusu kuhamisha kwa urahisi mtafsiri kutoka kwa mfumo mmoja wa kompyuta hadi mwingine kwa kuandika tena jenereta ya nambari.

    Kwa kuongeza, badala ya jenereta ya kificho, ni rahisi kuunganisha emulator ya uwakilishi wa kati, ambayo inakuwezesha kwa urahisi kuendeleza mfumo wa programu katika lugha fulani, inayoelekezwa kwa mazingira mbalimbali ya utekelezaji. Mfano wa shirika kama hilo la mwingiliano kati ya vizuizi vya watafsiri huonyeshwa kwenye Mtini. 1.12.


    Pamoja na mipango inayohusisha kubadilisha jenereta ya msimbo na emulator, kuna watafsiri wanaoruhusu matumizi yao ya pamoja. Moja ya mipango kama hii imeonyeshwa kwenye Mtini. 1.13.

    Mchakato wa kutafsiri, pamoja na utengenezaji wa msimbo, unaweza kukamilishwa kwa idadi yoyote ya kupita (mfano unatumia tafsiri ya pasi moja iliyowasilishwa hapo awali). Hata hivyo, msimbo wa kitu kilichozalishwa haujatekelezwa kwenye mfumo wa kompyuta unaofanana, lakini unaigwa kwenye kompyuta yenye usanifu tofauti. Mpango huu hutumiwa katika mazingira yaliyojengwa karibu na lugha Upangaji wa Java. Mtafsiri mwenyewe hutoa msimbo wa mashine ya Java, ambayo inaigwa kwa njia maalum kwa kujitegemea na katika mazingira ya kivinjari cha Mtandao.

    Mpango uliowasilishwa unaweza pia kuwa na tafsiri pana zaidi kuhusiana na mkusanyaji yeyote anayezalisha msimbo wa mashine. Jambo ni kwamba kompyuta nyingi za kisasa zinatekelezwa kwa kutumia udhibiti wa microprogram. Kifaa cha kudhibiti programu ndogo kinaweza kuzingatiwa kama programu inayoiga msimbo wa mashine. Hii inaruhusu sisi kuzungumza juu ya kuenea kwa matumizi ya mpango wa hivi karibuni uliowasilishwa.

    Maswali ya mtihani na kazi

    1. Taja tofauti:
      • mkalimani kutoka kwa mkusanyaji;
      • mkusanyaji kutoka kwa mkusanyiko;
      • transcoder ya mtafsiri;
      • emulator kutoka kwa mkalimani;
      • sintaksia kutoka kwa semantiki.
    1. Tuambie kuhusu maendeleo ya hivi punde katika lugha za programu unazozijua. Toa sifa kuu za lugha hizi.
    2. Toa mifano mahususi ya matumizi ya mbinu za kutafsiri katika maeneo ambayo hayahusiani na lugha za programu.
    3. Toa mifano maalum ya lugha za programu zilizokusanywa.
    4. Toa mifano maalum ya lugha za programu zilizofasiriwa.
    5. Toa mifano maalum ya lugha za programu ambazo watunzi na wakalimani wanapatikana.
    6. Faida kuu na hasara za compilers.
    7. Faida kuu na hasara za wakalimani.
    8. Eleza tofauti kuu katika syntax ya lugha mbili za programu unazojua.
    9. Eleza tofauti kuu katika semantiki za lugha mbili za programu unazojua.
    10. Taja awamu kuu za mchakato wa tafsiri na madhumuni yao.
    11. Taja vipengele mahususi vya tafsiri ya pasi moja.
    12. Taja vipengele mahususi vya tafsiri ya pasi nyingi.
    13. Toa mifano ya michanganyiko inayowezekana ya tafsiri ya pasi moja na pasi nyingi. Tuambie kuhusu matumizi ya vitendo miradi hii.