How to get the context-free grammar and its corresponding PDA ?

1k views Asked by At

I can't understand how can I solve this exercise.

I need to make a context-free grammar that can validate the following input :

L={w € (0,1,2)* | w= 2^n 0^(m+1) 1^(m+n) with n>=0, m>0}

How can I create the corresponding PDA?

I think that the language doesn't have prefix-property so the PDA can't accept by empty stack. Is it right?

1

There are 1 answers

3
Patrick87 On BEST ANSWER

Let's first try the grammar; then we'll make an automaton for it.

When making a CFG - any grammar, really, including regular expressions - it's helpful to know a few kinds of simple languages that the grammar could easily do. Context free grammars can pretty easily do anything a regular grammar can, and it can also match inputs. This means languages like a^n b^n, palindromes, matched parentheses, etc. are easy to do.

When looking at a problem like this, try to see which of these stereotypical languages, if any, all or part of strings in your language look like. In this case, it appears we have a variation on a^n b^n; we need to do this twice to accomplish the addition.

Let's start out with 0^(m+1) 1^m. Can we make a CFG for this? Well, sure; it's practically the same as a^n b^n. Here it is:

S := 0E
E := 0E1 | -

Now we need to address the n term: we should be able to add 2 to the left and 1 to the right, in equal number. This is also easy:

S := 2S1 | S'
S' := 0E
E := 0E1 | -

There you go. To get a CFG, you can easily build a bottom-up or top-down parser, according to the definition of these things. We'll try to make a PDA from scratch.

Our PDA needs to accept 2 in a loop, pushing each 2 on the stack. We will need to remember how many we saw, after all. When we see a 0, we should go to a new state, and keep accepting 0 in a loop, adding a 0 to the stack for each 0 seen in input. When we see a 1, we should go to a new state, and accept 1 in a loop, removing either 2 or 0 from the stack. If you get the implementation details right, you will be able to accept with empty stack in an accepting state separate from the first three.