3-Syntax Analyzer PDF
3-Syntax Analyzer PDF
3-Syntax Analyzer PDF
Syntax Analyzer
if ( b == 0 ) a = b ;
if
abstract syntax tree
== = or parse tree
b 0 a b
Santanu Halder Compiler Design
3
Grammar
Definition:
Generally a grammar is represented as 4-tuples –
G = <V, T, P, S>
Where V = finite set of variables (or non-terminals)
T = finite set of terminal symbols
P = finite set of productions
S = Starting symbol
Example:
G = ({S}, {a, b}, {S→aSb, S→ab}, S)
What language does this grammar accept?
Example:
S→S1B
S1→aS1B
bB→bbbB
aS1b→aa
B→ϵ
Example:
S→S1B
S1→aS1B
bB→bbbB
aS1b→aa
B→ϵ
Example:
S→abc | aAbc
Ab→bA
Ac→Bbcc
bB→Bb
aB→aa | aaA
Example:
S→abc | aAbc
Ab→bA
Ac→Bbcc
bB→Bb
aB→aa | aaA
Example:
S→aSa
S→bSb
S→ϵ
Example:
S→aSa
S→bSb
S→ϵ
Finally –
P = { S→S1 | S2,
S1→AB, A→aAb | ε, B→bB | b
S2→CD, C→aC | a, D→aDb | ε }
a A B
b B b ϵ
S A B
S A B
Hence, P′ contains:
Original non-unit productions:
S→Aa
A→a | bc
B→bb
S A B
Hence, P′ contains:
Original non-unit productions:
S→Aa
A→a | bc
B→bb
The new rules:
S→a | bc | bb
A→bb
B→a | bc
S A B
Hence, P′ contains:
Original non-unit productions:
S→Aa
A→a | bc
B→bb
The new rules: Altogether,
S→a | bc | bb S→Aa | a | bc | bb
A→bb A→a | bc | bb
B→a | bc B→bb | a | bc
S A B
S A B
Hence V′ = {S, A}
So, P′ = {{ S→aS | A, A→a}
Example:
S → AS | a
A → SA | b
Example:
S → aAB | bBB | bB
A → aA | bB | b
B→b
E + E
id E + E
id id
E E
E + E E + E
id E + E E + E id
id id id id
E + E
id E * E
id id
E E
E + E E * E
id E * E E + E id
id id id id
E + T E + T
E + T F T T * F
T F id F F id
F id id id
id
Operator LR Parser
Precedence
Parser
LR(0) SLR(1) LALR(1) CLR(1)
a A B e
a A B e
A b c
a A B e
A b c
a A B e
A b c d
a A B e
A b c d
b a b b c d e
a A B e
A b c d A
b a b b c d e
a A B e A
A b c d A
b a b b c d e
a A B e A B
A b c d A
b a b b c d e
a A B e A B
A b c d A
b a b b c d e
$ LL(1)
E E→TE’ E→TE’
T T→FT’ T→FT’
F F→id F→(E)
( ) $
S S→(S) S→ε S→ε
Example:
Right Sentential Form Handle Reducing Production
id*id id F→id
F*id F T→F
T*id id F→id
T*F T*F E→T*F
Initial configuration:
Stack Input
$ w$
Acceptance configuration:
Stack Input
$S $
id + * $
id - ·> ·> ·>
+ <· ·> <· ·>
* <· ·> ·> ·>
$ <· <· <· -
id+id*id$ id + * $
id - ·> ·> ·>
ip + <· ·> <· ·>
* <· ·> ·> ·>
$ <· <· <· -
$ a id + id * id
id+id*id$ id + * $
id - ·> ·> ·>
ip + <· ·> <· ·>
* <· ·> ·> ·>
$ <· <· <· -
id a
$ id + id * id
id+id*id$ id + * $
id - ·> ·> ·>
ip + <· ·> <· ·>
* <· ·> ·> ·>
$ <· <· <· -
E
+ a
$ id + id * id
id+id*id$ id + * $
id - ·> ·> ·>
ip + <· ·> <· ·>
* <· ·> ·> ·>
$ <· <· <· -
id a E
+
$ id + id * id
id+id*id$ id + * $
id - ·> ·> ·>
ip + <· ·> <· ·>
* <· ·> ·> ·>
$ <· <· <· -
* a E E
+
$ id + id * id
id+id*id$ id + * $
id - ·> ·> ·>
ip + <· ·> <· ·>
* <· ·> ·> ·>
id a $ <· <· <· -
* E E
+
$ id + id * id
id+id*id$ id + * $
Id - ·> ·> ·>
ip + <· ·> <· ·>
* <· ·> ·> ·>
$ <· <· <· -
* a E E E
+
$ id + id * id
id+id*id$ id + * $
Id - ·> ·> ·>
ip + <· ·> <· ·>
E * <· ·> ·> ·>
$ <· <· <· -
E E E
+ a
$ id + id * id
id+id*id$ id + * $
E Id - ·> ·> ·>
ip + <· ·> <· ·>
E * <· ·> ·> ·>
$ <· <· <· -
E E E
$ a id + id * id
id+id*id$ id + * $
E Id - ·> ·> ·>
ip + <· ·> <· ·>
E * <· ·> ·> ·>
$ <· <· <· -
E E E
$ a id + id * id
I4 b
A→b.
0 s3 s4 2 1
1 acc
ept
2 s3 s4 5
3 s3 s4 6
4 r3 r3 r3
5 r1 r1 r1
6 r2 r2 r2
1 acc
ept
2 s3 s4 5
3 s3 s4 6
4 r3 r3 r3
5 r1 r1 r1
6 r2 r2 r2
3 s3 s4 6
4 r3 r3 r3
5 r1 r1 r1
6 r2 r2 r2
3 s3 s4 6
4 r3 r3 r3
5 r1 r1 r1
6 r2 r2 r2
3 s3 s4 6
Reduce by A→b means pop 2*|b|=2
symbols from stack which is here 4 and 4 r3 r3 r3
b. Then push A onto the stack and as 5 r1 r1 r1
the previous symbol is 3 in the stack,
then perform goto(3,A) which gives 6. 6 r2 r2 r2
Also push 6 onto the stack and don’t
forward the input pointer.
4 r3 r3 r3
5 r1 r1 r1
6 r2 r2 r2
5 r1 r1 r1
6 r2 r2 r2
5 r1 r1 r1
6 r2 r2 r2
9 0A2A5 $ 5 r1 r1 r1
6 r2 r2 r2
3. The goto transitions for state i are constructed for all nonterminals A using the
rule: If GOTO (Ii, A) = Ij , then GOTo[i, A] = j .
4. All entries not defined by rules (2) and (3) are made "error″.
5. The initial state of the parser is the one constructed from the set of items
containing [S'→.S] .