Compiler Design/ Short trick to find the given grammar is (LL1) or not in Compiler Design In English
Compiler Design/ Short trick to find the given grammar is (LL1) or not in Compiler Design In English
Contents [hide]
- 0.1 How to Quickly Check if a Grammar is LL(1) – Compiler Design Short Trick
- 0.2 Quick Steps to Check if a Grammar is LL(1)
- 0.3 Step 1: Compute First Sets for Each Production
- 0.4 Step 2: Compute Follow Sets for Each Non-Terminal
- 0.5 Step 3: Apply the LL(1) Condition
- 0.6 Short Trick to Check LL(1) Grammar
- 0.7 Example to Check LL(1)
- 0.8 Step 1: Compute FIRST Sets
- 0.9 Step 2: Compute FOLLOW Sets
- 0.10 Step 3: Check LL(1) Condition
- 0.11 When is a Grammar NOT LL(1)?
- 0.12 Compiler Design/ Short trick to find the given grammar is (LL1) or not in Compiler Design In English
- 0.13 COMPILER DESIGN (R15A0512)
- 1
LL(1) Grammar in Compiler Design – Shortcut to Check
- 2
Shortcut to Check LL(1) Grammar
- 3
Step-by-Step Shortcut Method (With Trick)
- 4
Example 1: LL(1) Grammar
- 5
Example 2: Not LL(1) Grammar
- 6
Important Note:
- 7
Tips to Remember (Exam Trick)
How to Quickly Check if a Grammar is LL(1) – Compiler Design Short Trick
LL(1) Grammar is a type of context-free grammar (CFG) used in top-down parsing. To determine whether a given grammar is LL(1), follow this simple short trick based on First and Follow sets.
Quick Steps to Check if a Grammar is LL(1)
Step 1: Compute First Sets for Each Production
- FIRST(A) = Set of terminals that appear at the beginning of the derivations of A.
- If A → ε, then include FOLLOW(A) in FIRST(A).
Step 2: Compute Follow Sets for Each Non-Terminal
- FOLLOW(A) = Set of terminals that can appear immediately after A in some derivation.
- If the start symbol is S, then $ (End-of-input marker) is in FOLLOW(S).
Step 3: Apply the LL(1) Condition
For the grammar to be LL(1), it must satisfy the following condition for every non-terminal A:
For two productions A → α | β:
FIRST(α) ∩ FIRST(β) = ∅ (No common terminal symbols)
If ε ∈ FIRST(α), then FIRST(β) ∩ FOLLOW(A) = ∅
If the condition holds for all non-terminals, the grammar is LL(1).
Short Trick to Check LL(1) Grammar
Step 1: Compute FIRST & FOLLOW sets.
Step 2: Check if any FIRST sets overlap for a single non-terminal.
Step 3: If a production has ε, ensure FOLLOW(A) and FIRST(A) are disjoint.
Step 4: If all conditions hold, it is LL(1); otherwise, it is NOT LL(1).
Example to Check LL(1)
Example Grammar:
Step 1: Compute FIRST Sets
- FIRST(S) = {a, b}
- FIRST(A) = {a, ε}
- FIRST(B) = {b}
Step 2: Compute FOLLOW Sets
- FOLLOW(S) = { $ }
- FOLLOW(A) = { $ }
- FOLLOW(B) = { $ }
Step 3: Check LL(1) Condition
- FIRST(A) and FIRST(B) do not overlap
- A → ε, but FIRST(A) ∩ FOLLOW(A) = ∅
Since all conditions are satisfied, this grammar is LL(1).
When is a Grammar NOT LL(1)?
If FIRST(α) ∩ FIRST(β) ≠ ∅, the grammar is not LL(1).
If ε is in FIRST(A) but FIRST(A) ∩ FOLLOW(A) ≠ ∅, the grammar is not LL(1).
Would you like a practice problem or more examples?
Compiler Design/ Short trick to find the given grammar is (LL1) or not in Compiler Design In English
COMPILER DESIGN (R15A0512)
Here’s a clear and shortcut method (trick) to check whether a given grammar is LL(1) or not, useful for Compiler Design topics in GATE, university exams, and interviews.
LL(1) Grammar in Compiler Design – Shortcut to Check
What is LL(1) Grammar?
-
L = Scan input Left to right
-
L = Produce Leftmost derivation
-
1 = Use 1 token lookahead
LL(1) grammars are top-down parsable with a single lookahead symbol using a predictive parser (like recursive descent).
Shortcut to Check LL(1) Grammar
To check if a grammar is LL(1), ensure the following:
Condition 1: FIRST/FIRST Conflict
-
For every non-terminal with multiple productions,
→ FIRST sets of the alternatives must not intersect.
Check:
If A → α | β
Then: FIRST(α) ∩ FIRST(β) = ∅
→ No common terminals
Condition 2: FIRST/FOLLOW Conflict (when ε is involved)
-
If any production derives ε,
Then:FIRST(ε-production) ∩ FOLLOW(non-terminal) = ∅
Check:
If A → α | ε
,
Then: FIRST(α) ∩ FOLLOW(A) = ∅
→ No overlap between FIRST and FOLLOW
Step-by-Step Shortcut Method (With Trick)
Step 1: Compute FIRST set for all alternatives
Look at all RHSs of each non-terminal.
Step 2: Check for FIRST/FIRST Conflict
-
If same terminal appears in multiple FIRST sets →
Not LL(1)
Step 3: Check for ε in FIRST
-
If yes, then do:
-
Compute FOLLOW of that non-terminal
-
Check for FIRST/FOLLOW Conflict
-
Step 4: If no conflicts, grammar is LL(1)
Example 1: LL(1) Grammar
FIRST(S) = {a, b} → disjoint →
No ε → no need to check FOLLOW LL(1)
Example 2: Not LL(1) Grammar
FIRST(aA) = a, FIRST(aB) = a →
FIRST sets intersect → Not LL(1) Not LL(1)
Important Note:
FIRST sets of RHSs are disjoint | FIRST sets overlap |
ε in FIRST → check FOLLOW conflict too | FIRST(ε) ∩ FOLLOW(non-terminal) ≠ ∅ |
One parsing table entry per [Non-Terminal, Terminal] | Multiple entries in parsing table |
Tips to Remember (Exam Trick)
-
Same starting symbol in two productions? → Usually NOT LL(1)
-
Epsilon involved? → Check FOLLOW
-
Intersecting FIRST sets? →
-
Parsing Table Conflicts? →
Not LL(1)
Would you like:
-
A solved parsing table example?
-
A PDF cheat sheet for FIRST/FOLLOW?
-
Practice grammar questions for LL(1)?
Let me know!