Sintaksis (dasturlash tillari) - Syntax (programming languages)

Sintaksisni ajratib ko'rsatish va indent uslubi ko'pincha dasturchilarga manba kodlari elementlarini aniqlashda yordam berish uchun ishlatiladi. Bu Python kod rangli kodlangan yoritishni ishlatadi.

Yilda Kompyuter fanlari, sintaksis a kompyuter tili to'g'ri tuzilgan deb hisoblangan belgilar kombinatsiyalarini belgilaydigan qoidalar to'plamidir bayonotlar yoki iboralar o'sha tilda. Bu ikkalasiga ham tegishli dasturlash tillari, bu erda hujjat ko'rsatiladi manba kodi va to belgilash tillari, bu erda hujjat ma'lumotlarni aks ettiradi.

Tilning sintaksisi uning sirt shaklini belgilaydi.[1] Matn asosida kompyuter tillari ketma-ketliklarga asoslangan belgilar, esa vizual dasturlash tillari fazoviy maketga va belgilar orasidagi bog'lanishlarga asoslangan (ular matnli yoki grafik bo'lishi mumkin). Sintaktik jihatdan yaroqsiz bo'lgan hujjatlar a sintaksis xatosi. Til sintaksisini loyihalashda dizayner qonuniy va noqonuniy misollarni yozishdan boshlashi mumkin torlar, ushbu misollardan umumiy qoidalarni tushunishga urinishdan oldin.[2]

Sintaksis shuning uchun shakl kodi bilan taqqoslanadi semantik - the ma'no. Kompyuter tillarini qayta ishlashda semantik ishlov berish odatda sintaktik qayta ishlashdan keyin keladi; ammo, ba'zi hollarda, to'liq sintaktik tahlil qilish uchun semantik ishlov berish zarur va ular birgalikda yoki bir vaqtning o'zida. A kompilyator, sintaktik tahlil quyidagilarni o'z ichiga oladi foydalanuvchi interfeysi, esa semantik tahlil tarkibiga quyidagilar kiradi orqa tomon (va agar o'rta bosqich, agar bu bosqich ajratilgan bo'lsa).

Sintaksis darajalari

Kompyuter tili sintaksisini odatda uchta darajaga ajratish mumkin:

  • So'zlar - leksik daraja, belgilar qanday belgilar yaratishini aniqlaydi;
  • So'z birikmalari - grammatik daraja, tor ma'noda, jetonlarning qanday qilib so'z birikmalarini hosil qilishini belgilaydi;
  • Kontekst - nomlarning qaysi ob'ektlar yoki o'zgaruvchilarga tegishli ekanligini aniqlash, agar ular tegishli bo'lsa va hokazo.

Shu tarzda farqlash modullilikni keltirib chiqaradi, har bir darajani alohida va ko'pincha mustaqil ravishda tavsiflash va qayta ishlashga imkon beradi. Birinchidan, lekser belgilarning chiziqli ketma-ketligini nishonlar; bu "nomi bilan tanilganleksik tahlil "yoki" lexing ". Ikkinchidan, tahlilchi tokenlarning chiziqli ketma-ketligini ierarxik sintaksis daraxtiga aylantiradi; bu" nomi bilan tanilgan "tahlil qilish "tor ma'noda. Uchinchidan, kontekstli tahlil ismlarni hal qiladi va ularning turlarini tekshiradi. Bunday modullik ba'zan mumkin, ammo ko'plab real tillarda oldingi qadam keyingi bosqichga bog'liq - masalan, lexer hack C-da, chunki tokenizatsiya kontekstga bog'liq. Hatto ushbu holatlarda ham sintaktik tahlil ko'pincha ushbu ideal modelga yaqinlashadi.

Ajralish bosqichining o'zi ikki qismga bo'linishi mumkin: the daraxtni tahlil qilish, yoki grammatika bilan belgilanadigan, ammo umuman amaliy foydalanish uchun juda batafsil bo'lgan "beton sintaksis daraxti" va mavhum sintaksis daraxti (AST), bu buni foydalanishga yaroqli shaklda soddalashtiradi. AST va kontekstli tahlil bosqichlari sintaksisga ma'no va talqin qo'shib berayotganligi yoki muqobil ravishda rasmiy ravishda ta'riflash yoki amalga oshirish qiyin yoki noqulay bo'lgan sintaktik qoidalarning norasmiy, qo'lda tatbiq etilishi kabi semantik tahlilning shakli deb qaralishi mumkin.

Darajalar odatda Xomskiy ierarxiyasi. So'zlar a oddiy til, ko'rsatilgan leksik grammatika, bu odatda Type-3 grammatikasi bo'lib, odatda quyidagicha berilgan doimiy iboralar. Iboralar a kontekstsiz til (CFL), odatda a aniqlanadigan kontekstsiz til (DCFL), a da ko'rsatilgan ibora tuzilishi grammatikasi, bu odatda Type-2 grammatikasi bo'lib, odatda quyidagicha berilgan ishlab chiqarish qoidalari yilda Backus-Naur shakli (BNF). Fraza grammatikalari ko'pincha to'liqga qaraganda ancha cheklangan grammatikalarda ko'rsatiladi kontekstsiz grammatikalar, ularni tahlil qilishni osonlashtirish uchun; esa LR tahlilchisi har qanday DCFLni chiziqli vaqt ichida ajratishi mumkin, oddiy LALR tahlilchisi va hatto oddiyroq LL tahlilchisi yanada samaraliroq, ammo faqat ishlab chiqarish qoidalari cheklangan grammatikalarni tahlil qilishi mumkin. Asosan, kontekstli tuzilmani a tomonidan tasvirlash mumkin kontekstga sezgir grammatika kabi vositalar yordamida avtomatik ravishda tahlil qilinadi atribut grammatikalari, umuman olganda, ushbu qadam qo'l bilan, orqali amalga oshiriladi ism o'lchamlari qoidalar va turini tekshirish, va a orqali amalga oshiriladi belgilar jadvali har bir ko'lam uchun nomlar va turlarni saqlaydigan.

Oddiy iboralarda yozilgan leksik spetsifikatsiyadan avtomatik ravishda lekser yaratadigan va BNF-da yozilgan iboralar grammatikasidan ajratuvchi vositalar yozilgan: bu ulardan foydalanishga imkon beradi deklarativ dasturlash protsessual yoki funktsional dasturlarga ega bo'lish o'rniga. Ajoyib misol leks -yakk juftlik. Ular avtomatik ravishda ishlab chiqaradi beton sintaksis daraxti; keyin tahlilchi yozuvchi qo'lda bu qanday o'zgartirilishini tavsiflovchi kod yozishi kerak mavhum sintaksis daraxti. Kontekstli tahlil, shuningdek, odatda qo'lda amalga oshiriladi. Ushbu avtomatik vositalar mavjudligiga qaramasdan, tahlil qilish ko'pincha turli xil sabablarga ko'ra qo'lda amalga oshiriladi - ehtimol iboralar tarkibi kontekstsiz emas yoki alternativ dastur ishlashni yaxshilaydi yoki xato haqida xabar beradi yoki grammatikani osonroq o'zgartirishga imkon beradi. Tahlilchilar ko'pincha funktsional tillarda yoziladi, masalan Xaskell yoki skript tillarida, masalan Python yoki Perl yoki C yoki C ++.

Xatolarga misollar

Misol tariqasida, (1 1 qo'shing) sintaktik jihatdan yaroqli Lisp dasturidir ("qo'shish" funktsiyasi mavjud deb hisoblasa, boshqa nom echimi ishlamaydi), 1 va 1 qo'shiladi, ammo quyidagilar noto'g'ri:

(_ 1 1) leksik xato: '_' yaroqsiz (1 1 ajralish xatosini qo'shing: yopilish etishmayapti ')'

Lekser birinchi xatoni aniqlay olmasligini unutmang - faqatgina LEFT_PAREN tokenini ishlab chiqargandan so'ng, '(' dasturning qolgan qismi yaroqsiz, chunki hech qanday so'z qoidasi '_' bilan boshlanmaydi. Ikkinchi xato aniqlandi ajralish bosqichida: tahlilchi '(' belgisi (yagona o'yin sifatida) tufayli "ro'yxat" ishlab chiqarish qoidasini aniqladi va shu bilan xato xabari berishi mumkin; umuman olganda bo'lishi mumkin noaniq.

Turli xil xatolar va e'lon qilinmagan o'zgaruvchan xatolar, ba'zida ularni kompilyatsiya vaqtida aniqlanganda sintaksis xatolari deb qaraladi (odatda kuchli yozilgan tillarni kompilyatsiya qilishda shunday bo'ladi), ammo bunday xatolarni quyidagicha tasniflash odatiy holdir. semantik o'rniga xatolar.[3][4][5]

Masalan, Python kodi

'a' + 1

turi xatosini o'z ichiga oladi, chunki u tamsayı literal qatorini qo'shadi. Ushbu turdagi xatolarni kompilyatsiya vaqtida aniqlash mumkin: Agar ularni kompilyator "integerLiteral + integerLiteral" ga ruxsat beradigan alohida qoidalardan foydalansa, ularni tahlil qilish paytida (iboralarni tahlil qilish) aniqlash mumkin, ammo bu "stringLiteral + integerLiteral" emas, balki kompilyator "LiteralOrIdentifier + LiteralOrIdentifier" shaklidagi barcha ifodalarga imkon beradigan ajralish qoidasidan foydalanadi va keyinchalik xato kontekstual tahlil paytida aniqlanadi (turni tekshirish sodir bo'lganda). Ba'zi hollarda ushbu tekshiruv kompilyator tomonidan amalga oshirilmaydi va bu xatolar faqat ish vaqtida aniqlanadi.

Turni faqat ish vaqtida aniqlash mumkin bo'lgan dinamik ravishda terilgan tilda ko'plab xatolar faqat ish vaqtida aniqlanishi mumkin. Masalan, Python kodi

a + b

iboralar darajasida sintaktik jihatdan amal qiladi, lekin a va b turlarining to'g'riligini faqat ish vaqtida aniqlash mumkin, chunki o'zgaruvchilarda Pythonda tiplar mavjud emas, faqat qiymatlar mavjud. Kompilyator tomonidan aniqlangan tipdagi xatoni sintaksis xatosi deb atash kerakligi to'g'risida kelishmovchiliklar mavjud (a o'rniga statik semantik xato), faqat dasturni bajarish vaqtida aniqlanishi mumkin bo'lgan turdagi xatolar har doim sintaksis xatolaridan ko'ra semantik sifatida qabul qilinadi.

Sintaksis ta'rifi

Daraxt daraxti tokenizatsiya bilan Python kodi

Matnli dasturlash tillari sintaksisi odatda kombinatsiyasi yordamida aniqlanadi doimiy iboralar (uchun leksik tuzilishi) va Backus-Naur shakli (uchun grammatik tuzilma) induktiv ravishda belgilash sintaktik kategoriyalar (nonterminals) va Terminal belgilar. Sintaktik kategoriyalar chaqirilgan qoidalar bilan belgilanadi ishlab chiqarishlar, ma'lum bir sintaktik toifaga tegishli qiymatlarni belgilaydigan.[1] Terminal belgilari - bu aniq belgilar yoki belgilar qatorlari (masalan kalit so'zlar kabi aniqlang, agar, ruxsat bering, yoki bekor) sintaktik jihatdan yaroqli dasturlar tuziladi.

Tilda har xil ekvivalent grammatikalar bo'lishi mumkin, masalan, ekvivalent doimiy iboralar (leksik darajada) yoki bir xil tilni yaratadigan turli xil iboralar qoidalari. LR grammatikalari kabi kengroq toifadagi grammatikalardan foydalanish LL grammatikasi kabi cheklangan toifalar bilan taqqoslaganda qisqa yoki sodda grammatikalarga imkon berishi mumkin, bu esa ko'proq qoidalarga ega bo'lgan uzoq grammatikalarni talab qilishi mumkin. Turli xil, ammo ekvivalent iboralar grammatikasi turli xil daraxt daraxtlarini beradi, ammo asosiy til (haqiqiy hujjatlar to'plami) bir xil.

Misol: Lisp S-ifodalari

Quyida oddiy iboralar va doimiy iboralar yozuvi yordamida aniqlangan Kengaytirilgan Backus-Naur shakli. Bu sintaksisini tavsiflaydi S-iboralar, dasturlash tilining ma'lumotlar sintaksisini Lisp, sintaktik toifalar uchun ishlab chiqarishni belgilaydi ifoda, atom, raqam, belgiva ro'yxat:

ifoda = atom | ro'yxatatom = raqam | belgi raqam = [+-]?['0'-'9']+belgi = ["A"-"Z"]["A"-"Z" 0 "-'9'].*ro'yxat = '(', ifoda*, ')'

Ushbu grammatika quyidagilarni belgilaydi:

  • an ifoda yo an atom yoki a ro'yxat;
  • an atom yoki a raqam yoki a belgi;
  • a raqam ixtiyoriy ravishda oldiga plyus yoki minus belgisi qo'yilgan bir yoki bir nechta o'nlik raqamlarning uzluksiz ketma-ketligi;
  • a belgi har qanday belgidan keyin nol yoki undan ko'p belgilar (bo'sh joy bundan mustasno) bo'lgan harf; va
  • a ro'yxat nolga teng yoki undan ko'p bo'lgan qavslarning mos keluvchi jufti iboralar uning ichida.

Bu erda o'nli raqamlar, katta va kichik harflar va qavslar terminal belgilaridir.

Quyida ushbu grammatikada yaxshi shakllangan tokenlar ketma-ketligiga misollar keltirilgan: '12345', '()', '(A B C232 (1))'

Murakkab grammatikalar

Dasturlash tilini belgilash uchun zarur bo'lgan grammatika uning holatiga ko'ra tasniflanishi mumkin Xomskiy ierarxiyasi. Ko'pgina dasturlash tillarining ibora grammatikasi Type-2 grammatikasi yordamida aniqlanishi mumkin, ya'ni ular kontekstsiz grammatikalar,[6] garchi umumiy sintaksis kontekstga sezgir bo'lsa (o'zgaruvchan deklaratsiyalar va ichki doiralar tufayli), shuning uchun Type-1. Biroq, istisnolar mavjud va ba'zi tillar uchun iboralar grammatikasi Type-0 (Turing-to'liq).

Perl va Lisp singari ba'zi tillarda tilning spetsifikatsiyasi (yoki amalga oshirilishi) ajralish bosqichida bajariladigan tuzilmalarga imkon beradi. Bundan tashqari, ushbu tillarda dasturchiga tahlil qiluvchi xatti-harakatlarini o'zgartirishga imkon beruvchi tuzilmalar mavjud. Ushbu kombinatsiya tahlil qilish va bajarish o'rtasidagi farqni samarali ravishda yo'q qiladi va sintaksis tahlilini an qiladi hal qilinmaydigan muammo bu tillarda, ya'ni ajralish bosqichi tugamasligi mumkin. Masalan, Perl-da a yordamida kodni bajarish mumkin BOSHLASH iborasi va Perl funktsiyasining prototiplari sintaktik talqinni o'zgartirishi mumkin va hatto qolgan kodning sintaktik kuchliligini o'zgartirishi mumkin.[7] Oddiy so'zlar bilan aytganda, bu "faqat Perl Perlni ajrata oladi" (chunki kodni ajratish paytida bajarish kerak va grammatikani o'zgartirishi mumkin) yoki yanada kuchliroq "hatto Perl ham Perlni ajrata olmaydi" (chunki uni hal qilish mumkin emas). Xuddi shunday, Lisp makrolar tomonidan kiritilgan defmakro sintaksis ham tahlil qilish paytida bajariladi, ya'ni Lisp kompilyatori butun Lisp ish vaqti tizimiga ega bo'lishi kerak. Bundan farqli o'laroq, C makrolari shunchaki mag'lubiyatni almashtirishdir va kod bajarilishini talab qilmaydi.[8][9]

Sintaksis va semantikaga qarshi

Tilning sintaksisi amaldagi dastur shaklini tavsiflaydi, lekin dasturning mazmuni yoki ushbu dasturni bajarish natijalari to'g'risida hech qanday ma'lumot bermaydi. Belgilar kombinatsiyasiga berilgan ma'no semantika bilan boshqariladi (ham rasmiy yoki a-da qattiq kodlangan ma'lumotnomani amalga oshirish ). Sintaktik jihatdan to'g'ri dasturlarning hammasi ham semantik jihatdan to'g'ri kelmaydi. Ko'pgina sintaktik jihatdan to'g'ri dasturlar, shunga qaramay, til qoidalariga ko'ra noto'g'ri shakllangan; va (tilning spetsifikatsiyasi va amalga oshirilishining aniqligiga qarab) tarjima yoki ijroda xatolikka olib kelishi mumkin. Ba'zi hollarda, bunday dasturlar namoyish etilishi mumkin aniqlanmagan xatti-harakatlar. Dastur tilda yaxshi aniqlangan taqdirda ham, uni yozgan kishi mo'ljal qilmagan ma'noga ega bo'lishi mumkin.

Foydalanish tabiiy til misol tariqasida grammatik jihatdan to'g'ri jumlaga ma'no tayinlashning iloji bo'lmasligi yoki gap yolg'on bo'lishi mumkin:

  • "Rangsiz yashil g'oyalar g'azab bilan uxlaydi. "grammatik jihatdan yaxshi shakllangan, ammo umuman qabul qilingan ma'noga ega emas.
  • "Jon - turmush qurgan bakalavr." grammatik jihatdan yaxshi shakllangan, ammo haqiqat bo'lishi mumkin bo'lmagan ma'noni ifodalaydi.

S tilining quyidagi qismi sintaktik jihatdan to'g'ri, ammo semantik jihatdan aniqlanmagan operatsiyani bajaradi (chunki p a nol ko'rsatkich, operatsiyalar p-> real va p-> im ma'nosi yo'q):

 murakkab *p = NULL; murakkab abs_p = kv (p->haqiqiy * p->haqiqiy + p->im * p->im);

Oddiy misol sifatida,

 int x; printf("% d", x);

sintaktik jihatdan to'g'ri, ammo semantik jihatdan aniqlanmagan, chunki u an dan foydalanadi boshlanmagan o'zgaruvchi. Ba'zi dasturlash tillari uchun kompilyatorlar (masalan, Java va C #) ushbu turdagi boshlanmagan o'zgaruvchan xatolarni aniqlasa ham, ular quyidagicha qabul qilinishi kerak semantik sintaksis xatolaridan ko'ra xatolar.[5][10]

Shuningdek qarang

Turli xil dasturlash tillari sintaksisini tezda taqqoslash uchun quyidagilarning ro'yxatiga qarang "Salom Dunyo!" dastur misollar:

Adabiyotlar

  1. ^ a b Fridman, Daniel P.; Mitchell tayoqchasi; Kristofer T. Xeyns (1992). Dasturlash tillari asoslari (1-nashr). MIT Press. ISBN  0-262-06145-7.
  2. ^ Smit, Dennis (1999). Ta'minlanadigan dasturiy ta'minotni loyihalash. Springer Science & Business Media.
  3. ^ Aho, Alfred V.; Monika S. Lam; Ravi Seti; Jeffri D. Ullman (2007). Tuzuvchilar: printsiplar, usullar va vositalar (2-nashr). Addison Uesli. ISBN  0-321-48681-1.4.1.3-bo'lim: Sintaksis xatolar bilan ishlash, 194-195 betlar.
  4. ^ Louden, Kennet C. (1997). Tuzuvchi tuzilishi: printsiplari va amaliyoti. Bruks / Koul. ISBN  981-243-694-4. 1.3-mashq, 27-28 betlar.
  5. ^ a b Java-da semantik xatolar
  6. ^ Maykl Sipser (1997). Hisoblash nazariyasiga kirish. PWS nashriyoti. ISBN  0-534-94728-X. 2.2-bo'lim: Pushdown Automata, p.101–114.
  7. ^ Quyidagi munozaralarda misollar keltirilgan:
  8. ^ "Umumiy Lisp makrolariga kirish". Apl.jhu.edu. 1996-02-08. Arxivlandi asl nusxasi 2013-08-06 da. Olingan 2013-08-17.
  9. ^ "Umumiy Lisp oshpazligi - Makrolar va teskari ma'lumot". Cl-cookbook.sourceforge.net. 2007-01-16. Olingan 2013-08-17.
  10. ^ Sintaksis yoki semantika masalasi?

Tashqi havolalar