You are on page 1of 43

Soumil nuswrite

Compilers
Day..
* Lexical Analysis (comparatively easy)
& Pauser (Syntax Analyzer)
⑰ Semantic analysis (easy)

⑦ Intermediate code
generator Fu
⑰ Code optimization. e

fremequisite
- -

⑦ theory of computation basic


knowle
⑦ Computer organisation and architecture

Lexical anahris

Phases ofCompiters
to entermediate
code generator
is the
frontend
Rest machine
dependent

compiler
* is used to connect a high level language to

a low level language ↓


languages
programming
code/assembly
machine

language we use
fine automata
at tokenizen
other roles include
(machine recognize
to

High level language patterne


demoning blank

E
when ever we

spaces, removing e
characters write a
code,
comments, etc
> Lexical Analysis
the
preprocessor
removed all the
(Tokenizer) header file and

euandan give the row code


the lexical as stream of
analyse output
e

au ~ characters to
towens Lexical Analyser
plenty.Amariseemed
9
the towers one
and
Tokens passed
turn

grammar of the
W
Syntax Analysis
particular language
(Paser)
symbol is checked and
a pause tree is
pabe syntax made.
anaho's
onputs for egi, y 274 =

[ mossee the thepane ↓


all mis
components
xS
with trl
cied
semantic ~
Pouse Pree 9d =
parse
anal's ↓
checks whether Semantic Analysis / tree

2+id
y
all variables
the

probeseen 9 apply
are we
This
outputs
Basically we actions
SPT what is
ides?
check for
logical File (syntax addres
error
anman
directed
v
translation
I 2x:z a bAc
=
+

t=btc -
is
Tue is anothe Intermediate is
tz a t,
= + -

code generator
component z tz
=
- (iii)
that is connected
converts
his
to all the
the passe Basically means
components
is tree to
codes
at each leve
Error Handler true address true could be
v atmost 3
It takes one
addines
of a
kindof
Code optimization
clocal or scobal optimization)

v
Load store

9 organization3 E 3
machine
computer Taut code
generator dependent

Assembly code / Machine code


Lexical Analysis 00
--

[Lexer, Pohenizer, Scannes


① Lexical is Pokenization.
enization: first
task
of analysis

So, we know thatlexical analysis accepts a stream


of
characters and convents it endividual tokens.

Pokens

/1 *
identifies
jaciables
constants special
keywords

separations]
+, -,
20,30,40 character

2,5,,,,,,, Reserved &, A,r


keywords

② Give error messager's second task


of lexical analysis is
giving error messages of
any

/ Imapuesas
Exceeding character
length string

③ Eliminate comments, white spaces (nobs,


blanc
spare
hones

⑭ which machine is used for identifying tokens?


finite machines, DFA ONFA, is used for identifying to end.
Token
count one

3
Now most would
of us

3
that
stop here saying
the question cannot
y z;
n =
+

inx,y,z; be solved as the

print ("sum" d*d", n); syntax is wrong.

9 Butlexical analysis
just converts the

Ans: -26 stream


of characters
to tokens.
*

maxony = =1+ 1 =
5
=

pouef(1v.dy"9,b);
325
-

Aus: 25

mains2 and a
char"bo";14
It ( 0;
=
20

⑭ d yz"126=

-n/comment */E =405:32


3 33 ↳ This gets connected
a
to blank
space
-

by the lexical analyses

finding fint)and
how
fishA) allterminalspresent
contains firstpayone
on
is s-abcldefIsh
Fentions firstof s
i) First terminal) terminal
=

his First (z) = E


-
XS↓ In
abC def g

at at (90

few ample
more
capital denotes
is s-ABcIgniljur variables, small
denotes terminal
A -
a(b)c
from
2 3
we start
B- b
small inputs
D -
d

first(D): first (d) d


=

so,
first (B) first (b) b
=
=

>first (A) a,b,c


=

first(s) now
=
we know ABC is a

variable.

so, first (s) ->


first(ABC)

first (A)

a,b,c

first(shi) 9
then =

first (101) j
=

so, first (s) a, b, c,g,j


=

ii) S - ABC
first (c) 2,7, -E=

A- a(bl-z
first(B) c, d,
=
-2

B- cd)-E first (A) a,


=
b, E
c +

elf/-z first(s) first (A) a,b. -z


=
=
ii) ESTE but write
for the answer, we

#1 A 1
-
T

1E a,b and butI on


place of
2
9 F
-
+
1 A, making ofABC

+
-
-( 13' +

now, comply to B,
F -

iq(CE itis c, d, -

butwe add a, b, c, d to the


first(F) id, L =

answer and replace is with

first(4) 2,
=

2.
first(T) first(F) -Ba
=

So,
E,7
=

again a ->
e,f, E
first(E) 1, 2 =

first(TE) first(4) =
so, a, b, c, d, e,
f, E
is the final
firs (F) I +

answel.

zid,L

=Fr
x

Finding Follow()
FollowCA) contains set
of all terminals presentimmediate
'Al
on right of
Rules
&

i) Follow of start symbol is $


FOCA) 9$3
=

↑) 8- ACD
& there we directly start from RMS)
a- alb

so, for ACD, wefond follow (A which is c


and for C, first(C) a,b =

follow (D) Follow(s) because we


=

do not have other character


any
D.
after
and follow
of startis 'B'
his
5- asb3/53a5/s
theflows is
now supposewant
we

would be

checked.

follow (s,) =
$
follow (s) b
=
so, answer:
$ba
follow (ss) 2
=

follow (sy):
a

follow (35) =9 Note:Follow never contains E

Question:
->
S-AdAb/BbBa.
91 A - 2
is B- 2

You have to find the


folow of is and his min
the main statement.

so, follow (A) -


which eventually means point
to at

the start
of string.
now, a,b
fo(A):

follow (B) ->


b, a

Question:S- ABC suppose we want the


folds which is

A DIF
Ifirst(B)
-

3 + c 0
=

c G B with t
replace
-

so,
* G -
↓ Itbecomes AtC
B - > E
now intead of firstc
first(c), which
F
-> G we need

is -
itgoes to again
so,
which so, Act. On the night
fo(s)
is from
on $. of A, we don't have

anythin
Note:is if emmediate night in a terminal, return that.

is if variable, go
and
find the first of that
variable.

is if that variable was a


firstof a
replace it.

ins finally if there's no element


left on right
the

of desired variable,
the return
$.

⑧ Symbol - It is a character,antigen, etc.


es; a, b, c,d.---
1, 2, 3, 4, .---

+, ------

④ Apnab-set of characters is called alphabet. Devoted


by
E(signal

es, 90,17
=

set
of binars alphabets

E
2a, b,
=

. . . . .
I set
of all cowercase letters.

⑧ sting word-A string is a


femite setsequence
of symbols
chosen
from some
alphabets

es: a) 011IPOII0-> is a string word from


binary alphabets= So, y

symbol-alphabet-word/strong
⑦ Empty ng: The string
empty is the string with zero

occurences
of symbol (no symbols Devoted by t

⑦ reuth of us: No.


of symbols. by Denoted (w)
es;w=01010101 from binary
alphabet3 50,13 =

Coulfreeman (CFG)
CFG stands context formal
for the stammen. Itis a

which is used to
generate all
patterns
grammar
- - -

strings in given Fl
of
a

perminal
->
G (V,
=

T, P,5)

G ->
grammen, set
of production rules
is
It used to senate game 9

of terminal symbol. (lowercase)


-- Final set

[a, b, c, d...., +, -, #, %]
v-> Final
of
set non-terminal sermbols (upprase)
[A, B, S, E]
p -> setof production rules.
ways of expresenting
B- Et I

3 - As

3 - bla
p is used to replace non-terminal symboly
in
a string with other terminals of non-
terminals

-I start symbol.

Construct(FG for the
language having any no.
of as

over the set 2 907


-

a EU, T, P,
Et, a, aa,
L: aaa, aaaa...] =

53
no.
any of as

(R.Es)- at
Ramen Hu
seiens RE
->
IntheGEG:

-- as-is (replacings as]


with

----is t
(replacings with

let
emput: "aaaa"
drive [we want
devine
to

this

-> starting with's'


/
as S- as [rule]
I

aas S- as

3
aaas
S-aS
continue
adaas
intere
St as

aaaaa? 3- as

agacaas S- as

a aaaa a S-G
⑦ Construct a CFG for constant A
means
any multiple
- -
1: qwaw/where we (a,b)+ 3

reverse
stre
string
it
so, we can represent like:

LGaaGa, bab, abba, abbubba.... 3

Reverse taken

Now for contextthe grammar, take any inputand


the
drive that
input with
help of production, which
enturn mustbe generated.

the could be:


gramme
9/p: "abbabba"
--> asa-Y
3 - bsb -
(is
- - c -
(ii)

>-> as a

dabo from
I
abbsbb a from
I

from
Abbe
e
⑯ Construct CRG for:

L ay =
where us=1

=Gabb, aabbbb, aabbbbbb,.........3


↓ -
n1 =

↓ this
lets derive
productrules:
8- asbb
S-abb

Seagatetheen
so,

--

Deration
Derivation is a sequence of production rules. It
is used to

setis strings. During pausing, we have take


to two

decisions:

non-tuminal which
-> we have to decide the is
to be replaced.
->
to decide by
we have
production
the rule

counterminal would
which the be replaced.

⑦ We have two
options to decide which now-thminal
to be
placed. -
"Leftmostderivation
is Right most derivation.
eg; S-aABb

If leftmost would replace first


- we
"

if rightmost as

leftindeton

In the app
left most derivation, the is scanned and
the
replaced with
production rule
from leftto rent.
So, we have readip
to string from left-right.

es;
puon
well:

=
*
ETE enput: -a - bta

=
* E -
E

E a/b
=
the
leftmostderivation is:
m
E EE
=

b
-

a or
E E-E+E =

Ea =
-
Et E

Ea =
-
b+ E

E a
=
-
b a
+

Rigudeivatisiere:
taking theexample: 9/p a b a
= +
-

production rule the rightmost derivation:

=ETE = E
*
- E
*

=
* E -
E =
E- Et E

E a/b
= = E -

It a
m = E -
b 9
+

a or b
a
=
b a +
eip-abb wins both
leftmost and wirtmost
being CFG8

3- ABIE
A- a

B- sb

left
diction:
i
A

I
aB B
->

ab
aGbB
aby
=

absb

ab*b= abb

Right most derivation

3- ABIE "abb"
A- a
S
B- sb

i
A

Sb
&


cb
* A b
=


aBb

apbb
a bb
t )abb
=
① Derive:00101 win leftmost, rightmost with
CFG:
S- AIB

A- OAE
B- OB11B)E

leftmosivations
S

A 1B
di
OA 1 B


00A 1 B

001
B
00 t1B =S
v

0010
00101B
00101t H
=

Riptdon 00101
CFG - S
S- AIB A 1B

A- OAE 10 B
A

B- OB11B)E ↓

Alo
101t
A
2) 10
A I

0 A 10 I

00 A 10 I

0 0t 101 = 100 101
⑦ derive the
string "aabbabba"s-a/bA
A -
a(as/b A
B 3 b/bs/aBB
S
↳edition:
B
a

a a BB


aab
B
aa b b

aabba B

aabbab
aabb
abb
aa bb abba

Rimostation"gabbabba"
se a/bA
S
A -
a(as/b A
B 3 b/bs/aBB
a
BB
a a

aaBb
aaBb b A

aaBbb a

Gabswabb baee
Diction
Itis a graphical representation of the
derivation of the
given production rules for a given CFG. It is simple way
to show how the derivation can be done to obtain some

string from a given set


of production rules. Itis called

parse tree also

-> Pause tree follows the


precedence of operators.
The
deepestsublie traversed first

So, the operation


the
in
parentnode has less
precedence
over the
operation can
the subtres.

A
contain
pa people
follow the

->
the roofmode is always a mode andicating
startsymbols.

-> the derivation is read from right.


leftto

-> the terminal modes.


leaf mode is always

-> the
enterior nodes are always the non-terminal
modes.

example: ItE
*
9IP:aAb+ 2

= >
E E* E =

E =

albIC

stet 11E
set
a
+

**
I
+
⑦ ep= "bbabb"

CFG:

scosslal

= bo

⑦ CFG
-
Stabb e
aabbabba

B -
blbs/aBB
as
s
⑮ a

⑰ CFG:
R -> It R e) 9d Aid+id
&
- EAE

Y
E -(E)
2 id
-

its
the
added
+
I (id+id) ed

R -> It R

&
- EA E

E -(E)
-
E E

id
2
↓ ↓

,
-

id
(E)

(id + id)

Auguity amen
A said to be ambiguous if the exists
grammen is
more one:
than is leftmostderivation
is rightmostderivation
"s pause tree for a
given ip string

⑦ if the grammen was ambiguity, then it


is not good
for competer construction.

⑦ No method can
automatically detect and remove

the
ambiguity,butwe can remove ambiguity by
whole grammar without
re-writing the
ambiguity.

check if the
grammen has
ambighto
A- AA a (a) a a

A
-
> (A)
A- a

Lets try to make the theld.


pause

A and
I
& alwaus
S

/I favor

class
leftmost
devination
Gal

↳e
another
example
- A- AA a (a) (a) a

A
-
> (A)
A- a

*
A
12
A
A
A a
↓ A

↳an e
Unambiguous Gra
A grammar can be unambiguous if
the grammar dood
not
ambiguity thatmeans if
contain it does notcontain

properties of ambiguous grammen.


the

to connect an ambiguous grammer into


unambiguous
these aile:
gaman, we
follow

->
if
the
left associative operator ↳, -, A, 1) one used
on the apply left
production rule, then recusion
on the
production all

left recursion means thatthe leftmostsymbol


on the
eightside is same as the non-terminal
on the
left side.
*
->a
->
if
the
right associative operators (1) are used en

the
production rule, then apply right recursion
rule.
in the
production
Right recursion means thatthe eight mostsymbol
on the left side is same as non-thminal
the

on the right side.

x -> aX
-
-

⑦ cued if the
given grammar is ambigues:

S- ABlaa
A -
al Aa
-
3 b

Determine whither
the
gamman G is ambiguous or

not, if I is ambiguous, constructan unambiguous


Gammar equivalentto 6
ching foiguity

lets say we take string "aab"


the

i

voh,

A B
or

Ab
An ans

now, correctitto unambiguous


to
grammer,

S -> AB

A - Aala leftcension appri


B - b

⑧ Determine if the grammar is ambigmos, if yes,


make it unambiguous.

5- S S +

S- ed

Lets take the inputstring as- "ed+'did"

ss
e
is
a
a *In
to make it
unambigues,

3- s+ ed & sted3
S- id
-Now is
it
unambiguous

& CFG => 5 - St S


idtid id
2 - SAS
PIP=
3- ed Definitely ambismos,

to make itunambiguous,

S- S +T

3 - 7
7 - TA F
- F
7
F
-
id

long can'tI make it,


At
S- s+id
SAS Ad
S- Yd
Languagewaring system es
the

directive
all
HCL

-
Renaude
Prequocessor Topic
↓ main
our
compiler
- Hi->222

Assembler LLL ->MC
=>


Loader/lenber

Machine code

--

places ofpier.
- -
Synthesis
qually sis
(Machine dependent)
(Machine
andependent) Clanguage
independent)
Gangendants
phases -
-

HLL
-

Lexical analyzer tokens


->

S S

Staguals zu

7 L

>
semantics L
analyzer

Symbol generator
Fron
table Handler
v

entermediate

generator
code
>

code
optimize ↳
>

, codenzator
analy: Reads
Lex stream
the
of characters making
same
the & character into
the
up program gloup
meaningful sequences called levere.

Lexical analyzer represents these lexeveren the

form of tokens.

a b 12
=
+
a,b) identifier
-
-, operator
12 number
=>

Sy analy : Also called Tobene taken


from
pausing.
exical analyze one
paused.
the towers are taken as ilp and gives the

tree.
outputas pause

Semantanaly: itchecks whether the


pause the
constructed follow the culled
of the cansuage or not.

es; assisment of values is by compatible data

types.
as also
keeps and
track
of identifiers, then types
expressions.
sticrecord
a: ent
sum: atb
es., sun: double
↳:chan
11
-

this
is but semantically
syntactically conect

wrong. I I
-
does not
can be
represented follow
en pause compatibility
↑ ree
Interniated
gentor it is the representation
of final
the machine
lang code that is produced.
Itbridges the analysis &
synthes's phase of
translation.

Codetime it is med to optimise entermediat


the

code.
less
of runs fast takes
space

Code generator Pranslates the


intermediate code into

machine code.
relocatable
sea of langures
Cassembly
X

led
qualy th

Tokens
Lexical
sauce
->
analyze [
-Pauer
program
Getnext token
-
a

Sambal <
I table

crocompen
A cross
compiler is a compiler that
generates machine
code targeted to him
on a system differentthan
the one generating ot

the
process of creating executable code for different
machines is called y
Gross also
compiler is known as retargettable compiler.
es; GNUGCL

Bootstrapping
-
-

Itis used to
produce a
ting compiler
H
It is a
type of compile that

can compile its own source

code.

mechanized byauaged:
is source language(s)
is Payetlanguage (3)
is implementation language (I)

Bootstrapping is the process by which a


simple language
used
is to translate a complicated which en
program,
turn may handle an even more complicated
program and so on....

Assembly
languase
some ->

TL
-> compiler ->


pimplemented
language
17

same
deter
permed

Represented on:

S -> I
or
S
I
Shift RedParsing -

-> Atshiftaction, the currentsymbol in the


up string
as
pushed to a stack.

-> At symbol
reduction, the
each will replaced by the

non-terminals.

the
->
symbol is the rightside of the
production &
non terminal is the
left
side of the
production.

eX: Grammar
- -
Input
thing

59 st S a, -(a2 a3)+

5- 9 -
S

-- (S)
55 a

stack Actions
Ruput
$ &1 -(a2 a3) $
+

shift as

$a
-

(a2 93) +

I reduce 5- 9

$S
-

(a2+ 93)$ stift-


$5- (a2 x3)$ +

Shift (
$5- 6 92 93)$
+

shiftas
$s-(a2 +

az)$ reduce - a

$S-IS +

az)$ shift t

$ s-(St 93)$ shift as

$ S- [sta3 >$ reduces - a

$ S-(Sts >$ reduce S- S+s

$S-IS >$ shift I


S S-(s) I reduce 5 [S]
-

$ -- S $ Reduce S-S-S

$ S
$ Accept
CFG
-
I = 2E2
%/p: 32423
I 3E3
=

E =
4

stack Deput Action

$ 32423 $ shift 3
$3 2423$ switt2
I 32 423$ Shifty
$3z4 23$ reduce E4
=

32E
$
23$ scitt 2

$32 = 2
34 reduce &
= LE2

$
3F 3$ Shift 3

$3E3 I reduce R = 3E3

$ E
$ Accept
-

operator precedence
pausing ou

⑦ How check
to
if a
grammar is operation precedence
gammen!
-
there exists no
production rule which contains t
on RNS.
- there contains two
exists no
production rule which

non-theminal adjacent each


to other on RHS.

example

3
-
not
# EAE
-
(CES) -Eled operator
precedence
1 -
1 (x)/lv
+
-
after substitution,

it

EBE+E((E)1------ 3 heakes
operation precedence

pansien
-> add
$ symbol both
to ends of amput
->
scan the
ip string from lefts wisht until the

> is encompted.

->
scan towards leftover
all the
equal precedence
until firstleft most a is encountered.

->
everything blo leftmost and eintmost) is

handled.

->
I an
$ means pausing is successful.

precedence ed, a,bi - high


=>low
$

+ 3t

A
>A

adid
$A$
↳ accepted - ov

⑤ conside the
following glammen and construct

the
operator precedence pauses

E-EAE id
A s
- +
/*
i
check it
steps; couture is
operator precedence or

not

is Relation table

in Parse the
given tree

iv) Generate pause tree

first conventit operator


to
precedence gramme,
->
# ETEI EAE id
construct table. It comists of the Mumical symbols.

id + +
$
ed I -2 >

t L > >

A <> > >

< < A
$

& Next is very similar to shiftseduce


step parsel
only the precedence column is added

-> lets the


stry: ad red and
pace

->
# ETEI EAE id
Stasstrac
precedence Input ction
A

L idtedd $ shift id
id
Sed $

7 + ed*ed reduce -
L
$ E
↑ed*id$ shift t

$ It C id Ad
$ Shift ed
S It id > *
ed$ reduce -id
**d
Et
9) E L
$ reduce E -> It E

$ E L * Pd
I shiftA
$ EA L
ed$ shift ad
S & id 2 I reduce -id
$ EAR 2 I rednes E Et E
-

$ E A $ accept

now, draw tree looking at the above records.


a
pause

ak

"
type of pac
/ -
Bottom up parser
Down Parser
Pop
-predictive
Backtracking

pop dow par


the tree starting from root
process of construction
of pause
and proved daden
to is called TPP.
ie, from I and reach the
emputstring.
starting symbol

pop down


Recursive Descent

I
L

Backtracking Non-backtracking


Predictive
pauses

->
paser

-> op enternally uses left most derivation


-
TDP constructed for the
gramman if itis free from
ambiguity.

classification of TDP
with backtracking-but force
without
backtracking-predictive pause
Crecursive
(21
-

descent
Recursive
- -
Deposit
&
pause constructed from top
read L-R
8/p is from

emputis recentively pared for preparing a


pause
tree
with or without backtracking.

Backtracking
-

the
pace started from root
tree is mode a
elp string
is matched againstthe production ruled
for
replacing them.

es; letgrammar be!

S-> Ad
A- abld

Ed ->
Final string
have H
that
we get

·la
en

adname an

unitations,
-

Ste
->
If the given grammer
has more no
of
cdd alternatives, then

cost
of backtracking
is high.
fredie er/224) passen
-
- -


i nthe
wo
type of
descent
earned

structure
- -

4
butter
TE -
- Pauser ->
OP
I ~

Stace
Pausing Table

lobbabeade
↳use t

- voinally
a

it
accepts in grammer
devoted
as LLCK) letmost
Itis
demination
-
left
up from to
eight

& A
grammen is 22(1) if all
true two distinct
productions.
es;
1- x/p

comion: is for no teminal a It dove string

beginning with
a

At most

one
of x&p can derive
empty
string
then a
is i ptz does denive
not any

struly beginning with a terminal an

follow (A).
& Data structures used
by UP
-

is buffer
->
stack
table
parsing
-

construction of predictive (C

Finst2)/ leading (

Follow/Praiving 23

② predictive pouring table using first and follow


functions

⑦ Pause the
ip string with
the help of the table

---

Rules for calculating firsts)

First (a) is a set


of terminal symbol that
begins in

string derived from x.

For
Rule: a
production rule x-se

first (x) 2 6]
=

Duel:for any terminal symbol (as

first(as 593
=

Rules for a
production all,
x - Y,Y2Y3

calculating First (X)

i) D - AFirst (Y), First (Y)


First(y):
then

ii) if I C First (Y.), then


firstly)=(first(,)-t}U
First (Y2Y)
calculating First (Y2Ys)

It first (2) first (Y2's) Finst(Y2)


9
then =

if t -
first (2) first(43) Sfirst (x2) 13
then -

~ First (Y3]

Followcle
For
any production rule A
-xBp
if 4 First(B), then
->
follow (B) First
-
(p)
->
IfEC First follow (B) Epint(s)
(f) then =
-
t3
V Follow (A)

⑦ calculate the first and


follow for the given grammar:

3- A

A-s
aB/Ad
B- b

c +
9

the given grammar is having left recursion.

So, first remove leftreunion from the


given grammar.
aftle
->
eliminally leftrecursion

A
So
A- aB A now is the
this
A'-dH'IE new grammar.
B - b
c -
9
now, first (S) Finst(A)= 993
=
follow (s) = [$3
First (A)= 593
follows(A) Follow (s) 5$3
= =

First (A1) 3d, t3


=

Finst(B) 263
=

follow (AY) follow (A)= [$3


=

First (C) =
593
follow (BY 2 Al
now, follow (A)
has
E
So, according to the
mill

& first (A1)-t 3 UFollow (A)


[d,$3
olow (C)
↑ NA
=

production First Follow

S- A \a} -$3
A- ABA 393 943
A's d'It Ed,e} 545
B- b 9b3 5d,$}
2-
g 29} NA

its time to create table,


now, pause
the
rese

Enter
W
ift
C

these
ar

eas

here like
we fill the table this,
all is 8 and a
for example first for
that means first (s) is 993,

Now which rule gives you say, that


should be written

A first
of CA's is a also but then is no to
on
that came we need to clude follow.
stack
-
-
# production
-
-

S$ abd$ S-> A

$
A abd $ A- aBA
ABA'$ abd$ popa
BA bd $
$ 3 b
-

/b Al I Ad $ Pop b

Al
$ al A'-dAl
A A's /$ popd
Al $ $ n-st

$ I Accept.

S
a
b El

↳I areusable t

You might also like