Bird
Raised Fist0
Compiler Designknowledge~30 mins

Parser conflicts (shift-reduce, reduce-reduce) in Compiler Design - Mini Project: Build & Apply

Choose your learning style10 modes available
Understanding Parser Conflicts: Shift-Reduce and Reduce-Reduce
📋 What You'll Learn
💡 Why This Matters
🌍 Real World
Parser conflicts happen when a computer program that reads code cannot decide what to do next. Understanding these helps in designing better programming languages and tools.
💼 Career
Compiler developers and language designers must understand and resolve parser conflicts to create efficient and correct compilers.
Progress0 / 4 steps
1
Create the grammar rules list
Create a list called grammar_rules with these exact strings: 'S -> A a', 'S -> b A c', 'A -> d', 'A -> d e'.
Compiler Design
Hint

Use a Python list with strings exactly as shown.

2
Add the current input symbol variable
Create a variable called current_input and set it to the string 'd'.
Compiler Design
Hint

Just assign the string 'd' to the variable current_input.

3
Detect shift-reduce conflict
Write code that creates a variable shift_reduce_conflict and sets it to true if current_input is 'd' and 'A -> d' is in grammar_rules, otherwise false.
Compiler Design
Hint

Use a boolean expression combining current_input and membership in grammar_rules.

4
Detect reduce-reduce conflict
Create a variable reduce_reduce_conflict and set it to true if both 'A -> d' and 'A -> d e' are in grammar_rules, otherwise false.
Compiler Design
Hint

Check if both rules are present in the grammar_rules list.

Practice

(1/5)
1.

What is a shift-reduce conflict in parser design?

easy
A. When the parser cannot decide whether to read more input or apply a grammar rule
B. When the parser cannot decide which token to read next
C. When the parser cannot decide between two different grammar rules to apply
D. When the parser fails to recognize any input token

Solution

  1. Step 1: Understand shift and reduce actions

    In parsing, 'shift' means reading the next input token, and 'reduce' means applying a grammar rule to replace tokens with a non-terminal.
  2. Step 2: Define shift-reduce conflict

    A shift-reduce conflict happens when the parser must choose between shifting (reading more input) or reducing (applying a rule) but cannot decide which is correct.
  3. Final Answer:

    When the parser cannot decide whether to read more input or apply a grammar rule -> Option A
  4. Quick Check:

    Shift-reduce conflict = choice between shift or reduce [OK]
Hint: Shift-reduce = choose between reading input or applying rule [OK]
Common Mistakes:
  • Confusing shift-reduce with reduce-reduce conflict
  • Thinking it is about token recognition
  • Assuming it means parser failure
2.

Which of the following is a correct way to describe a reduce-reduce conflict?

easy
A. The parser cannot decide which of two grammar rules to apply at the same point
B. The parser cannot decide whether to shift or reduce
C. The parser cannot decide which token to shift next
D. The parser cannot decide how to tokenize the input

Solution

  1. Step 1: Understand reduce actions

    Reduce means applying a grammar rule to replace a sequence of tokens with a non-terminal symbol.
  2. Step 2: Define reduce-reduce conflict

    A reduce-reduce conflict occurs when the parser has two or more possible grammar rules to reduce by and cannot decide which one to apply.
  3. Final Answer:

    The parser cannot decide which of two grammar rules to apply at the same point -> Option A
  4. Quick Check:

    Reduce-reduce conflict = choice between two reductions [OK]
Hint: Reduce-reduce = conflict between two possible reductions [OK]
Common Mistakes:
  • Mixing reduce-reduce with shift-reduce conflict
  • Thinking it involves token shifting
  • Confusing it with lexical analysis errors
3.

Consider a parser encountering the input tokens id + id * id. If the grammar causes a shift-reduce conflict at the * token, what is the typical parser action to resolve this conflict?

medium
A. Reject the input due to ambiguity
B. Reduce immediately before reading the * token
C. Shift the * token to read more input before reducing
D. Ignore the * token and continue

Solution

  1. Step 1: Understand operator precedence in parsing

    Multiplication (*) has higher precedence than addition (+), so the parser should process id * id before adding.
  2. Step 2: Resolve shift-reduce conflict by shifting

    At the * token, the parser shifts (reads) the * to handle multiplication first, delaying reduction of addition.
  3. Final Answer:

    Shift the * token to read more input before reducing -> Option C
  4. Quick Check:

    Shift to handle higher precedence operator first [OK]
Hint: Shift on higher precedence operator to avoid premature reduce [OK]
Common Mistakes:
  • Reducing too early ignoring operator precedence
  • Rejecting input unnecessarily
  • Skipping tokens instead of shifting
4.

Given a grammar that causes a reduce-reduce conflict, what is a common way to fix this issue?

medium
A. Add more tokens to the input stream
B. Rewrite the grammar to remove ambiguity between rules
C. Ignore one of the conflicting rules during parsing
D. Increase the parser's stack size

Solution

  1. Step 1: Identify cause of reduce-reduce conflict

    Reduce-reduce conflicts arise from ambiguous grammar where two rules can apply at the same point.
  2. Step 2: Fix by rewriting grammar

    To fix, rewrite or refactor the grammar to remove ambiguity so only one rule applies at a time.
  3. Final Answer:

    Rewrite the grammar to remove ambiguity between rules -> Option B
  4. Quick Check:

    Remove ambiguity to fix reduce-reduce conflict [OK]
Hint: Fix reduce-reduce by rewriting ambiguous grammar [OK]
Common Mistakes:
  • Trying to fix by adding tokens
  • Ignoring conflicting rules without fixing grammar
  • Changing parser stack size which doesn't help
5.

You have a grammar with the following rules:
S -> A a | B a
A -> x
B -> x
Why does this grammar cause a reduce-reduce conflict when parsing input x a?

hard
A. Because S has no valid productions
B. Because the parser cannot decide whether to shift a or reduce x
C. Because a is missing from the input
D. Because both A and B can reduce x, causing ambiguity

Solution

  1. Step 1: Analyze the grammar rules

    Both A and B produce the same token x. So when the parser sees x, it can reduce it to either A or B.
  2. Step 2: Identify reduce-reduce conflict

    At the point of reducing x, the parser cannot decide which rule to apply, causing a reduce-reduce conflict.
  3. Final Answer:

    Because both A and B can reduce x, causing ambiguity -> Option D
  4. Quick Check:

    Same input reduces to two rules = reduce-reduce conflict [OK]
Hint: Same input reduces to multiple rules causes reduce-reduce conflict [OK]
Common Mistakes:
  • Confusing shift-reduce with reduce-reduce conflict
  • Thinking input is missing tokens
  • Assuming no valid productions exist
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard