Math 使用CFG进行乘法

Math 使用CFG进行乘法,math,context-free-grammar,context-free-language,Math,Context Free Grammar,Context Free Language,我正在尝试制作一个与下面的函数等效的CFG。我知道B是循环计数器,所以它可以是一系列推到堆栈上的元素,每次循环完成时,会弹出一个来自B的元素,如果B=Epsilon退出。如何处理while循环上半部分中的加法 PROCEDURE multiply a, b; VAR a, b, z; BEGIN z := 0; WHILE b > 0 DO BEGIN z := a + z; b := b - 1; END RETURN z; END; 虽然你

我正在尝试制作一个与下面的函数等效的CFG。我知道B是循环计数器,所以它可以是一系列推到堆栈上的元素,每次循环完成时,会弹出一个来自B的元素,如果B=Epsilon退出。如何处理while循环上半部分中的加法

PROCEDURE multiply a, b;
VAR a, b, z;
BEGIN
z := 0;
  WHILE b > 0 DO BEGIN
        z := a + z;
        b := b - 1;
  END
  RETURN z;
END;

虽然你当然可以用CSG来做,但是你不能用CFG来做。泵引理应该足以证明不可能

但是,如果b是固定的,那么很容易:

S ⇒ ε S ⇒ 0 S 1 1 … 1 (b times) 这将识别表单的字符串

0a1a·b
这是我能想到的CFG可以实现乘法的唯一意义。

哦,所以没有我必须保留的堆栈帧或类似PDA的东西?@CodeMonkey:PDA的堆栈非常有限。您只能访问顶部;一旦你打开它,它就消失了。因此,堆栈帧的概念在这种情况下没有任何意义。当CFG没有输入时,如何使CFG等效于函数?