📖 Scenario: You are learning how a simple SLR(1) parser works by building its key components step-by-step. This parser will analyze a small grammar to decide if input strings belong to the language.
🎯 Goal: Build the basic parts of an SLR(1) parser: grammar rules, FOLLOW sets, parsing table, and the final parsing action setup.
📋 What You'll Learn
Create a dictionary for grammar productions with exact keys and values
Create a dictionary for FOLLOW sets with exact keys and values
Create a dictionary for the SLR(1) parsing table with exact keys and values
Add the final parsing action variable with the exact value
💡 Why This Matters
🌍 Real World
SLR(1) parsing is a fundamental technique used in compilers to analyze source code and check if it follows the grammar rules of a programming language.
💼 Career
Understanding SLR(1) parsing helps software engineers and compiler developers build efficient parsers, which are essential for language design, interpreters, and tools that process code.
Progress0 / 4 steps
1
Define the Grammar Productions
Create a dictionary called grammar with these exact productions: 'S' : ['CC'], 'C' : ['cC', 'd'].
Compiler Design
Hint
The grammar dictionary keys are non-terminals and values are lists of their productions.
2
Set Up FOLLOW Sets
Create a dictionary called follow with these exact FOLLOW sets: 'S': ['$'], 'C': ['c', 'd', '$'].
Compiler Design
Hint
FOLLOW sets show which terminals can appear after a non-terminal.
3
Create the SLR(1) Parsing Table
Create a dictionary called parsing_table with these exact entries: {(0, 'c'): 's3', (0, 'd'): 's4', (1, '$'): 'acc', (2, 'c'): 's3', (2, 'd'): 's4', (3, 'c'): 's3', (3, 'd'): 's4', (4, 'c'): 'r2', (4, 'd'): 'r2', (4, '$'): 'r2'}.
Compiler Design
Hint
The parsing table keys are tuples of (state, symbol) and values are actions like shift (s), reduce (r), or accept (acc).
4
Add the Final Parsing Action Variable
Create a variable called start_state and set it to 0.
Compiler Design
Hint
The start_state is the initial state of the parser's state machine.
Practice
(1/5)
1. What does the 1 in SLR(1) parsing represent?
easy
A. One grammar rule applied
B. One step shift operation
C. One reduction per state
D. One symbol lookahead during parsing
Solution
Step 1: Understand the meaning of lookahead in parsing
Lookahead means the parser looks at upcoming input symbols to decide the next action.
Step 2: Identify what the number 1 specifies in SLR(1)
The number 1 indicates the parser looks ahead by exactly one symbol to make decisions.
Final Answer:
One symbol lookahead during parsing -> Option D
Quick Check:
SLR(1) means 1 symbol lookahead [OK]
Hint: Remember: number in SLR(n) = lookahead symbols [OK]
Common Mistakes:
Confusing lookahead with number of grammar rules
Thinking it means one shift or reduction only
Assuming it refers to parser states
2. Which of the following is a correct component of the SLR(1) parsing table?
easy
A. ACTION and GOTO tables
B. PREDICT and FOLLOW tables
C. SHIFT and REDUCE stacks
D. FIRST and LAST tables
Solution
Step 1: Recall the structure of SLR(1) parsing tables
SLR(1) parsing uses two main tables: ACTION for parser actions and GOTO for state transitions.
Step 2: Identify the correct table names
Only ACTION and GOTO tables are part of the SLR(1) parsing table, others are unrelated or parts of grammar analysis.
Final Answer:
ACTION and GOTO tables -> Option A
Quick Check:
SLR(1) uses ACTION and GOTO tables [OK]
Hint: ACTION table decides moves; GOTO table changes states [OK]
Common Mistakes:
Mixing parsing tables with grammar sets like FIRST or FOLLOW
Confusing stacks with tables
Assuming PREDICT table exists in SLR(1)
3. Given the grammar:
S -> CC C -> cC | d
What is the correct ACTION for state 2 on input c in SLR(1) parsing?
medium
A. Reduce by C -> d
B. Shift to state 3
C. Accept input
D. Error
Solution
Step 1: Identify state 2's items and possible moves
State 2 likely has an item expecting c to continue parsing C -> cC, so it should shift on c.
Step 2: Determine the action for input c
Since c can start a new C, the parser shifts to state 3 to parse C -> cC.
Final Answer:
Shift to state 3 -> Option B
Quick Check:
Input 'c' leads to shift in state 2 [OK]
Hint: Shift on terminals that start productions [OK]
Common Mistakes:
Choosing reduce too early without checking lookahead
Confusing accept with shift
Assuming error when shift is valid
4. In an SLR(1) parser, a conflict occurs when: state 4 has both shift and reduce actions on the same input symbol. What is the likely cause?
medium
A. Grammar is not SLR(1) compatible
B. Parser table was built incorrectly
C. Lookahead symbol is missing
D. Input string is invalid
Solution
Step 1: Understand shift-reduce conflicts in SLR(1)
Shift-reduce conflicts happen when the parser cannot decide whether to shift or reduce on the same input symbol.
Step 2: Identify the cause of such conflicts
This usually means the grammar is not suitable for SLR(1) parsing, i.e., it is not SLR(1) compatible.
Final Answer:
Grammar is not SLR(1) compatible -> Option A
Quick Check:
Shift-reduce conflict = grammar not SLR(1) [OK]
Hint: Conflicts mean grammar is not SLR(1) compatible [OK]
Common Mistakes:
Blaming parser table construction errors
Thinking input string causes conflicts
Assuming missing lookahead causes conflict
5. You have the grammar:
E -> E + T | T T -> T * F | F F -> ( E ) | id
Why might SLR(1) parsing fail for this grammar, and what is a common solution?
hard
A. Grammar is left-factored; remove left recursion
B. Grammar lacks terminals; add more tokens
C. Grammar is ambiguous; use LALR(1) or LR(1) parsing
D. Grammar is too simple; add more productions
Solution
Step 1: Recognize the grammar type
This grammar is classic expression grammar with ambiguity due to operator precedence and associativity.
Step 2: Understand SLR(1) limitations
SLR(1) parsing often fails on ambiguous grammars because it cannot resolve conflicts with only one symbol lookahead.
Step 3: Identify common solutions
More powerful parsers like LALR(1) or LR(1) handle such grammars by using more precise lookahead and states.
Final Answer:
Grammar is ambiguous; use LALR(1) or LR(1) parsing -> Option C
Quick Check:
Ambiguous grammar needs stronger parser than SLR(1) [OK]
Hint: Ambiguous grammar needs LR(1) or LALR(1) [OK]
Common Mistakes:
Thinking adding tokens fixes ambiguity
Confusing left recursion removal with ambiguity
Assuming grammar simplicity causes failure
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.