Òåîðèÿ è ïðàêòèêà êîìïèëëÿöèè ïðîãðàìì: ëåêñè÷åñêèé àíàëèç Çàîñòðîâíûõ Àðñåíèé Þðüåâè÷ Ìîñêîâñêèé ôèçèêî-òåõíè÷åñêèé óíèâåðñèòåò ãîñóäàðñòâåííûé óíèâåðñèòåò ÌÔÒÈ, 27 îêòÿáðÿ 2012 ãîäà Ïîëîæåíèå ëåêñè÷åñêîãî àíàëèçà òîêåí Èñõîäíûé òåêñò ËÅÊÑÅÐ ÏÀÐÑÅÐ Ñåìàíòè÷åñêèé àíàëèç lex ÒÀÁËÈÖÀ ÑÈÌÂÎËΠÀ.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 2 / 26 Òîêåí, ëåêñàìà è øàáëîí Òîêåí ïàðà: èìÿ è, îïöèîíàëüíî, ïðèêðåïë¼ííîå çíà÷åíèå. Èìÿ ýòî ýëåìåíò íåêîòîðîãî êîíå÷íîãî ìíîæåñòâà. Ëåêñåìà ïîñëåäîâàòåëüíîñòü çíàêîâ, ñîîòâåòñòâóþùàÿ îïðåäåë¼ííîìó òîêåíó. Øàáëîí îïèñàíèå âñåõ ëåêñåì, ñîîòâåòñòâóþùèõ òîêåíàì ñ îäíèì è òåì æå èìåíåì. À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 3 / 26 Ïðèìåðû Èìÿ òîêåíà Øàáëîí Ëåêñåìû BOOLEAN #t èëè #f #t, #f LPAREN ( èëè [ (, [ SYMBOL íàáîð áóêâ è öèôð, ñîäåð- alala, 3k34dk, if, let æàùèé áóêâó NUMBER íåïóñòîé íàáîð öèôð è 32, 0.0, .121, 3.14 òî÷êè STRING âñ¼, êðîìå " îêðóæ¼ííîå " SPACE íåïóñòàÿ "ìå÷òû" "error" ïîñëåäîâàòåëü- íîñòü ïðîáåëîâ À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 4 / 26 Àòðèáóòû òîêåíîâ (format #t ∼a 18.3) ( LPAREN ) ( SYMBOL, èíäåêñ format â òàáëèöå ñèìâîëîâ ) ( SPACE ) ( BOOLEAN, true ) ( SPACE ) ( STRING, èíäåêñ ∼a â òàáëèöå ñòðîê ) ( SPACE ) ( NUMBER, 18.3 ) ( RPAREN ) À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 5 / 26 Ëåêñè÷åñêèå îøèáêè Íåêîòîðûå îøèáêè ëåêñåð íå ñïîñîáåí îáíàðóæèòü, íàïðèìåð: I (let ((a 3))) a) I (/ 1 2) → → ëèøíÿÿ ñêîáêà íåïðàâèëüíûé òèï Îäíàêî íåêîòîðûå, ìîæåò: I "abcd I 13a → h EOF i→ íåçàêîí÷åííàÿ ñòðîêà íåäîïóñòèìàÿ êîíñòðóêöèÿ â Ñè Òàêèå îøèáêè êàê ïðàâèëî ñèãíàëèçèðóþòñÿ êîãäà íè îäèí øàáëîí íå ìîæåò îòûñêàòü ëåêñåìó â òåêñòå À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 6 / 26 Âîññòàíîâëåíèå ïîñëå îøèáîê Ïàíèêà Èãíîðèðîâàíèå âñåõ ïîñëåäóþùèõ çíàêîâ. Äî êîíöà ôàéëà, ëèáî äî íåêîòîðîãî çíàêà (íàïðèìåð ïðîáåëà) Äîãàäêà Óäàëåíèå îäíîãî çíàêà èç âõîäíîãî ïîòîêà, Âñòàâêà íàäîñòàþùåãî çíàêà âî âõîäíîé ïîòîê Çàìåíà îäíî çíàêà äðóãèì Ïåðåñòàíîâêà äâóõ ñîñåäíèõ çíàêîâ è ïîâòîðíàÿ ïîïûòêà íàéòè ëåêñåìó. À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 7 / 26 Îáùèé ìåõàíèçì àíàëèçà Ëåêñåð ñ÷èòûâàåò è çàïîìèíàåò ïî îäíîìó çíàêó. Êîãäà èíôîðìàöèè ñòàíîâèòñÿ äîñòàòî÷íî, îí ïåðåäà¼ò ïàðñåðó î÷åðåäíîé òîêåí. Èíîãäà ëåêñåðó òðåáóåòñÿ çíàòü ïîñëåäóþùèå ñèìâîëû, ÷òîáû îïðåäåëèòü òåêóùèé òîêåí. Íàïðèìåð: I  Fortran: DO 5 I = 1.25 ↔ DO 5 I = 1,25 I  Ñè: -, <, = Äëÿ ýòîãî ïðèìåíÿåòñÿ äâóõáóôåðíàÿ ñõåìà. À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 8 / 26 Îïðåäåëåíèÿ Àëôàâèò êîíå÷íîå ìíîæåñòâî çíàêîâ. Îáîçíà÷èì ßçûê íàáîð ñòðîê çíàêîâ èç àëôàâèòà Σ. Σ. Ãðàììàòèêà íàáîð ïðàâèë, âûäåëÿþùèé èç âñåõ ïîñëåäîâàòåëüíîñòåé àëôàâèòíûõ çíàêîâ, ñòðîêè ïðèíàäëåæàùèå ÿçûêó. Ôóíêöèÿ çíà÷àíèÿ L(e) = M ÿçûê M ñîîòâåòñòâóþùèé ãðàììàòèêå e. Ãðàììàòèêà çàäà¼ò òîëüêî îäèí ÿçûê. Íî ÿçûê ìîæåò áûòü îïðåäåë¼í íåñêîëüêèìè ãðàììàòèêàìè. L(e) - èíúåêöèÿ. À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 9 / 26 Ðåãóëÿðíûå ãðàììàòèêè Çàäàþò ÿçûêè, âêëþ÷àþùèå: I Ïóñòóþ ñòðîêó ε: { } èëè ∅ Σ : {a }, {b } A + B = {a|a ∈ A} ∪ {b|b ∈ B} Êîíêàòåíàöèÿ: AB = {ab|a ∈ A ∧ b ∈ B} S i A , {A0 = ε, Ai = A . . . A i ðàç} Ïîâòîðåíèå: A*= I Îäèíî÷íûå ñèìâîëû èç àëôàâèòà I Îáúåäèíåíèå: I I i≥0 Êîíòåêñòíî-ñâîáîäíûå <B<C>> >> a; I C++ øàáëîí: A a; I C++ ñäâèã: C Çàäàþòñÿ ðåãóëÿðíûìè âûðàæåíèÿìè Çàäàþòñÿ êîí÷åíûìè àâòîìàòàìè À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 10 / 26 Ðåãóëÿðíûå âûðàæåíèÿ Áàçà: ε: L(ε) = {∅} a ∈ Σ: L(#\a) = {”a”} I Ïóñòàÿ ñòðîêà I Îäèí ñèìâîë Êîìïîçèöèÿ: L(A + B) = L(A) ∪ L(B) L(AB) S = {ab|a ∈ L(a) ∧ b ∈ B} L(A∗ ) = Ai I Îáúåäèíåíèå: I Êîíêàòåíàöèÿ: I Ïîâòîðåíèå: i≥0 Ðàñøèðåíèÿ: + ∗ I I I A = AA A? = A + ε Ak = AA · · · A} | {z k ðàç À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 11 / 26 POSIX íîòàöèÿ ““ ≡ ε “abc 00 ≡ {“a00 }|{“b 00 }|{“c 00 } (A) ≡ A A|B ≡ A + B AB . ≡ Σ\{ïåðåâîä ñòðîêè } [abc] ≡ “a“|“b“|“c“ [j − p] ≡ {âñå âêëþ÷èòåëüíî [∧ ...] ≡Σ A{n} ≡ áóêâû êîäû êîòîðûõ ëåæàò ìåæäó j è p } êðîìå [...] An A{n, m} ≡ An + An+1 + · · · + Am A{, m} ≡ A{0, m}; A{n, } ≡ An A∗ À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 12 / 26 Ïðèìåðû Öèôðà: '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9' ≡ [0 − 9] + Öåëîå íåîòðèöàòåëüíîå ÷èñëî(Z0 ): Öåëîå ÷èñëî(Z ): Äåñÿòè÷íîå äðîáíîå ÷èñëî: Èäåíòèôèêàòîð â Ñè: À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 13 / 26 Ïðèìåðû Öèôðà: '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9' + Öåëîå íåîòðèöàòåëüíîå ÷èñëî(Z0 ): ≡ [0 − 9] [0 − 9]+ Öåëîå ÷èñëî(Z ): Äåñÿòè÷íîå äðîáíîå ÷èñëî: Èäåíòèôèêàòîð â Ñè: À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 13 / 26 Ïðèìåðû Öèôðà: '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9' + Öåëîå íåîòðèöàòåëüíîå ÷èñëî(Z0 ): 0 0 + Öåëîå ÷èñëî(Z ): − ?[0 − 9] ≡ [0 − 9] [0 − 9]+ Äåñÿòè÷íîå äðîáíîå ÷èñëî: Èäåíòèôèêàòîð â Ñè: À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 13 / 26 Ïðèìåðû Öèôðà: '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9' + Öåëîå íåîòðèöàòåëüíîå ÷èñëî(Z0 ): 0 0 + Öåëîå ÷èñëî(Z ): − ?[0 − 9] Äåñÿòè÷íîå äðîáíîå ÷èñëî: 0 −0 ?[0 ≡ [0 − 9] [0 − 9]+ − 9]∗0 .0 [0 − 9]+ Èäåíòèôèêàòîð â Ñè: À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 13 / 26 Ïðèìåðû Öèôðà: '0'|'1'|'2'|'3'|'4'|'5'|'6'|'7'|'8'|'9' + Öåëîå íåîòðèöàòåëüíîå ÷èñëî(Z0 ): 0 0 + Öåëîå ÷èñëî(Z ): − ?[0 − 9] Äåñÿòè÷íîå äðîáíîå ÷èñëî: Èäåíòèôèêàòîð â Ñè: À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) 0 −0 ?[0 ≡ [0 − 9] [0 − 9]+ − 9]∗0 .0 [0 − 9]+ [a − zA − Z _][0 − 9a − zA − Z _]∗ Ëåêñè÷åñêèé àíàëèç 2012 13 / 26 À èìïëåìåíòàöèÿ? Äëÿ ñòðîêè s è âûðàæåíèÿ e, À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç s ∈ L(e)? 2012 14 / 26 Êîíå÷íûé àâòîìàò Âõîäíîé àëôàâèò Σ Êîíå÷íûé íàáîð ñîñòîÿíèé S qi Íà÷àëüíîå ñîñòîÿíèå n∈S n Íàáîð êîíå÷íûõ ñîñòîÿíèé F ⊆S qk Íàáîð ïåðåõîäîâ èç ñîñòîÿíèÿ a s1 ∈ S â ñîñòîÿíèå s2 ∈ S ïî âõîäó a ∈ Σ: s1 → − s2 a s1 s2 À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 15 / 26 Òàáëèöà è äèàãðàììà ïåðåõîäîâ a q1 c q3 c b d q0 q5 b d q2 b À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) a q4 q0 q1 q2 q3 q4 q5 Ëåêñè÷åñêèé àíàëèç a b c d ∅ ∅ q4 q3 ∅ ∅ q1 , q2 ∅ q2 ∅ ∅ ∅ ∅ q3 ∅ q5 ∅ ∅ ∅ q4 ∅ ∅ q5 ∅ 2012 16 / 26 ìíîæåñòâåííûå è ε- ïåðåõîäû q3 a q0 ε q1 a q2 q5 a q4 À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 17 / 26 ÄÊÀ è ÍÊÀ Íå äåòåðìåíèðîâàííûé êîíå÷íûé àâòîìàò (ÍÊÀ) Êîíå÷íûé àâòîìàò, êîòîðûé ìîæåò îäíîâðåìåííî áûòü â íåñêîëüêèõ ñîñòîÿíèÿõ. Ìîæåò ñîäåðæàòü: ε-ïåðåõîäû ìíîæåñòâåííûå ïåðåõîäû ÍÊÀ êàê ïðàâèëî ëàêîíè÷íåå. Äåòåðìåíèðîâàííûé êîíå÷íûé àâòîìàò (ÄÊÀ) Êîíå÷íûé àâòîìàò, íàõîäÿùèéñÿ â êàæäûé ìîìåíò âðåìåíè òîëüêî â îäíîì ñîñòîÿíèè. Íå ñîäåðæèò: ε-ïåðåõîäû ìíîæåñòâåííûå ïåðåõîäû ÍÊÀ ìîæåò áûòü ïðåîáðàçîâàí â ÄÊÀ ïðèíèìàþùèé òîòæå ÿçûê. À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 18 / 26 Îáùàÿ ñõåìà ãåíåðàöèè ñêàíåðà Ëåêñè÷åñêàÿ ñïåöèôèêàöèÿ Íàáîð ðåãóëÿðíûõ âûðàæåíèé ÍÊÀ ÄÊÀ Òàáëè÷íàÿ èìïëåìåíòàöèÿ ÄÊÀ À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 19 / 26 Ïîñòðîåíèå ÍÊÀ äëÿ ðåãóëÿðíîãî âûðàæåíèÿ Àâòîìàòû äëÿ áàçîâûõ åëåìåíòîâ: ε (ïóñòàÿ ñòðîêà): q0 a∈ ε q1 Σ: q0 a q1 Îáùåå îáîçíà÷åíèå ÍÊÀ äëÿ âûðàæåíèÿ E E À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 20 / 26 Ïîñòðîåíèå ÍÊÀ äëÿ ðåãóëÿðíîãî âûðàæåíèÿ Êîìáèíàöèè: AB : ε A B A + B: B ε ε ε ε A À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 21 / 26 Ïîñòðîåíèå ÍÊÀ äëÿ ðåãóëÿðíîãî âûðàæåíèÿ A∗ : ε ε A ε ε À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 22 / 26 Ïðèìåð Âûðàæåíèå: (a + b ∗)c (Äëÿ óäîáñòâà, âåðøèíû ïîìå÷åíû) q1 ε q0 a q2 ε ε ε q3 ε q4 b ε q5 ε q7 ε q8 c q9 q6 ε À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 23 / 26 Ïðåîáðàçîâàíèå ÍÊÀ â ÄÊÀ ε-çàìûêàíèå ε-çàìûêàíèå Ìíîæåñòâî ñîñòîÿíèé ÍÊÀ, â êîòîðûå ìîæíî ïåðåéòè ε-ïåðåõîäîâ. ε εclosure(qi ) = {qi } ∪ {εclosure(qj )|∃qi → − qj } èç äàííîãî ïî öåïî÷êå Ïóñòü S ìíîæåñòâî ñîñòîÿíèé ÍÊÀ, s åãî íà÷àëüíîå ñîñòîÿíèå, F âñå êîíå÷íûå. Êàæäîå ñîñòîÿíèå ÄÊÀ (X) ýòî ïîäìíîæåñòâî (S) ñîñòîÿíèé ÍÊÀ. X ⊆S Íà÷àëüíîå ñîñòîÿíèå: εclosure(s) {X |X ∩ F 6= ∅} S ∃X → − Y ⇔ Y = εclosure(qi ), qi ∈ X Êîíå÷íûå ñîñòîÿíèÿ: Ïåðåõîäû: a qi À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 24 / 26 Ïðèìåð ïðåîáðàçîâàíèÿ ÍÊÀ â ÄÊÀ q1 ε q0 a q2 ε ε ε q3 ε q4 b ε q5 ε ε q7 c q8 q9 q6 ε Q2,7,8 a c c q0,1,3,4,6,7,8 b q9 c q3,4,5,6,7,8 À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç b 2012 25 / 26 Ïðèìåð ïðåîáðàçîâàíèÿ ÍÊÀ â ÄÊÀ q1 ε q0 a q2 ε ε ε q3 ε q4 b ε q5 ε ε q7 c q8 q9 q6 ε Q2,7,8 a c c q0,1,3,4,6,7,8 b q9 c q3,4,5,6,7,8 À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç b 2012 25 / 26 Ïðèìåð ïðåîáðàçîâàíèÿ ÍÊÀ â ÄÊÀ q1 ε q0 a Q2 ε ε ε q3 ε q4 b ε q5 ε ε Q7 c Q8 q9 q6 ε Q2,7,8 a c c q0,1,3,4,6,7,8 b q9 c q3,4,5,6,7,8 À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç b 2012 25 / 26 Ïðèìåð ïðåîáðàçîâàíèÿ ÍÊÀ â ÄÊÀ q1 ε q0 a Q2 ε ε ε q3 ε q4 b ε q5 ε ε Q7 c Q8 q9 q6 ε Q2,7,8 a c c q0,1,3,4,6,7,8 b q9 c q3,4,5,6,7,8 À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç b 2012 25 / 26 Ïðèìåð ïðåîáðàçîâàíèÿ ÍÊÀ â ÄÊÀ q1 ε q0 a Q2 ε ε ε q3 ε q4 b ε q5 ε ε Q7 c Q8 q9 q6 ε Q2,7,8 a c c q0,1,3,4,6,7,8 b q9 c q3,4,5,6,7,8 À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç b 2012 25 / 26 Òàáëè÷íàÿ èìïëåìåíòàöèÿ A a b c q1 q2 q3 q4 q3 ∅ ∅ ∅ q2 q2 ∅ ∅ q4 q4 q4 ∅ q3 c a c q1 (dene (go state input) b q4 c (let ((next (gethash '(state input)))) (if next (go next (move (forward input))) q2 #f ))) (dene (accept input) b (let ((rez (go n input))) (and rez (accepting? rez)))) À.Þ. Çàîñòðîâíûõ (ÌÔÒÈ) Ëåêñè÷åñêèé àíàëèç 2012 26 / 26