Giáo trình môn học Trình biên dịch - Chương 2: Trình biên dịch đơn giản
scanner: phaân tích töø vuïng; parser: phaân tích cuù phaùp; emit: taïo daïng
xuaát cuûa token; symbol: xaây döïng baûng danh bieåu vaø thao taùc vôùi
baûng danh bieåu baèng insert vaø lookup; init: caát caùc töø khoùa vaøo baûng
danh bieåu; error: thoâng baùo loãi.
Moâ phoûng 2.3. Löôïc ñoà dòch tröïc tieáp cuù phaùp cuaû G sau khi ñöôïc boû
ñeä quy traùi: start → list eof
list → exp ; list | ∈
exp → term Rest1
Rest
1 → + term {print (‘+’)} Rest1 | ∈
| - term {print (‘-’-)} | ∈
term → factor Rest
2
Rest
2 →* factor {print (‘*’)} Rest2
l/ factor {print (‘/’)} Rest2
| div factor {print (div’)} Rest2 | ∈
| mod factor {print (mod’)} Rest2 | ∈
factor → (exp)
| id {print (id.lexeme)}
| num {print(num.
42 trang |
Chia sẻ: huongthu9 | Lượt xem: 485 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Giáo trình môn học Trình biên dịch - Chương 2: Trình biên dịch đơn giản, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
CHÖÔNG 2
TRÌNH BIEÂN DÒCH ÑÔN GIAÛN
2.1. Toång quaùt
2.2. Ñònh nghóa cuù phaùp
Vaên phaïm phi ngöõ caûnh (PNC) ñöôïc ñònh nghóa:
G2 = (Vt, Vn, S, P)
P : A → α1 | α2 ||αn
Thí duï 2.1. Cho vaên phaïm G:
P: list → list + digit
| list – digit
| digit
digit → 0 |1| 2 | |9
Boä phaân tích
töø vöïng
Boä bieân dòch tröïc
tieáp cuù phaùp
Chuoãi tokenChuoãi kyù töï Maõ trung gian
Hình 2.1. Caáu truùc trình bieân dòch “front end”
Thí duï 2.2. Vaên phaïm mieâu taû phaùt bieåu hoãn hôïp begin end cuûa Pascal
P : block → begin opt_stmts end
opt_stmts→ stmt_list |€
stmt_list → stmt_list ; stmt | stmt
- Caây phaân tích
Söï khoâng töôøng minh
Thí duï 2.3. Vaên phaïm G sau ñaây laø khoâng töôøng minh:
P : string → string + string | string – string | 0 | 1 | ... |9
Caâu 9 – 5 + 2 cho hai caây phaân tích:
stringstring
string
string
string
string
Hình 2.2 Hai caây phaân tích cuûa caâu 9 – 5 + 2
+
9 5
string
string
-
5
string
string
2
-
a)
2 +9
b)
Söï keát hôïp cuûa caùc toaùn töû
Möùc öu tieân cuûa caùc toaùn töû: * vaø / coù möùc öu tieân hôn + , - . Döïa vaøo
nguyeân taéc treân chuùng ta xaây döïng cuù phaùp cho bieåu thöùc soá hoïc:
exp → exp + term | exp – term | term
term → term * factor | term / factor | factor
factor → digit | ( exp )
Löu yù: pheùp toaùn luõy thöøa vaø pheùp gaùn trong C laø pheùp toaùn keát hôïp
phaûi. Vaên phaïm cho pheùp gaùn nhö sau:
right → letter = right | letter
letter → a | b | | z
2.3. Söï bieân dòch tröïc tieáp cuù phaùp (Syntax-Directed Translation)
1. Kyù hieäu haäu toá
1) Neáu E laø bieán hoaëc haèng soá thì kyù hieäu haäu toá cuûa E chính laø E.
2) Neáu E laø bieåu thöùc coù daïng E1 op E2 vôùi op laø toaùn töû hai ngoâi thì
kyù hieäu haäu toá cuûa E laø E1’ E2’ op.
3) Neáu E laø bieåu thöùc coù daïng (E1) thì kyù hieäu haäu toá cuûa E1 cuõng laø
kyù hieäu haäu toá cuûa E.
Löu yù: Khoâng caàn coù daáu ñoùng, môû ngoaëc trong kyù hieäu haäu toá.
2. Ñònh nghiaõ tröïc tieáp cuù phaùp (Syntax-directed definition)
Vaên phaïm phi ngöõ caûnh vaø taäp luaät ngöõ nghiaõ seõ thieát laäp ñònh nghóa
tröïc tieáp cuù phaùp. Bieân dòch laø pheùp aùnh xaï töø nhaäp→ xuaát. Daïng
xuaát cuûa chuoãi nhaäp x ñöôïc xaùc ñònh nhö sau:
1. Xaây döïng caây phaân tích cho chuoãi x.
2. Giaû söû nuùt n cuûa caây phaân tích coù teân cuù phaùp X, X.a laø trò thuoäc
tính a cuûa X, ñöôïc tính nhôø luaät ngöõ nghóa. Caây phaân tích coù chuù thích
caùc trò thuoäc tính ôû moãi nuùt ñöôïc goïi laø caây phaân tích chuù thích
Toång hôïp thuoäc tính (synthesized attributes)
Thí duï 2.4. Cho vaên phaïm G coù taäp luaät sinh P:
Taäp luaät sinh Taäp luaät ngöõ nghóa
exp → exp + term exp.t ::= exp.t || term.t || ‘+’
exp → exp – term exp.t ::= exp.t || term.t || ‘-’
exp → term exp.t ::= term.t
term → 0 term.t ::= ‘0’
term → 9 term.t ::= ‘9’
exp.t ::= 95 – 2 +
exp.t ::= 95 –
exp.t ::= 9
termt ::= 9
termt.t ::= 5
termt ::= 2
9 - 5 + 2
Hình 2.3. Caây phaân tích chuù thích cho ñònh nghóa tröïc tieáp cuù phaùp
Löôïc ñoà dòch
Löôïc ñoà dòch laø vaên phaïm PNC, trong ñoù caùc ñoaïn chöông trình goïi laø
haønh vi ngöõ nghiaõ ñöôïc nhuùng vaøo veá phaûi cuûa luaät sinh.
Thí duï 2.5. Löôïc ñoà dòch cuûa vaên phaïm G:
Taäp luaät sinh Taäp luaät ngöõ nghóa
exp → exp + term exp → exp + term { print (‘+’)}
exp → exp – term exp → exp – term {print (‘-’)}
exp → term exp → term
term → 0 term → 0 {print (‘0’)}
.
term → 9 term → 9 {print {‘9’)}
exp
exp
term
term
exp
-
5
+
{print (‘-‘)}
term
{print (‘5‘)}
{print (‘+‘)}
2 {print (‘2‘)}
9 {print (‘9‘)}
Hình 2.4. Löôïc ñoà dòch cuûa caâu 9 – 5 + 2
Moâ phoûng 2.1. Giaûi thuaät depth- first traversals cuûa caây phaân tích
Procedure visit (n: node);
begin
for vôùi moãi con m cuûa n, töø traùi sang phaûi do
visit (m);
tính trò ngöõ nghiaõ taïi nuùt n
end;
2.4. Phaân tích cuù phaùp
1. Phaân tích cuù phaùp töø treân xuoáng
Thí duï 2.6. Cho vaên phaïm G:
type → simple ⏐↑ id ⏐ array [ simple] of type
simple → integer ⏐char ⏐num dotdot num
Haõy xaây döïng caây phaân tích cho caâu:
array [num dotdot num] of integer
typea)
typeb)
array [simple] of type
typec)
array [simple] of type
type
num dotdot num
array [simple] of
num dotdot num
Hình 2.6.Caùc
böôùc xaây döïng
caây phaân tích
theo phöông
phaùp töø treân
xuoáng cho caâu:
array
[numdotdot
num] of integer
d)
type
simple
typee)
array [simple] of
num dotdot num
type
simple
integer
2. Söï phaân tích cuù phaùp ñoaùn nhaän tröôùc
Daïng ñaëc bieät cuûa phaân tích cuù phaùp töø treân xuoáng laø phöông phaùp
ñoaùn nhaän tröôùc. Phöông phaùp naøy seõ nhìn tröôùc moät kyù hieäu nhaäp ñeå
quyeát ñònh choïn thuû tuïc cho kyù hieäu khoâng keát thuùc töông öùng.
Thí duï 2.8. Cho vaên phaïm G: P: S → xA A → z | yA
Duøng vaên phaïm G ñeå phaân tích caâu nhaäp xyyz
Baûng 2.1. Caùc böôùc phaân tích cuù phaùp cuûa caâu xyyz
Luaät aùp duïng Chuoãi nhaäp
S
xA
yA
A
yA
A
z
-
xyyz
xyyz
yyz
yz
yz
z
z
-
Thí duï 2.9. Cho vaên phaïm vôùi caùc luaät sinh nhö sau :
S → A | B A → xA | y B → xB | z
Baûng 2.2. Phaân tích cuù phaùp cho caâu xxxz khoâng thaønh coâng
Luaät aùp duïng Chuoãi nhaäp
S
A
xA
A
xA
A
xA
A
xxxz
xxxz
xxxz
xxz
xxz
xz
xz
z
- Ñieàu kieän 1 : A Æ ξ1 | ξ2 | ... |ξn
- Ñònh nghóa:
first (ξi) = {s | s laø kyù hieäu keát thuùc vaø ξ ⇒ s}
Ñieàu kieän 1 ñöôïc phaùt bieåu nhö sau :
A → ξ1 | ξ2 | ... | ξn
first (ξi) ∩ first (ξj) = ∅ vôùi i ≠ j
Löu yù: 1. first (aξ ) = {a}
2. Neáu A →α1 | α2 | | αn; thì
first (Aξ) = first (α1) ∪ first (α2) ... ∪ first (αn)
Thí duï 2.11. Cho vaên phaïm G coù taäp luaät sinh:
S → Ax A → x | ∈ vôùi ∈ laø chuoãi roãng
Baûng 2.3. Phaân tích caâu nhaäp : x
Luaät Chuoãi nhaäp
A
xx
x
x
x
-
Söï phaân tích thaát baïi
- Ñieàu kieän 2: first (A) ∩ follow (A) = ∅
Vôùi A →ξ1 | ξ2 | | ξn | ∈
Follow (A) ñöôïc tính nhö sau: Vôùi moãi luaät sinh Pi coù daïng
X → ξAη thì follow (A) laø first (η ).
ÔÛ thí duï 2.11 first (A) ∩ follow (A) = {x}
Löu yù vaên phaïm coù ñeä quy traùi seõ vi phaïm ñieàu kieän 1. Thí duï:
A → B | AB (2.1)
Vaäy first (A) = first (B) ; first (AB) = first (A) = first (B).
first (B) ∩ first (AB) ≠ ∅ vi phaïm ñieàu kieän 1.
Neáu söûa luaät (2.1) thaønh A →∈ | AB thì seõ vi phaïm ñieàu kieän 2.
Thí duï 2.12. Cho vaên phaïm nhö ôû thí duï 2.6, chuùng ta duøng phöông
phaùp phaân tích ñoaùn nhaän tröôùc ñeå phaân tìch caâu array[num dot dot
num] of integer (töï xem ôû trang 41).
Caùc thuû tuïc ñöôïc goïi khi sinh caây phaân tích cho caùc caâu thuoäc vaên
phaïm ôû thí duï 2.12.
2.5. Trình bieân dòch cho bieåu thöùc ñôn giaûn
Thí duï: exp → exp + term {print (‘+’)} (2.5)
exp → exp – term {print (‘-’)}
exp → term
term → 0 {print (‘0’}
.
term → 9 {print (‘9’}
Loaïi boû ñeä quy traùi:
exp → term rest
exp.t ::= term.t || rest.t
rest → + exp
rest.t ::= exp.t || ‘+’
rest → - exp
rest.t ::= exp.t || ‘-’
rest → ∈
term → 0
term.t ::= ‘0’
rest →∈
term → 0
term.t ::= ‘0’
term → 9
term.t ::= ‘9’
Vaên phaïm naøy khoâng phuø hôïp cho bieân dòch tröïc tieáp cuù phaùp.
Löôïc ñoà dòch:
exp → exp + term {print (‘+’)}
exp → exp –term {print (‘-’)}
exp → term
term → 0 {print (‘0’)}
..
term → 9 {print (‘9’)}
Loaïi boû ñeä quy traùi cho löôïc ñoà dòch:
exp → term rest
rest→ + term {print (‘+’)} | - term {print (‘-’)} | ∈
term → 0 {print (‘0’) }
.
term → 9 {print (‘9’)}
Caây phaân tích chuù thích cho caâu: 9-5 = 2 ôû tr.44
Chöông trình bieân dòch bieåu thöùc töø daïng trung toá sang daïng haäu toá:
procedure exp;
procedure match ( t : token );
begin if lookahead = t then
lookahead := nexttoken
else error
end;
procedure term ;
begin
if lookahead = num then begin
write ( num);
match (lookahead);
end
else error
end;
procedure rest;
begin
if lookahead = ‘ +‘ then begin
match (‘+‘); term;
write (‘+’);
end
else if lookahead = ‘-’ then
begin
match (‘-’); term; write(‘-’);
end;
end;
begin
term; rest;
end;
Toái ưu trình bieân dịch:
Đeå taêng toác doä bieân dòch ta thöïc hieân gôõ ñeä quy cuûa thuû tuïc rest:
procedure exp;
procedure term;
begin
:
end;
begin
term;
repeat
if lookahead = ‘+’ then
begin
match (‘+’); term; write(‘+’);
end
else if lookahead = ‘-’ then
begin
match(‘-’); term; write(‘-’)
end;
until (lookahead ‘+’) and (lookahead ‘-’);
end;
Hoaøn chænh chöông trình:
Chöông trình naøy bao goàm caû chöông trình ñoïc chuoãi nhaäp.
procedure exp;
procedure match (t : char);
begin
if lookahead = t then lookahead := readln (c);
else error
end;
procedure term;
begin
val (i,lookahead,e);
if e = 0 then begin
write (i);
match (lookahead );
end
else error;
end;{term}
begin
term;
repeat
if lookahead = ‘+’ then
begin
match (‘+’); term; write(‘+’);
end
else if lookahead = ‘-’ then
begin
match (‘-’); term; write(‘-’);
end;
until (lookahead ‘+’ ) and (lookahead ‘-’);
end; {exp }
begin
readln( c);
lookahead := c;
exp;
end;
2.6. Söï phaân tích töø vöïng
1. Loaïi boû khoaûng traéng vaø chuù thích
2. Nhaän bieát caùc haèng
3. Nhaän bieát danh bieåu vaø töø khoùa
Giao tieáp vôùi boä phaân tích töø vöïng
Hình 2.10. Nhaän daïng token cuûa boä phaân tích töø vöïng
i f a b > = 0 .. t > = 0 t .. > = 0 t h ..
ab>if ab>
2.7. Söï hình thaønh baûng danh bieåu
1. Giao tieáp vôùi baûng danh bieåu
Hai thao taùc vôùi baûng danh bieåu: insert (s,t) vaø lookup (s).
2. Löu giöõ töø khoùa
3. Hieän thöïc baûng danh bieåu
Baûng danh bieåu goàm coù baûng symtable vaø daõy lexemes.
Baûng symtable
lexptr token caùc thuoäc tính khaùc
0
1 1 div
2 5 mod
3 9 id
4 15 id
Daõy lexemes
Hình 2.11. Baûng danh bieåu
Moâ phoûng 2.2. Giaûi thuaät phaân tích töø vöïng
d i v EOS m o d EOS c o u n t EOS i EOS
Procedure lexan;
var lexbuf array [0..100] of char;
c : char; ngöng : boolean;
begin
repeat
read (c ); ngöng := true;
if (c = blank ) or (c = tab) then ngöng := false
else if c = newline then begin line := lineno + 1
ngöng := false;
end
else if c laø chöõ soá then
begin
val (i, c, e);
tokenval := 0;
while e = 0 do begin
tokenval := tokenval * 10 + i;
read (c);
val (i, c, e);
end;
typetoken := num;
end {laø soá}
else if c laø chöõ then begin
p := 0; b := 0;
while c laø chöõ hoaëc soá do
begin lexbuf [b] := c;
read (c);
b := b + 1;
if b => b_size then error
end; /* b size laø kích thöôùc toái ña cuûa lexbuf*/
lexbuf [b] := eos;
p := lookup (lexbuf);
if p = 0 then
p = insert (lexbuf, ID);
tokenval := p;
typetoken := symtable [p]. token; end
else if c = eof then begin
tokenval := none;
typetoken := done; {heát chöông trình nguoàn}
end
else begin
tokenval := none; typetoken := c;
end
until ngöng;
end;
2.8. Maùy tröøu töôïng kieåu choàng
t
t
t
pc
Hình 2.12. Maùy tröøu töôïng kieåu choàng vôùi vieäc thöïc thi bieåu thöùc
(5 + 11) * 7
Vuøng chæ thò Choàng Vuøng döõ lieäu
1 push 5 5 + 0 1
2 rvalue 2 11 11 2
3 + a) 7 3
4 rvalue 3 4
5 ∗ 16 ∗
6 .. 7
b)
112
c)
1. Chæ thò soá hoïc
2. Lvalue vaø Rvalue
Thí duï: i := i + 1
3. Thao taùc vôùi choàng
Caùc chæ thò: Lvalue, Rvalue, push v, pop, copy, :=
4. Bieân dòch cho bieåu thöùc
Thí duï: Bieân dòch phaùt bieåu gaùn:
day := (53*y) div 4 + (273 * m + 2) div 5 + d
chuyeån sang kyù hieäu haäu toá
day 53y * 4 div 273 m * 2 + 5 div + d + :=
dòch sang maõ maùy tröøu töôïng
5. Chæ thò ñieàu khieån trình töï
Caùc chæ thò bao goàm: label l, goto l, gotofalse l, gototrue l, halt.
6. Söï bieân dòch caùc phaùt bieåu
Thí duï: Phaùt bieåu if:
stmt→ if exp then stmt
out := newlabel
stmt.t ::= exp.t || ‘gotofalse’ out || stmt.t || ‘label’ out
ngöõ nghóa
vuøng chæ thò
Ñoaïn maõ cho exp
gotofalse out
Ñoaïn maõ cho stmt
label out
Ñoaïn maõ cuûa phaùt bieåu sau phaùt bieåu if
Hình 2.13. Maõ maùy tröøu töôïng cuûa phaùt bieåu if
7. Giaûi thuaät cuûa trình bieân dòch caùc phaùt bieåu
procedure stmt;
var out : integer;
begin
if lookahead = id then
begin emit (‘lvalue’, tokenval);
match (id); match (‘ := ‘); exp; emit (‘:=‘, tokenval)
end
else if lookahead = ‘if’ then
begin match (‘if’); exp;
out := newlabel;
emit (‘gotofalse’, out);
match (‘then’); stmt;
emit (‘label’,out)
end
else error
end;
2.9. Thieát keá trình bieân dòch ñôn giaûn
1. Ñaëc taû trình bieân dòch
start→ list eof
list→ exp ; list | ∈
exp → exp + term {print (‘+’)}
lexp – term {print (‘-’)}
| term
term → term * factor {print (‘*’)}
| term / factor {print(‘/’)}
| term div factor {print (‘div’)}
| term mod factor {print (‘mod’)}
| factor
factor → (exp) | id | num
init scanner
symbol parser error
emit
Bieåu thöùc ôû daïng trung toá
Bieåu thöùc ôû daïng haäu toá
Hình 2.14. Sô ñoà cuûa trình bieân dòch cho bieåu thöùc töø daïng trung toá
sang daïng haäu toá
2. Nhieäm vuï cuûa caùc chöông trình con cuûa trình bieân dòch
scanner: phaân tích töø vuïng; parser: phaân tích cuù phaùp; emit: taïo daïng
xuaát cuûa token; symbol: xaây döïng baûng danh bieåu vaø thao taùc vôùi
baûng danh bieåu baèng insert vaø lookup; init: caát caùc töø khoùa vaøo baûng
danh bieåu; error: thoâng baùo loãi.
Moâ phoûng 2.3. Löôïc ñoà dòch tröïc tieáp cuù phaùp cuaû G sau khi ñöôïc boû
ñeä quy traùi: start → list eof
list → exp ; list | ∈
exp → term Rest1
Rest1 → + term {print (‘+’)} Rest1 | ∈| - term {print (‘-’-)} | ∈
term → factor Rest2
Rest2 →* factor {print (‘*’)} Rest2
l/ factor {print (‘/’)} Rest2| div factor {print (div’)} Rest2 | ∈|mod factor {print (mod’)} Rest2 | ∈
factor → (exp)
| id {print (id.lexeme)}
| num {print(num.value)}
3. Giaûi thuaät cuûa trình bieân dòch
const bsize = 128; |para = 40;
none = ‘#’; plus = 43;
num = 256; minus = 45;
div = 257; star = 42;
mod = 258; slash = 47;
id = 259;
done = 260;
strmax = 999;
symax = 100;
type entry = record
lexptr : integer;
token : integer;
end;
str = string;
var tokenval : integer;
lineno : integer;
lookahead : char;
symtable : array [1..100] of entry;
lexbuf : string [bsize];
typetoken : integer;
lexemes: array[1..strmax] of char;
lastentry : integer;
lastchar : integer;
procedure scanner;
var t: char;
p, b, i: integer;
begin
read (t);
if (t = ‘ ‘ ) or (t = \t’) then
repeat read (t);
until (t ‘ ‘) and (t ‘\t’);
else if t = ‘\t’ then begin
lineno := lineno + 1;
read ( t );
end
else if t in [‘0’..’9’] then begin
val ( i,t,e);
tokenval := 0;
while e = 0 do begin
tokenval := tokenval *10 + I;
read (t);
val (i,t,e);
end;
typetoken := num;
end
else if t in [ ‘A’..’Z’,’a’..’z’] then
begin
p:= 0; b := 0;
while t in [‘0’..’9’,’A’..’Z’,’a’..’z’] do
begin lexbuf [b] := t;
read (t);
b := b + 1;
if (b > = bsize) then
error
end;
lexbuf [b] := eos;
p := lookup (lexbuf);
if p = 0 then p := insert ( lexbuf, id);
tokenval := p;
typetoken := symtable[p].token;
end
else if t = eof then typetoken := done
else begin
typetoken := ord (t);
read (t)
end;
tokenval := none;
end;
end; {scanner}
/*-----------------------*/
procedure parser;
procedure exp;
var t : integer;
procedure term;
var t : integer;
procedure factor;
begin
case lookahead of
|para : begin match ( lpara); exp;
match(rpara); end;
num : begin emit (num, tokenval); match (num)
end;
id : begin emit (id, tokenval );
match (id) end;
else error (‘ loãi cuù phaùp’, lineno);
end; {case}
end; {factor}
/*-----------------------------*/
begin {term}
factor;
while lookahead in [star, slash, div, mod] do
begin
t := lookahead;
match (lookahead);
factor; emit (t, none);
end;
end; {term}
begin {exp}
term;
while (lookahead = plus) or (lookahead = minus) do
begin
t := lookahead ; match (lookahead);
term; emit (t, none);
end; end;
begin {parser}
scanner; lookahead := typetoken;
while lookahead done do
begin exp; match (semicolon); end;
end; {parser}
/*-----------------------*/
procedure match (t : integer);
begin
if lookahead = t then begin
scanner;
lookahead := typetoken ; end
else error (‘ loãi cuù phaùp’, lineno);
end;
procedure emit (t : integer; tval : integer);
begin
case t of
plus, minus, star, slash : writeln (chr (t ));
div : writeln (‘div’);
mod : writeln (‘mod’);
num : writeln (tval);
id : wrteln (symtable[tval].lexptr^);
else writeln (chr (t). tval);
end;
end; {emit}
fuction strcmp (cp : integer; s: str) : integer;
var i, l : integer;
begin i := t; l := length (s);
while ( I < = l ) and (s[i] = lexemes [cp] do
begin
i := i + 1;
cp := cp + 1;
end;
if i > l then strcmp := 1
else strcmp := 0
end; {strcmp}
procedure strcopy (cp : integer; t : str);
var i : integer;
begin
for i := 1 to length (t) do
begin
lexemes [cp] := t [i]
cp := cp + 1;
end;
lexemes [cp] := eos;
end; {Strcopy}
function lookup (s : string) : integer;
var I, p: integer;
begin p := lastentry;
while (p > 0) and (Strcmp (symtable [p].lexptr ^ , s) = 0) do
p := p – 1;
lookup := p;
end; {lookup}
/*------------------- */
function insert (s : str; typetoken : integer) : integer;
var len: integer;
begin
len := length (s );
if (lastentry + 1 > = symax ) then error (‘baûng danh
bieåu ñaày’, lineno);
if (lastchar + len + 1 > = strmax ) then
error (‘daõy lexemes ñaày, lineno);
lastentry := lastentry + 1;
symtable [ lastentry].token := typyetoken;
symtable [latsentry].lexptr := @lexemes[lastchar + 1];
lastchar := lastchar + len + 1;
strcopy (symtable [latsentry].lexptr ^, s)
insert := lastentry;
end; {insert}
/*------------------*/
procedure init;
var keyword : array[1.3] of
record
lexeme : string [10]
token : integer;
end;
r, i : integer;
begin keyword [i].lexeme := ‘div’;
keyword [1].token := div;
keyword [2].lexeme:= ‘mod’;
keyword [2].token := mod;
keyword [3].lexeme := ‘0’;
keyword [3].token := 0;
r := 3;
for i := 1 to r do
p := insert (keyword [i].lexem, keyword [i].token);
end;
/*----------------*/
procedure error (m : str; lineno : integer);
begin writeln (m, lineno);
stop;
end;
/*----------------*/
begin {main}
lastentry := 0; lineno := 0; tokenval := -1;
lastchar := 0;
init;
parser;
end; {main}
Các file đính kèm theo tài liệu này:
- giao_trinh_mon_hoc_trinh_bien_dich_chuong_2_trinh_bien_dich.pdf