什么是';记忆';在PEG解析器(如Pegasus)中,应在何时使用?

什么是';记忆';在PEG解析器(如Pegasus)中,应在何时使用?,peg,Peg,以下是一个例子: 加法-记忆化 =左:加法“+”右:乘法{left+right} /左:加法“-”右:乘法{左-右} /乘法 在此上下文中,什么是memoize,何时使用 我理解一般的概念(缓存给定输入的输出)-但是当我们谈论PEG解析器时,“输入”是什么?我是Pegasus的作者 Pegasus将使用光标的当前位置以及内部状态的当前版本作为缓存特定规则结果的键(如果该规则设置为memoize) 如果规则可能在同一状态下被调用多次,则应该这样做 例如,如果您有这种类型的解析器: a = b "

以下是一个例子:

加法-记忆化
=左:加法“+”右:乘法{left+right}
/左:加法“-”右:乘法{左-右}
/乘法
在此上下文中,什么是
memoize
,何时使用


我理解一般的概念(缓存给定输入的输出)-但是当我们谈论PEG解析器时,“输入”是什么?

我是Pegasus的作者

Pegasus将使用光标的当前位置以及内部状态的当前版本作为缓存特定规则结果的键(如果该规则设置为memoize)

如果规则可能在同一状态下被调用多次,则应该这样做

例如,如果您有这种类型的解析器:

a = b "foo"
  / b "bar"
  / b "baz"

b = /* something expensive */
记住
b
规则是值得的,因为它被用作多个表达式的前缀

当然,这是可选的,因为在许多情况下,这可以以更好的方式进行优化:

a = b ("foo" / "bar" / "baz")
如果您用
-memoize
标记每个规则,这与Packrat解析基本相同。Pegasus允许您有选择地控制这一点,因为它有相当大的开销。

谢谢,现在它有意义了——我没有想到规则会在同一个位置重新运行。
a = b ("foo" / "bar" / "baz")