Syntax-Directed Translation in Compilers
Syntax-Directed Translation in Compilers
Compiler Design 1
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 2
Translation
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 3
Translation
Example
✫ ✪
have used subscript to differentiate between two instances of E.
Example: Calculator
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 6
Note
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 7
Note
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 8
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 9
E → E1 + T
{
[Link]=(char*)malloc(strlen([Link])+
strlen([Link])+4);
strcpy([Link], [Link]); strcat([Link], " ");
strcat([Link], [Link]);
strcat([Link], " + ");
free([Link]); free([Link]);
}
Again there is no side-effect
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 10
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 11
E → E1 + T
{
[Link] = newLoc();
codeGen(assignPlus, [Link], [Link], [Link]);
}
where assignPlusa means
[Link] = [Link] + [Link].
a This
is an example of an intermediate code generated from the source lan-
guage expression.
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 12
Note
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 13
Associating Information
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 14
Definition
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 15
Definition
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 16
Example
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 17
Note
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 18
Note
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 20
A Complete Example
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 21
0 : S′ → N $
1: N → SL
2: S → +
3: S → −
4: L → LB
5: L → B
6: B → 0
7: B → 1
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 22
Note
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 23
LR(0) Automaton
q0 : S ′ → •N $ N → •SL S → •+
S → •−
q1 : S ′ → N • $
q2 : N → S • L L → •LB L → •B
B → •0 B → •1
q3 : S → +•
q4 : S → −•
q5 : N → SL• L → L • B B → •0
B → •1
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 24
LR(0) Automaton
q6 : L → B•
q7 : B → 0•
q8 : B → 1•
q9 : L → LB•
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 25
S Action Goto
+ − 0 1 $ N S L B
0 s3 s4 1 2
1 Acc
2 s7 s8 5 6
3 r6 r6
4 r7 r7
5 s7 s8 r1 9
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 26
S Action Goto
+ − 0 1 $ N S L B
6 r5 r5 r5
7 r6 r6 r6
8 r7 r7 r7
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 27
Attributes of Non-Terminals
Definition or Action
0 : S′ → N Accept
1 : N → SL if ([Link] == ’-’) [Link]= - [Link];
else [Link] = [Link];
2: S → + [Link] = ’+’;
3: S → − [Link] = ’-’;
4 : L → L1 B [Link] = 2*[Link]+[Link];
5: L → B [Link] = [Link];
6: B → 0 [Link] = 0;
7: B → 1 [Link] = 1;
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 29
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 33
N [Link]=[Link]
S L1 [Link]=2*[Link] + [Link]
+ L2 B [Link]=1
[Link]=2*[Link]+[Link]
[Link]=0
[Link]=B.valL3 B 1
[Link]=1 B 0
✫ ✪
1
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 34
Synthesized Attribute
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 35
S-Attributed
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 36
Note
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 37
Exercise
1: N → L
2: L → LB
3: L → B
4: B → 0
5: B → 1
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 38
Exercise
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 39
Example
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 40
0 : S′ → N
1: N → SL
2: S → +
3: S → −
4: L → BL
5: L → B
6: B → 0
7: B → 1
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 41
Attributes of Non-Terminals
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 42
0 : S′ → N Accept
1 : N → SL if ([Link] == ’-’) [Link]=- [Link];
else [Link] = [Link];
2: S → + [Link] = ’+’;
3: S → − [Link] = ’-’;
4 : L → BL1 if([Link])
[Link]=pow(2,[Link])+[Link];
else [Link]=[Link];
[Link]=[Link]+1;
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 43
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 44
Example
Parse Tree
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 46
T L ;
double L , id
id
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 47
Note
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 48
SDDefinition
1 : D → T L; [Link] = [Link]
2: T → int [Link] = INT
3: T → double [Link] = DOUBLE
4 : L → L1 , id [Link] = [Link]
addSym([Link], [Link])
5 : L → id addSym([Link], [Link])
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 49
Inherited Attribute
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 50
S-Attributed Definitions
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 51
L-Attributed Definitions
L-Attributed Grammar
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 53
Rules
1 : D → T L; [Link] = [Link]
2: T → int [Link] = INT
3: T → double [Link] = DOUBLE
4 : L → L1 , id [Link] = [Link]
addSym([Link], [Link])
5 : L → id addSym([Link], [Link])
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 54
Note
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 55
Solution I
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 56
Solution II
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 57
1 : D → T L; initType([Link], [Link])
2 : T → int [Link] = INT
3 : T → double [Link] = DOUBLE
4 : L → L1 , id [Link] = L [Link] +
mklist(addSym([Link]))
5 : L → id [Link] =
mklist(addSym([Link]))
Read ‘+’ as append in the list.
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 58
Solution III
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 59
LR(0) Automaton
q0 : S → •D D → •T L; T → •int
T → •double
q1 : S → D•
q2 : D → T • L L → •L, id L → •id
q3 : T → int•
q4 : S → double•
q5 : D → T L•; L → L•, id
q6 : L → id•
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 60
LR(0) Automaton
q7 : L → L, •id
q8 : L → L, id•
q9 : D → T L; •
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 61
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 64
Note
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 65
Note
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 66
S → E$ { print [Link] }
E → E1 + T { [Link] = [Link] + [Link]}
E → T { [Link] = [Link]}
T → T1 ∗ F { [Link] = [Link] * [Link]}
T → F { [Link] = [Link]}
F → (F ) { [Link] = [Link]}
F → ic { [Link] = [Link]}
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 67
S → E$
E → T E′
E ′ → +T E ′
E′ → ε
T → FT′
T ′ → ∗F T ′
T′ → ε
F → (E)
F → ic
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 68
E0 .s = E1 .s + T1 .s E0
E1 .s = E2 .s + T2 .s
E1 T1 T1 .s = 4
+
T2 .s = 3
T2 F1 F1 .s = 4
E2 .s = 2 E2 +
F2 .s = 3
F2
T3 .s = 2 T3 ic [Link]=4
F3 .s = 2 F3 [Link]=3 ic
4
[Link]=2 ic 3
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 69
E0
T3 .s = 2 T3 E1′
T2 .s = 3
+ E2′
F3 .s = 2 F3 T2
T1 .s = 4
+ E3′
[Link]=2 ic F2 .s = 3 F2 T1
F1 .s = 4 ε
[Link]=3 ic F1
2
[Link]=4 ic
3
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 70
Note
E0
T3 .s = 2 T3 E1′ E1′ .i = T3 .s
T2 .s = 3 E2′ .i = E1′ .i + T2 .s
+ E2′
F3 .s = 2 F3 T2
T1 .s = 4
+ E3′ E3′ .i = E2′ .i + T1 .s
[Link]=2 ic F2 .s = 3 F2 T1
F1 .s = 4 ε
[Link]=3 ic F1
2
[Link]=4 ic
3
✫ ✪
4
Note
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 73
E0′ .s = E1′ .s
E0
E1′ .s = E2′ .s
T3 .s = 2 T3 E1′ E1′ .i = T3 .s
T .s = 3 E2′ .i = E1′ .i + T2 .s
+ 2 E2′
F3 .s = 2 F3 T2 E2′ .s = E3′ .s
T1 .s = 4
+ E3′ E3′ .i = E2′ .i + T1 .s
[Link]=2 ic F2 .s = 3 F2 T1
E3′ .s = E3′ .i
F1 .s = 4 ε
[Link]=3 ic F1
2
[Link]=4 ic
3
✫ ✪
4
E → T { E’.ival = [Link] } E ′
{ [Link] = E’.sval }
E ′ → +T { E1’.ival = E’.ival + [Link] } E1′
{ E’.sval = E1’.sval }
E ′ → ε { E’.sval = E’.ival }
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 75
T → F { T’.ival = [Link] } T ′
{ [Link] = T’.sval }
T ′ → ∗F { T1’.ival = T’.ival * [Link] } T1′
{ T’.sval = T1’.sval }
T ′ → ε { T’.sval = T’.ival }
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 76
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 77
Non Terminal
Term. + ∗ ( ) ic $
E E → T E′ E → T E′
T T → FT′ T → FT′
F F → (E) F → ic
E′ E ′ → +T E ′ E′ → ε E′ → ε
T′ T′ → ε T ′ → ∗F T ′ T′ → ε T′ → ε
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 78
Example
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 79
Left-most Derivation
1 E 10 → ic + ic ∗ ic T ′ E ′
2 → T E′ 11 → ic + ic ∗ ic ε E ′
3 → F T ′E ′ 12 → ic + ic ∗ ic
4 → ic T ′ E ′
5 → ic ε E ′
6 → ic + T E ′
7 → ic + F T ′ E ′
8 → ic + ic T ′ E ′
9 → ic + ic ∗ F T ′ E ′
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 80
Start
Parsing Stack Input Parsing Stack Input
$E ic + ic * ic $ $ E’ T’ F ic * ic $
$ E’ T ic + ic * ic $ $ E’ T’ ic * ic $
$ E’ T’ F ic + ic * ic $ $ E’ T’ * ic $
$ E’ T’ ic ic + ic * ic $ $ E’ T’ F * ic $
$ E’ T’ + ic * ic $ $ E’ T’ F ic $
$ E’ + ic * ic $ $ E’ T’ ic ic $
$ E’ T + + ic * ic $ $ E’ T’ $
$ E’ T ic * ic $ $ E’ $
End $ $
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 81
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 82
E0 .s = 14
E0
E1′ .i = 2
T1 .s = 2 T1 E1′ E1′ .s = 14
F1 .s = 2 F1 T1′
T1′ .i = 2 E2′ .i = 14
+ T2 E2′
T1′ .s = 2 E2′ .s = 14
T2 .s = 12
[Link]=2 ic
ε
F2 T2′ .i = 3 T2′
F2 .s = 3 T2′ .s = 12
ε
2
[Link]=3 ic ∗
F2 .s = 4 F3 T3′
T3′ .i = 12
T3′ .s = 12
3 ε
[Link]=4 ic
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 83
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 84
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 85
An Example
E → T { E’.ival = [Link] } E ′
{ [Link] = E’.sval }
The stack contains following records before the
E is expanded.
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 87
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 88
An Example
[Link]=E’.sv E’.iv=[Link]
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 89
An Example
[Link]=E’.sv E’.iv=[Link]
[Link]=E’.sv E’.iv=[Link] 2
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 90
An Example
[Link]=E’.sv E’.iv=[Link]
[Link]=E’.sv
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 91
Another Example
IS → if BE then S1 else S2 .
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 92
Attributes of Statement
IS → if BE l1=newLabel(), l2=newLabel()
then S1 [Link] = l1, [Link]=l2
else S2 . S1 .next = S2 .next = [Link]
[Link] = [Link] + l1’:’ +
S1 .code + l2’:’ + S2 .code
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 95
IS → if {l1=newLabel(),l2=newLabel()
[Link] = l1, [Link]=l2}
BE {S1 .next = [Link] }
then S1 {S2 .next = [Link] }
else S2 .
{[Link] = [Link] + l1’:’ +
S1 .code + l2’:’ + S2 .code}
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 96
Note
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 97
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 98
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 99
BE → { BE1 .true=l=newLabel()
BE1 .false = [Link] }
BE1 and
{ BE2 .true = [Link]
BE2 .false = [Link] }
BE2
{ [Link] = BE1 .code +
l’:’ + BE2 .code }
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 100
Note
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 101
Rules
1 : E → { putchar(’+’); } E1 + T
2: E → T
3: T → { putchar(’*’); } T1 ∗ F
4: T → F
5 : F → (E)
6 : F → ic {printf(" \%d ", [Link]);}
✫ ✪
Lect 9 Goutam Biswas
✬ ✩
Compiler Design 102
Note
✫ ✪
Lect 9 Goutam Biswas