我正在尝试制作一个与以下功能相同的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;
答案 0 :(得分:0)
你无法用CFG做到这一点,尽管你当然可以用CSG做到这一点。泵浦引理应该足以证明是不可能的。
如果b
已修复,则很容易:
S ⇒ ε S ⇒ 0 S 1 1 … 1 (b times)
这将识别形式的字符串
0a1a·b
这是我能想到的唯一一种CFG可以实现乘法的感觉。