Лекция 13 Тақырыбы: Лексикалық анализ (сканер)
-
Лексемалардың түзілуі
-
Лексикалық анализатор типтері
-
Сканердің кестелермен жұмысы
1. Сканердің кірісінде қайсыбір алфавит символдарының тізбегі тұрады.(сканер үшін бастапқы программамыз осындай болып көрінеді) Кейбір символдар комбинацияларын сканер бір объект ретінде қарастыру мүмкін. Мысалы:
-
бір не одан көп пробелдер (бос орын) бір пробелмен ауыстырылады;
-
кілттік сөздер (Begin, end, integer) сияқтылар;
-
константаны білдіретін символдар тізбегі;
-
индентификатроды білдіретін символдар тізбегі;
Осылайша, лексикалық анализатор (ла) белгілі бір терминал
символдарды (яғни енуші символдар) бірдей синтаксистік объектілерге – лексемаларға топтаытырылады. Қарапайым жағдайда лексема бұл – мына түрдегі жұп <лексима типі, мәні > енуші тізбектерден лексемаларды белгілеп алу көбінесе коррект тілдің құрылымына тәуелді болады. Мынадай енуші тізбек “567АВ” қалай интеррпетация жасалынады? Бұл бір ғана лексема (индентификатор ) болуы мүмкін, 2 лексима да болуы мүмкін; “567” константа және “АВС” атау. Екінші жағдайда лексемалар арасына айыру белгісін қою керек (мысалы, пробел), не алдын ала бұдан кейін не келетіні мәлім болуы керек.
2. Лексикалық анализатор типтері.
Лексикалық анализатордың екі негізгі типі бар:
тура (ТЛА) және тура емес (ЕЛА).
Тура ЛА ағымдағы көрсеткіштің дәл оң жанында орналасқан лексеманы анықтап, көрсеткішті лексеманы құраған текст бөлігінен оңға қарай жылжытып қояды. (ТЛА көрсеткіштің оң жағындағы символдардан құралған лексема типін анықтайды).
Тура емес ЛА көрсеткіштің дәл оң жанында орналасқан белгілер берілген типтей лексеманы құрай ма, жоқ па соны анықтайды. Басқаша, айтқанда ол үшін алдын ала лексема типі беріледі және ол көрсеткіштің оң жағындағы символдарды анықтап, берілген типті қанағаттандыруын тексереді.
ТЛА – ң құрылымы күрделірек. –Ол ЕЛА –ға қарағанда көбірек амалдар орындауға міндетті. Бұған қарамастан, қазіргі программалау тілдерінің көбісінде тура лексикалық анализатор синтаксисі пайдаланылады. (Бұл тіл сөйлемдерінің сыртқы көрінісімен де байқалуы мүмкін).
Фортран- бұл тура емес лексикалық анализаторды қолданатын тілдердің классикалық үлгісі. Мәселе, бұл тілде пробелдің қолданылмауында. Мысалы, мынадай конструкцияны қарастыралық:
DO5I=1,10….
Бұл сөйлемді түсіну үшін тура емес лексикалық анализатор қажет. Ол былайша топшаланады: “DOS1” идентификатор не кілттік сөз “DO”, бұдан соң белгі – 5, әрі қарай – айнымалы атауы “І”
Мұндай келеңсіздіктер С не С++ сияқты тілдердің компиллорын дайындаушылар да кездеседі. С және С++ тілдерінде қатар комментарийлері “/*.....*/” және “//,,,,” белгілерімен жазылады.
Лексикалық анализ жүргізу барысында “/” символын кездестіріп, алдын ала оның не оператор не қатар комментарий екендігі белгісіз болады.
Жалпы, көп символды лексемалар – анализ үшін оңай болмайды. Сонымен сканер шығысында – атаулардың, айыру белгілерінің және т.с.с ішкі арлық көрінісі. Мысалы: сканер кірісі: AVR:=B+CDE; // комментарий:
Сканер шығысы : 38, -8, 65, -2, 184.
(Егер біз меншіктеу операторын “:=” – 8кодты санмен, қосу амалын –2 санымен, айнымалы атауларын 38, 65 және 184 сандарымен белгілеуге келіссек).
3.Бұдан бөлек сканер түрліше типтегі кестелер құрумен айналысады. Ең алдымен атаулар кестесі. Мұнда ол танылған атауларды – идентификатор, константа, белгілер т.с.с ендіріп отырады.
Кестелермен жұмыс.
Атаулар кестесі төменде келтірілген кестеге ұқсас құрылымға ие:
Элемент номері
|
Идентификатор
|
Қосымша мәлімет
(типі, көлемі т.с.с)
|
1
|
А
|
Идентификатор, тип = қатар
|
...
|
...
|
...
|
п
|
3.1415
|
Константа, сан
|
Кестемен жұмыс істеу механизмі төмендегілерді қамтамасыз етуі қажет:
-жаңа идентификатор және ол туралы мәліметті жылдам тіркеу;
- мәліметті жылдам табу;
Лекция 14, 15 Тақырыбы Лексикалық талдауды программалау. Lex талдау конструкторы -
Lex туралы жалпы мәлімет
-
Регуляр өрнекті жазу
-
Lex енуші тіліндегі программа
1. Lex туралы жалпы мәлімет. Регуляр өрнектерді жазу
Lex – бұл сканерлерді (лексикалық анализаторларды) генерациялауға арналған программа. Енуші тілде лексемалардың регуляр өрнектер терминіндегі сипаттамалары бар. Lex-ң жұмысының нәтижесі – бұл Си тіліндегі программа, бұл программа yyin файлын (әдетте бұл стандартты енгізу не кіріс) оқып, символдар қатарын (лексемалар) ажыратады.
Lex-ң енуші тілінде регуляр өрнектерді жазу жолын қарастырайық. Lex-ң алфавиті ЭВМ қолданылатын алфавитпен сәйкес келеді. Арнайы символдар (соның ішінде + - * ? () [] {} | ^ $ <>) арнайы \ префиксінен кейін жазылады. Бұдан бөлек, Си тіліндегі символдарды кодтаудың барлық тәсілдері қолданылады. Символдар мен тізбектерді тырнақшаға алуға болады. Мысалы, а «а» \а – а символын кодтаудың үш тәсілі \n \t \007 «continue».
Символдар классын беру мүмкіндігі бар:
[0-9] немесе [0123456789] – кез-келген цифр
[A-Z a-z] – кез-келген әріп
[^ 0-7] – сегіздік цифрлардан бөлек кез-келген цифр
. - \n-нен бөлек кез-келген цифр
2. Регуляр өрнекті жазу
Регуляр өрнекті жазу грамматикалары
(ең маңыздыларынан бастап төмен қарай)
:
* - 0 немесе одан көп қайталау
:
+ - 1 не одан көп қайталау
:
? – міндетті емес фрагмент
:
- конкатенация
:
{m,n} - m-нен n-ге дейінгі қайталау
:
{m} - m ретқайталау
:
{m,} - m не одан көп қайталау
: ^
- қатар басындағы фрагмент
:
$ - қатар соңындағы фрагмент
:
|
- өрнектердің ішіндегі кез-келгені
:
/
- бірініші өрнек, егер одан кейін екіншісі бар болса
:
- жақшалар, топтастыру үшін қолданылады.
Мысал:
[A-Za-z] ([A-Za-z 0-9] {0,7}) – C тіліндегі идентификатор
^#””*define - C тілінде # define басы
3. Lex енуші тіліндегі программа
Lex енуші тіліндегі программа 3 бөлімнен тұрады, олар %% белгісімен ажыратылады:
Сипаттау
%%
Ережелер
%%
Программалар
Сипаттау бөлімінде макросимволдар (метасимволдар) анықтамасы мына түрде жазылады:
<атау><өрнек>
Егер регуляр өрнектің текстінде <атау> кездессе онда ол <өрнекке> алмастырылады. Егер сипаттау қатары пробелден (бос орыннан) басталса немесе % {…} % жақшаларына алынған болса, онда ол шығушы файлға жай ғана көшіріліп қойылады.
Ережелер бөлімінде мына түрдегі қатарлар жазылады:
<өрнек>{<әрекет>}
Әрекет – бұл С тіліндегі программа фрагменті, ол <өрнекке> сәйкес тізбекті кездестірген кезде орындалады. Осы бөлімнің бас жағында өрнексіз берілген әрекет талдау басталғанға дейін орындалады. Lex енуші ағыннан ең ұзын тізбекті бөліп алуға тырысады. Егер бірнеше ереже бірдей ұзындықтағы тізбекті беретін болса, онда бірінші ереже қолданылады.
Мысалы, «123» тізбегі үшін мына ережелер бойынша талдау жасау кезінде бірінші ереже қолданылады, ал «123.» тізбегіүшін үшіншісі қолданылады.
[0-9]+
(\ + | \ -)?[0 - 9]+
(\ + | \ -)?[0 - 9] + ”.” [0 - 9]+
Егер ережелердің ешқайсысын қолдана алмаса, онда енуші символ yyout –қа көшіріледі. Егер көшірілуі керек болмаса, ережелердің соңына мысалы мынадай қатарды қосып қоюға болады:
. {/*ештеңе істемеу*/}
\n{}
Прграмма бөлімінде С тілінде жазылған программа тексті жазылады. Бұл текст шығушы файлға түгел көшіріледі. Әдетте бұл бөлімде yywrap() функциясы жазылады, ол автомат енуші файлдың аяғына жеткен уақыттағы әрекетті анықтайды. Функция нольден басқа мән қайтарса, талдау аяқталады, ноль қайтарылса талдау жалғасады (жалғастырудын бұрын yyin сияқты қайсы бір файлды ашу керек).
КА кестесінің интерпретатаоры yylex() атауына ие. Егер әрекеттердің бірінде return опреаторы орындалса (yylex()-ң нәтижесі операторда көрсетілгенмен сәйкес келеді) немесе файл соңына жетсе және yywrap() мәні 0-ден өзгеше болса (yylex()-ң мәні 0-ге тең), онда автомат өз жұмысын аяқтайды.
4. Lex-ң арнайы конструкциялары мен функциялары
Төменде Lex-ң арнайы конструкциялары мен функциялары берілген
ууlengf – осы тізбектің ұзындығы
yyless(n) – тізбектің соңғы n символын енуші ағымға қайтару;
yymore() – ағымдағы тізбектен кейін келесі символдарды yytext буферге алу;
yyunput(c) – с байтын енуші ағынға орналастыру.
ECHO – ағымдағы тізбекті yyout-қа көшіру
ТАРАУ 4. Синтаксистік талдау
Достарыңызбен бөлісу: |