String 使用PDA,显示(x*y)和#x2B;x是一个有效字符串
如果你能帮助我,并解释它是如何做的,我对C部分有困难。提前谢谢你 (a)据我所知,他们只是要求改写语法:String 使用PDA,显示(x*y)和#x2B;x是一个有效字符串,string,math,logic,discrete-mathematics,pushdown-automaton,String,Math,Logic,Discrete Mathematics,Pushdown Automaton,如果你能帮助我,并解释它是如何做的,我对C部分有困难。提前谢谢你 (a)据我所知,他们只是要求改写语法: <E> -> <E> + <T> <E> -> <E> - <T> <E> -> <T> <T> -> <T> * <F> <T> -> <T> / <F> <T> -> <
<E> -> <E> + <T>
<E> -> <E> - <T>
<E> -> <T>
<T> -> <T> * <F>
<T> -> <T> / <F>
<T> -> <F>
<F> -> (<F>)
<F> -> x
<F> -> y
->+
-> -
->
-> *
-> /
->
-> ()
->x
->y
(b) 他们想要(x*y)+x的导数:
(---x
/ /
/ /
/ /
-- -- -- -- -- *
/ \ \
/ \ \
/ \ \
--+)--y
\
\
\
----x
(c) 我们可以定义一个NPDA,它不确定地将所有有效的派生推送到堆栈上,然后弹出输入以接受。堆栈将如下所示:
stack input remaining
Z (x * y) + x
<E>Z (x * y) + x
<E>+<T>Z (x * y) + x
<T>+<T>Z (x * y) + x
<F>+<T>Z (x * y) + x
(<E>)+<T>Z x * y) + x
<E>)+<T>Z x * y) + x
<T>)+<T>Z x * y) + x
<T>*<F>)+<T>Z x * y) + x
<F>*<F>)+<T>Z x * y) + x
x*<F>)+<T>Z x * y) + x
*<F>)+<T>Z * y) + x
<F>)+<T>Z y) + x
y)+<T>Z y) + x
)+<T>Z ) + x
+<T>Z + x
<T>Z x
<F>Z x
xZ x
Z (empty)
剩余的堆栈输入
Z(x*y)+x
Z(x*y)+x
+Z(x*y)+x
+Z(x*y)+x
+Z(x*y)+x
()+zx*y)+x
)+Z x*y)+x
)+Z x*y)+x
*)+Z x*y)+x
*)+Z x*y)+x
x*)+zx*y)+x
*)+Z*y)+x
)+Z+y+x
y) +zy+x
)+Z)+x
+Z+x
Z x
Z x
xZ x
Z(空)
请阅读并参考您可以在此处询问的主题。我投票将此问题作为离题题结束,因为它与编程无关。IIRC,“PDA”在此上下文中表示下推自动机。我投票将此问题作为离题结束,因为它是CS理论问题,在cs.stackexchange.com上哪个更合适?奇怪的问题。要使用PDA,你必须先定义一个,不确定它如何显示任何东西的有效性。
stack input remaining
Z (x * y) + x
<E>Z (x * y) + x
<E>+<T>Z (x * y) + x
<T>+<T>Z (x * y) + x
<F>+<T>Z (x * y) + x
(<E>)+<T>Z x * y) + x
<E>)+<T>Z x * y) + x
<T>)+<T>Z x * y) + x
<T>*<F>)+<T>Z x * y) + x
<F>*<F>)+<T>Z x * y) + x
x*<F>)+<T>Z x * y) + x
*<F>)+<T>Z * y) + x
<F>)+<T>Z y) + x
y)+<T>Z y) + x
)+<T>Z ) + x
+<T>Z + x
<T>Z x
<F>Z x
xZ x
Z (empty)