Describing Balanced Parentheses
Parentheses in expressions, statement blocks, nested definitions, etc:
{{}{{{}{}}{}}}{}{{}{}}
The language of balanced (matched) parentheses (here: curly braces)
- at each point count number of open minus number of closed parantheses
- at every point the number must be non-negative
- at the end the number must be zero
Regular Language
Is there a finite automaton describing balenced parentheses?
- suppose there is an automaton with states
Context-Free Grammar
What is context-free grammar for balanced parantheses?
Example: deriving string
{{}} {} {{}{}}
Definitions:
- balanced = given by counting number of open parantheses so far
- derived = can be generated from S using rules of grammar
Questions:
- derived implies “has even length”? (induction on derivation)
- derived implies balanced? (induction on derivation)
- balanced implies derived? (induction on string length)
Two parse trees for previous example - ambiguity
Non-Ambiguous Context-Free Grammars
Non-ambiguous grammar for this example:
Observation:
S ::= F*
generates same strings as
S ::= "" | S F
and the same strings as
S ::= "" | F S
Non-ambiguous grammars:
- easier to parse
- subset of all context-free grammars
A particular form of non-ambiguous grammars: if by looking at current symbol we can decide which alternative to follow
- even smaller subset
- still more general than regular expressions
- sufficient as the basis for parsers within a compiler