Теория и практика компилляции программ - mipt-scheme

advertisement
Òåîðèÿ è ïðàêòèêà êîìïèëëÿöèè ïðîãðàìì:
ëåêñè÷åñêèé àíàëèç
Çàîñòðîâíûõ Àðñåíèé Þðüåâè÷
Ìîñêîâñêèé ôèçèêî-òåõíè÷åñêèé óíèâåðñèòåò
ãîñóäàðñòâåííûé óíèâåðñèòåò
ÌÔÒÈ, 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
Download