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?
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:
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:
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.