Leksik tahlil - Lexical analysis - Wikipedia

Yilda Kompyuter fanlari, leksik tahlil, leksing yoki tokenizatsiya ning ketma-ketligini konvertatsiya qilish jarayoni belgilar (masalan, a kompyuter dasturi yoki veb sahifa ) jetonlar ketma-ketligiga (torlar tayinlangan va shu bilan aniqlangan ma'no bilan). Leksik tahlilni amalga oshiradigan dastur a deb nomlanishi mumkin lexer, tokenizer,[1] yoki skaner, garchi skaner lekserning birinchi bosqichi uchun atama hamdir. Lekser odatda a bilan birlashtiriladi tahlilchi, birgalikda tahlil qiladigan sintaksis ning dasturlash tillari, veb-sahifalar, va hokazo.

Ilovalar

Lekser a ning birinchi fazasini hosil qiladi kompilyator frontend zamonaviy qayta ishlashda. Tahlil odatda bitta o'tishda sodir bo'ladi.

Kabi eski tillarda ALGOL, uning o'rniga dastlabki bosqich bo'lgan liniyani qayta qurish, ijro etgan bekor qilish va bo'shliqni olib tashladi va Izohlar (va alohida-alohida lekseri bo'lmagan holda, skanersiz tahlil qiluvchilarga ega edi). Ushbu amallar endi lekserning bir qismi sifatida amalga oshiriladi.

Lekserlar va tahlilchilar ko'pincha kompilyatorlar uchun ishlatiladi, ammo boshqa kompyuter til vositalari uchun ishlatilishi mumkin, masalan chiroyli izlar yoki linters. Leksingni ikki bosqichga bo'lish mumkin: the skanerlash, bu kirish satrini sintaktik birliklarga ajratadi leksemalar va ularni token sinflariga ajratadi; va baholash, bu leksemalarni qayta ishlangan qiymatlarga aylantiradi.

Lekserlar odatda juda sodda bo'lib, murakkablikning katta qismi ajralish uchun qoldirilgan yoki semantik tahlil bosqichlari va ko'pincha a tomonidan yaratilishi mumkin lexer generatori, ayniqsa leks yoki hosilalar. Biroq, lekserlar ba'zida ba'zi bir murakkablikni o'z ichiga olishi mumkin, masalan iboralar tarkibi kirishni osonlashtirish va ajralishni soddalashtirish uchun ishlov berish va qo'shimcha funktsiyalarni qo'llab-quvvatlash uchun yoki ishlash uchun qisman yoki to'liq qo'l bilan yozilishi mumkin.

Leksik tahlil ham muhim dastlabki bosqich hisoblanadi tabiiy tilni qayta ishlash, bu erda matn yoki tovush to'lqinlari so'zlarga va boshqa birliklarga bo'linadi. Bu to'liq standartlashtirilmagan turli xil qarorlarni talab qiladi va token tizimlari soni "1/2", "stul", "qila olmaydi", "va / yoki", "1/1 / 2010 "," 2x4 "," ..., "va boshqalar. Bu dasturlash uchun leksik tahlildan va aniq qoidalar odatda aniqlangan va ma'lum bo'lgan o'xshash tillardan farq qiladi.

Leksema

A leksema - bu manba dasturidagi belgi ketma-ketligi, bu token namunasiga mos keladi va leksik analizator tomonidan ushbu belgining misoli sifatida aniqlanadi.[2]

Ba'zi mualliflar buni "token" deb atashadi, tokenizatsiyalanayotgan qatorni ifodalash uchun "token" ni bir-birining o'rnida ishlatishadi va ushbu satrni qo'yish orqali hosil bo'lgan ma'lumot ma'lumotlari tuzilishi. tokenizatsiya jarayon.[3][4]

Kompyuter fanida leksema so'zi boshqacha ta'riflanadi leksema tilshunoslikda. Kompyuter fanidagi leksema taxminan a ga to'g'ri keladi so'z tilshunoslikda (a bilan aralashmaslik kerak kompyuter arxitekturasidagi so'z ), garchi ba'zi hollarda u a ga o'xshash bo'lishi mumkin morfema.

Token

A leksik leksema yoki oddiygina nishon a mag'lubiyat tayinlangan va shu bilan aniqlangan ma'noga ega. Dan tashkil topgan juftlik sifatida tuzilgan jeton nomi va ixtiyoriy token qiymati. Jeton nomi leksik birlik kategoriyasi.[2] Jetonning umumiy nomlari

  • identifikator: dasturchi tanlagan nomlar;
  • kalit so'z: dasturlash tilida allaqachon mavjud bo'lgan ismlar;
  • ajratuvchi (punktuator deb ham ataladi): tinish belgilari va juftlashgan-ajratuvchi;
  • operator: argumentlar asosida ishlaydigan va natijalarni beradigan belgilar;
  • so'zma-so'z: raqamli, mantiqiy, matnli, ma'lumotnomalar;
  • sharh: line, block (Agar kompilyator izohlarni nishon sifatida bajarsa, kompilyatorga bog'liq, aks holda u o'chiriladi).
Token qiymatlariga misollar
Token nomiToken qiymatlarining namunasi
identifikatorx, rang, YUQARILADI
kalit so'zagar, esa, qaytish
ajratuvchi}, (, ;
operator+, <, =
so'zma-so'zto'g'ri, 6.02e23, "musiqa"
sharh/ * Foydalanuvchi ma'lumotlarini oladi * /, // salbiy bo'lishi kerak

Ushbu ifodani C dasturlash tili:

x = a + b * 2;

Ushbu iborani leksik tahlil qilish quyidagi tokenlar ketma-ketligini beradi:

[(identifikator, x), (operator, =), (identifikator, a), (operator, +), (identifikator, b), (operator, *), (literal, 2), (separator,;)]

Token nomi a deb atash mumkin nutqning bir qismi tilshunoslikda.

Leksik grammatika

A ning xususiyatlari dasturlash tili ko'pincha qoidalar to'plamini o'z ichiga oladi, leksik grammatika, bu leksik sintaksisni belgilaydi. Leksik sintaksis odatda a oddiy til, iborat grammatik qoidalar bilan doimiy iboralar; ular jetonning mumkin bo'lgan belgilar ketma-ketliklari (leksemalari) to'plamini aniqlaydilar. Lekser satrlarni taniydi va topilgan har bir satr uchun leksik dastur amal qiladi, eng sodda belgi hosil qiladi.

Ikki muhim umumiy leksik toifalar oq bo'shliq va Izohlar. Bular grammatikada aniqlangan va lekser tomonidan qayta ishlangan, ammo tashlab yuborilishi mumkin (hech qanday belgi hosil qilmaydigan) va ko'rib chiqilishi mumkin ahamiyatsiz, eng ko'p ikkita belgini ajratib turing (kabi agar x o'rniga ifx). Bunda ikkita muhim istisno mavjud. Birinchidan, ichida tashqi qoidalar chegaralaydigan tillar bloklar indenting bilan boshlang'ich bo'shliq muhim ahamiyatga ega, chunki u blok tuzilishini aniqlaydi va odatda lexer darajasida ishlaydi; qarang iboralar tarkibi, quyida. Ikkinchidan, lekserlarning ba'zi ishlatilishlarida sharhlar va bo'sh joy saqlanib qolishi kerak - masalan, a chiroyli printer shuningdek, sharhlarni chiqarishi kerak va ba'zi disk raskadrovka vositalari dasturchiga asl manba kodini ko'rsatadigan xabarlarni berishi mumkin. 1960-yillarda, ayniqsa ALGOL, bo'sh joy va sharhlar qismi sifatida olib tashlandi liniyani qayta qurish faza (ning boshlang'ich bosqichi kompilyator frontend ), ammo bu alohida faza bekor qilindi va endi ularni lexer boshqaradi.

Tokenizatsiya

Tokenizatsiya - bu kirish belgilarining qatorlarini ajratish va ehtimol tasniflash jarayoni. Olingan nishonlar keyinchalik qayta ishlashning boshqa bir shakliga o'tadi. Jarayonni pastki vazifasi deb hisoblash mumkin tahlil qilish kiritish.

Masalan, matnda mag'lubiyat:

Tez jigarrang tulki dangasa itning ustidan sakrab chiqadi

mag'lubiyat bo'shliqlarga bevosita bo'linmaydi, a tabiiy til ma'ruzachi qiladi. Xom kirish, 43 belgi, berilgan bo'shliqni ajratuvchi (ya'ni satrga mos keladigan) 9 belgiga aniq bo'linishi kerak " " yoki doimiy ifoda / s {1} /).

Belgilar namoyish etilishi mumkin XML,

<sentence>  <word>The</word>  <word>tez</word>  <word>jigarrang</word>  <word>tulki</word>  <word>sakrash</word>  <word>ustida</word>  <word>The</word>  <word>dangasa</word>  <word>it</word></sentence>

yoki sifatida s-ifoda,

 (hukm   (so'z The)   (so'z tez)   (so'z jigarrang)   (so'z tulki)   (so'z sakrash)   (so'z ustida)   (so'z The)   (so'z dangasa)   (so'z it))

Jeton sinfi bir nechta mumkin leksemani ifodalasa, lekser ko'pincha asl leksemani ko'paytirish uchun etarli ma'lumotni saqlaydi, shunda u ishlatilishi mumkin semantik tahlil. Tahlilchi odatda ushbu ma'lumotni lekserdan oladi va ichida saqlaydi mavhum sintaksis daraxti. Bu raqamlar va identifikatorlar holatida ma'lumot yo'qotilishining oldini olish uchun kerak.

Lekserning o'ziga xos qoidalariga asoslanib jetonlar aniqlanadi. Jetonlarni aniqlash uchun ishlatiladigan ba'zi usullarga quyidagilar kiradi: doimiy iboralar, a deb nomlangan o'ziga xos belgilar ketma-ketligi bayroq, deb nomlangan aniq ajratuvchi belgilar ajratuvchilar va lug'at tomonidan aniq ta'rifi. Lekserlar yozma va dasturlash tillarida tabiiy ishlatilganligi sababli leksiklar tomonidan odatda maxsus belgilar, shu jumladan tinish belgilaridan foydalaniladi.

Jetonlar ko'pincha belgilar tarkibiga yoki ma'lumotlar oqimidagi kontekstga qarab tasniflanadi. Kategoriyalar lekser qoidalari bilan belgilanadi. Kategoriyalar ko'pincha ma'lumotlar oqimida ishlatiladigan tilning grammatik elementlarini o'z ichiga oladi. Dasturlash tillari ko'pincha tokenlarni identifikatorlar, operatorlar, guruhlash belgilari yoki tomonidan belgilanadi ma'lumotlar turi. Yozma tillar odatda nishonlarni ot, fe'l, sifat yoki tinish belgilariga ajratadi. Kategoriyalar tokenlarni ajratuvchi yoki dasturning boshqa funktsiyalari bo'yicha keyingi ishlov berish uchun ishlatiladi.

Leksik analizator odatda nishonlar birikmasi bilan hech narsa qilmaydi, a uchun qoldirilgan vazifa tahlilchi. Masalan, odatdagi leksik analizator qavslarni nishon sifatida tan oladi, ammo har bir "(" ning "" "bilan mos kelishini ta'minlash uchun hech narsa qilmaydi.

Lekser nishonlarni tahlil qiluvchiga berganda, odatda vakolatlarning raqamlangan ro'yxati ishlatiladi. Masalan, "Identifikator" 0 bilan, "Assignment operator" 1 bilan, "Add operator" 2 bilan va boshqalar bilan ifodalanadi.

Jetonlar ko'pincha tomonidan belgilanadi doimiy iboralar kabi leksik analizator generatori tomonidan tushuniladi leks. Leksik analizator (lex kabi vosita tomonidan avtomatik ravishda hosil qilingan yoki qo'lda yaratilgan) belgilar oqimida o'qiydi, leksemalar oqimda va ularni tokenlarga ajratadi. Bu muddat tokening. Lekser yaroqsiz belgini topsa, u xato haqida xabar beradi.

Tokenlashtirishdan so'ng tahlil qilish. U erdan talqin qilingan ma'lumotlar umumiy foydalanish, talqin qilish yoki uchun ma'lumotlar tuzilmalariga yuklanishi mumkin kompilyatsiya qilish.

Skaner

Birinchi bosqich skaner, odatda a ga asoslanadi cheklangan holatdagi mashina (FSM). U o'z ichiga olgan har qanday belgida bo'lishi mumkin bo'lgan belgilarning mumkin bo'lgan ketma-ketliklari to'g'risidagi ma'lumotlarni kodladi (ushbu belgilar ketma-ketligining alohida nusxalari leksemalar ). Masalan, an tamsayı leksema tarkibida har qanday ketma-ketlik bo'lishi mumkin raqamli raqam belgilar. Ko'pgina hollarda, bo'sh joy bo'lmagan birinchi belgi quyidagi token turini chiqarish uchun ishlatilishi mumkin va keyinchalik kiritilgan belgilar keyinchalik ushbu belgi uchun qabul qilinadigan belgilar to'plamida bo'lmagan belgiga etib borguncha birma-bir qayta ishlanadi (bu deb nomlanadi maksimal munch, yoki eng uzun o'yin, qoida). Ba'zi tillarda leksemashakl yaratish qoidalari ancha murakkab va o'z ichiga olishi mumkin orqaga qaytish oldin o'qilgan belgilar ustidan. Masalan, C tilida bitta "L" belgisi "L" bilan boshlanadigan identifikator va keng simvolli mag'lubiyatni ajratish uchun etarli emas.

Baholovchi

A leksema ammo, faqat ma'lum bir turdagi ma'lum bo'lgan belgilar qatori (masalan, harflar qatori, harflar ketma-ketligi). Jetonni qurish uchun leksik analizatorga ikkinchi bosqich kerak bo'ladi baholovchi, leksema belgilaridan o'tib, a hosil qilish uchun qiymat. Leksemaning turi va uning qiymati bilan birlashtirilib, ajraluvchiga berilishi mumkin bo'lgan belgini to'g'ri tashkil etadi. Qavslar kabi ba'zi bir nishonlar haqiqatan ham qiymatlarga ega emas va shuning uchun ular uchun baholovchi funktsiyasi hech narsa qaytarolmaydi: faqat turi kerak. Xuddi shunday, ba'zida baholovchilar leksemani bo'shliq va sharhlar uchun foydali bo'lgan tahlilchidan yashirib, butunlay bostirishi mumkin. Identifikatorlar uchun baholovchilar odatda sodda (identifikatorni tom ma'noda ifodalaydi), ammo ba'zilarini o'z ichiga olishi mumkin bekor qilish. Uchun baholovchilar butun sonli harflar mag'lubiyatni uzatishi mumkin (baholashni semantik tahlil bosqichiga qoldirish) yoki o'zlari turli xil asoslar yoki suzuvchi nuqta raqamlari uchun jalb qilinishi mumkin bo'lgan baholashni amalga oshirishi mumkin. Oddiy kotirovka qilingan mag'lubiyat uchun baholovchi faqat tirnoqlarni olib tashlashi kerak, ammo an uchun baholovchi mag'lubiyatga uchragan lexerni o'z ichiga oladi, bu qochish ketma-ketliklarini olib tashlamaydi.

Masalan, kompyuter dasturining manba kodida satr

net_worth_future = (aktivlar majburiyatlar);

quyidagi leksik leksiklar oqimiga aylantirilishi mumkin; bo'sh joy bostirilgan va maxsus belgilar hech qanday qiymatga ega emas:

IDENTIFIER net_worth_futureEQUALSOPEN_PARENTHESISIDENTIFIER aktivlariMINUSIDENTIFIER majburiyatlariCLOSE_PARENTHESISSEMICOLON

Mavjud tahlilchilarning litsenziyalash cheklovlari tufayli lekserni qo'l bilan yozish kerak bo'lishi mumkin. Agar tokenlar ro'yxati kichik bo'lsa, lekin umuman lexers avtomatlashtirilgan vositalar tomonidan yaratilgan bo'lsa, bu amaliydir. Ushbu vositalar odatda kirish oqimida ruxsat etilgan tokenlarni tavsiflovchi muntazam iboralarni qabul qiladi. Har bir doimiy ibora a bilan bog'langan ishlab chiqarish qoidasi doimiy ifodaga mos leksemalarni baholovchi dasturlash tilining leksik grammatikasida. Ushbu vositalar kompilyatsiya qilinadigan yoki bajarilishi mumkin bo'lgan yoki yaratadigan manba kodini yaratishi mumkin davlat o'tish jadvali a cheklangan holatdagi mashina (kompilyatsiya qilish va bajarish uchun shablon kodiga kiritilgan).

Doimiy iboralar leksemalar tarkibidagi belgilar amal qilishi mumkin bo'lgan naqshlarni ixcham ifodalaydi. Masalan, uchun Ingliz tili IDENTIFIER belgisi har qanday inglizcha alfavit belgisi yoki pastki chiziq, keyin esa ASCII alfasayısal belgilar va / yoki pastki chiziqlarning har qanday nusxalari bo'lishi mumkin. Bu ip bilan ixcham tarzda ifodalanishi mumkin [a-zA-Z _] [a-zA-Z_0-9] *. Bu "har qanday belgi a-z, A-Z yoki _, undan keyin 0 yoki undan ko'p a-z, A-Z, _ yoki 0-9 belgilar" degan ma'noni anglatadi.

Muntazam iboralar va ular yaratadigan cheklangan holatdagi mashinalar rekursiv naqshlarni boshqarish uchun kuchga ega emas, masalan. "n ochiladigan qavslar, undan keyin bayonot, keyin n yopiladigan qavs. "Ular hisoblashni davom ettira olmaydilar va buni tasdiqlaydilar n Agar cheklangan ruxsat etilgan qiymatlar to'plami mavjud bo'lmasa, ikkala tomon ham bir xil bo'ladi n. Bunday naqshlarni to'liq umumiyligini aniqlash uchun to'liq tahlil qilish kerak. Ajratuvchi qavslarni stakka bosishi mumkin, so'ngra ularni o'chirishga urinib ko'radi va oxirida stak bo'shligini tekshiradi (misolga qarang)[5] ichida Kompyuter dasturlarining tuzilishi va talqini kitob).

To'siqlar

Odatda, tokenizatsiya so'z darajasida sodir bo'ladi. Biroq, ba'zida "so'z" nimani anglatishini aniqlash qiyin. Ko'pincha tokenizer oddiy evristikaga tayanadi, masalan:

  • Tinish belgilari va bo'sh joy, natijada olingan belgilar qatoriga kiritilishi yoki kiritilmasligi mumkin.
  • Alifbo belgilarining barcha tutashgan satrlari bitta belgining bir qismidir; xuddi shunday raqamlar bilan.
  • Jetonlar ajratilgan bo'sh joy belgilar, masalan, bo'sh joy yoki chiziq oralig'i yoki tinish belgilari bilan.

So'zlararo bo'shliqlardan foydalanadigan tillarda (masalan, lotin alifbosidan foydalanadigan ko'pchilik va dasturlash tillarining aksariyati) bu yondashuv juda sodda. Biroq, hatto bu erda ham ko'plab chekka holatlar mavjud kasılmalar, tire so'zlar, kulgichlar kabi katta tuzilmalar URI (ba'zi maqsadlar uchun bitta belgi sifatida hisoblanishi mumkin). Klassik misol - "Nyu-Yorkda joylashgan", bu sodda tokenizer kosmosda yorilib ketishi mumkin, garchi yaxshiroq tanaffus (tortishuvlarga qadar) bo'lsa ham.

Tokenlash ayniqsa yozilgan tillar uchun juda qiyin scriptio continua kabi so'z chegaralarini namoyish etmaydigan Qadimgi yunoncha, Xitoy,[6] yoki Tailandcha. Aglutinativ tillar, masalan, koreyscha, shuningdek tokenizatsiya vazifalarini murakkablashtiradi.

Murakkab muammolarni hal qilishning ba'zi usullari orasida murakkab evristikani rivojlantirish, keng tarqalgan maxsus holatlar jadvalini so'rash yoki nishonlarni moslashtirish kiradi. til modeli keyingi ishlov berish bosqichida kollokatsiyalarni aniqlaydigan.

Dasturiy ta'minot

  • Apache OpenNLP ko'plab tillarni qo'llab-quvvatlaydigan qoidalarga asoslangan va statistik tokenizatorlarni o'z ichiga oladi
  • U-Tokenizator so'zlar chegarasida Mandarin va Yaponiya jumlalarini qisqartirishi mumkin bo'lgan HTTP orqali API. Ingliz tili ham qo'llab-quvvatlanadi.
  • HPE Haven OnDemand Text Tokenization API (Freemium kirish huquqiga ega bo'lgan tijorat mahsuloti) belgilangan matn indekslarida atamaning og'irligini aniqlash uchun Advanced Probabilistic Concept Modeling-dan foydalanadi.
  • The Lex vositasi va uning kompilyatori leksik sintaksisning rasmiy tavsifi asosida tezkor leksik analizatorlar uchun kod ishlab chiqarishga mo'ljallangan. Odatda, murakkab leksik qoidalar va ishlashning jiddiy talablariga ega dasturlar uchun etarli emas deb hisoblanadi. Masalan, GNU kompilyatori to'plami (GCC) qo'lda yozilgan lekserlardan foydalanadi.

Lexer generatori

Lekserlar ko'pincha a tomonidan hosil qilinadi lexer generatori, o'xshash ajralish generatorlari va bunday vositalar ko'pincha birlashadi. Eng yaxshi tashkil etilgan leks bilan bog'langan yakk parser generatori, aniqrog'i ularning ko'pgina reimplementatsiyalaridan ba'zilari, masalan egiluvchanlik (ko'pincha bilan bog'langan GNU Bison ). Ushbu generatorlar domenga xos til, leksik spetsifikatsiyani qabul qilish - odatda ba'zi bir belgilar bilan muntazam iboralar - va lekserni chiqarish.

Ushbu vositalar juda tez rivojlanishga imkon beradi, bu dastlabki lekserni olish uchun ham, tilning spetsifikatsiyasi tez-tez o'zgarib turishi uchun ham juda erta rivojlanishda juda muhimdir. Bundan tashqari, ular ko'pincha qo'lda dasturlash qiyin bo'lgan oldingi va keyingi shartlar kabi rivojlangan xususiyatlarni taqdim etadilar. Biroq, avtomatik ravishda yaratilgan lexerga moslashuvchanlik etishmasligi mumkin va shuning uchun qo'lda o'zgartirish yoki umuman qo'lda yozilgan lexer kerak bo'lishi mumkin.

Lekserning ishlashi xavotirga soladi va optimallashtirish ko'proq ahamiyatga ega, shuning uchun lekser tez-tez ishlatib turiladigan barqaror tillarda (masalan, C yoki HTML). lex / flex tomonidan yaratilgan lekserlar juda tezdir, lekin ko'proq sozlangan generatorlar yordamida ikki-uch marta yaxshilanish mumkin. Ba'zida qo'lda yozilgan lexerlardan foydalaniladi, ammo zamonaviy lekser generatorlari ko'pchilik kodlanganlarga qaraganda tezroq lekserlar ishlab chiqaradi. Generatorlarning lex / flex oilasi to'g'ridan-to'g'ri kodlangan usulga qaraganda ancha kam samarador bo'lgan jadvalga asoslangan yondashuvdan foydalanadi.[shubhali ] Oxirgi yondashuv bilan generator to'g'ridan-to'g'ri goto bayonotlari orqali keyingi holatlarga o'tadigan dvigatel ishlab chiqaradi. Re2c kabi vositalar[7] egiluvchan dvigatellardan ikki-uch baravar tezroq dvigatellar ishlab chiqarishi isbotlangan.[iqtibos kerak ] Umuman olganda, ushbu so'nggi vositalar tomonidan yaratilgan dvigatellarga qaraganda yaxshiroq ishlaydigan analizatorlarni qo'lda yozish qiyin.

So'z birikmasi

Leksik tahlil asosan belgilarning kirish oqimini jetonlarga ajratadi, shunchaki belgilarni qismlarga ajratish va ularni tasniflash. Biroq, leksing sezilarli darajada murakkabroq bo'lishi mumkin; eng sodda qilib aytganda, lekserlar jetonlarni tashlab ketishi yoki qo'shilgan jetonlarni kiritishi mumkin. Belgilarni, xususan bo'sh joyni va izohlarni qoldirish juda tez-tez uchraydi, agar ular kompilyatorga kerak bo'lmasa. Odatda kamroq qo'shilgan nishonlar kiritilishi mumkin. Bu asosan tokenlarni guruhlash uchun amalga oshiriladi bayonotlar yoki tahlilchilarni soddalashtirish uchun bloklarga ajratilgan bayonotlar.

Chiziqning davomi

Chiziqning davomi yangi satr odatda bayonot terminatori bo'lgan ba'zi tillarning xususiyati. Ko'pincha, chiziqni teskari chiziq bilan tugatish (darhol keyin a yangi qator natijalar satrda bo'lishiga olib keladi davom etdi - quyidagi satr qo'shildi oldingi qatorga. Bu odatda lexerda amalga oshiriladi: yangi chiziq tokenlashtirilgandan ko'ra, teskari chiziq va yangi satr bekor qilinadi. Bunga misollar kiradi bosh,[8] boshqa qobiq skriptlari va Python.[9]

Vertikal qo'shish

Ko'pgina tillar nuqta-vergulni bayonot terminatori sifatida ishlatishadi. Ko'pincha bu majburiy, ammo ba'zi tillarda nuqta-vergul ko'p kontekstda ixtiyoriy. Bu asosan lekser darajasida amalga oshiriladi, u erda lekser kirish belgilar oqimida mavjud bo'lmasligiga qaramay, belgi oqimiga nuqta-vergul chiqaradi va termin bilan ataladi vergul kiritish yoki avtomatik vergul kiritish. Bunday hollarda, vergullar tilning rasmiy iboralar grammatikasining bir qismidir, ammo kirish matnida topilmasligi mumkin, chunki ularni lekser qo'shishi mumkin. Ixtiyoriy nuqta-vergul yoki boshqa terminatorlar yoki ajratgichlar ham ba'zida tahlilchi darajasida, xususan oxirgi vergullar yoki nuqta-vergul.

Vertikal qo'shish - bu xususiyat BCPL va uning uzoq avlodi Boring,[10] u B yoki C da yo'q bo'lsa ham.[11] Vertikal qo'shish mavjud JavaScript garchi qoidalar biroz murakkab va juda tanqid qilingan bo'lsa-da; xatolarga yo'l qo'ymaslik uchun ba'zilari har doim nuqta-verguldan foydalanishni tavsiya qiladilar, boshqalari esa boshlang'ich nuqta-verguldan foydalanadilar mudofaa nuqta-vergullari, potentsial noaniq bayonotlarning boshida.

Nuqtali vergul kiritish (nuqta-vergul bilan yakunlangan so'zlar bilan tillarda) va chiziqni davom ettirish (yangi satrda tugatilgan so'zlar bilan tillarda) bir-birini to'ldiruvchi sifatida qaralishi mumkin: nuqta-vergul qo'shilishi belgini qo'shadi, garchi yangi satrlar umuman olganda emas tokenlarni yaratadi, chiziqni davom ettirish esa, odatda yangi qatorlar bo'lsa ham, token yaratilishiga to'sqinlik qiladi qil nishonlarni yaratish.

Chetdan qoida

The tashqi qoidalar (indenting bilan aniqlangan bloklar) xuddi bo'lgani kabi lekserda amalga oshirilishi mumkin Python, bu erda indentingni oshirishda lekser INDENT belgisini chiqaradi va kamaytirganda lexerda DEDENT belgisini chiqaradi.[9] Ushbu nishonlar ochilish moslamasiga to'g'ri keladi { va yopuvchi qavs } bloklar uchun qavslardan foydalanadigan tillarda va iboralar grammatikasi braxet yoki indenting ishlatilishiga bog'liq emasligini anglatadi. Buning uchun lekserning holatini, ya'ni joriy indent darajasini va shu bilan o'zgarganda indentingdagi o'zgarishlarni aniqlashni talab qiladi va shu bilan leksik grammatika kontekstsiz: INDENT-DEDENT oldingi indent darajadagi kontekstual ma'lumotlarga bog'liq.

Kontekstga sezgir leksika

Odatda leksik grammatikalar kontekstsiz yoki deyarli shundaydir, shuning uchun oldinga yoki oldinga qarab, orqaga qaytishni talab qilmaydi, bu oddiy, toza va samarali bajarishga imkon beradi. Shuningdek, bu lekserga qaytib keladigan ma'lumotlarga ehtiyoj sezmasdan, lekserdan ajraluvchiga oddiy bir tomonlama aloqani ta'minlaydi.

Biroq, istisnolar mavjud. Oddiy misollarga quyidagilar kiradi: Go-da nuqta-vergul qo'shilishi, buning uchun bitta belgini orqaga qarash kerak; Python-da ketma-ket magistrallarni birlashtirish,[9] bir tokenni chiqarmasdan oldin uni buferda ushlab turishni talab qiladi (keyingi token boshqa mag'lubiyat literal ekanligini ko'rish uchun); va Python-dagi tashqi qoidalar, bu esa indent darajasini hisoblashni talab qiladi (chindan ham har bir indent darajasining to'plami). Ushbu misollarning barchasi faqat leksik kontekstni talab qiladi va lekserni biroz murakkablashtirsa-da, ular tahlilchi va keyingi bosqichlarga ko'rinmaydi.

Keyinchalik murakkab misol lexer hack belgi ketma-ketligining token sinfini semantik tahlil bosqichiga qadar aniqlab bo'lmaydigan C da, chunki typedef ismlar va o'zgaruvchan nomlar leksik jihatdan bir xil, ammo har xil token sinflarini tashkil qiladi. Shunday qilib, lekser semantik analizatorni chaqiradi (masalan, ramzlar jadvali) va ketma-ketlik typedef nomini talab qiladimi-yo'qligini tekshiradi. Bunday holda, ma'lumot faqat tahlil qiluvchidan emas, balki semantik analizatordan lekserga qaytishi kerak, bu esa dizaynni murakkablashtiradi.

Shuningdek qarang

Adabiyotlar

  1. ^ "Tuzuvchi va tokenator anatomiyasi". www.cs.man.ac.uk.
  2. ^ a b sahifa 111, "Tuzuvchilarning printsiplari, texnikasi va vositalari, 2-nashr." (WorldCat) Aho, Lam, Seti va Ullman tomonidan keltirilgan https://stackoverflow.com/questions/14954721/what-is-the-difference-between-token-and-lexeme
  3. ^ Perl 5 Porters. "perlinterp: Perl 5 versiyasi 24.0 hujjatlari". perldoc.perl.org - Perl dasturlash tili uchun rasmiy hujjatlar. perldoc.perl.org. Olingan 26 yanvar 2017.
  4. ^ Gay Koder (2013 yil 19-fevral). "Leksemaning leksemadan farqi nimada?". Stack overflow. Stack Exchange Inc.. Olingan 26 yanvar 2017.
  5. ^ "Kompyuter dasturlarining tuzilishi va talqini". mitpress.mit.edu. Arxivlandi asl nusxasi 2012-10-30 kunlari. Olingan 2009-03-07.
  6. ^ Huang, C., Simon, P., Hsieh, S., & Prevot, L. (2007) Xitoycha so'z segmentatsiyasini qayta ko'rib chiqish: tokenizatsiya, belgilarni tasniflash yoki so'zlarni identifikatsiyalash
  7. ^ Bumbulis, P .; Kovan, D. D. (1993 yil mart - dekabr). "RE2C: Ko'p qirrali skaner generatori". Dasturlash tillari va tizimlari bo'yicha ACM xatlari. 2 (1–4): 70–84. doi:10.1145/176454.176487. S2CID  14814637.
  8. ^ Bash uchun qo'llanma, 3.1.2.1 Qochish belgisi
  9. ^ a b v "3.6.4 hujjatlari". docs.python.org.
  10. ^ Effektiv o'tish, "Nuqta-vergul "
  11. ^ "Go-dagi vergullar ", golang-nut", Rob 'Commander' Pike, 12/10/09

Manbalar

  • C # va Java bilan kompilyatsiya qilish, Pat Terri, 2005 yil, ISBN  032126360X
  • Algoritmlar + Ma'lumotlar tuzilmalari = Dasturlar, Niklaus Virt, 1975 yil, ISBN  0-13-022418-9
  • Tuzuvchi qurilishi, Niklaus Virt, 1996 yil, ISBN  0-201-40353-6
  • Sebesta, R. V. (2006). Dasturlash tillari tushunchalari (Ettinchi nashr) 177 bet, Boston: Pirson / Addison-Uesli.

Tashqi havolalar