什么是' memoize'在PEG解析器(例如Pegasus)中何时应该使用它?

时间:2015-09-21 00:46:01

标签: peg

以下是Pegasus的示例:

additive <double> -memoize
= left:additive "+" right:multiplicative { left + right }
/ left:additive "-" right:multiplicative { left - right }
/ multiplicative

在此上下文中memoize是什么以及何时应该使用它?

我理解一般概念(给定输入的缓存输出) - 但是&#34;输入&#34;当我们谈论PEG解析器时?

1 个答案:

答案 0 :(得分:3)

我是Pegasus的作者。

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

如果可能多次在同一状态中调用规则,则应该执行此操作。

例如,如果你有这种风格的解析器:

void MainWindow::mouseMoveEvent(QMouseEvent * event)
{ 
    std::stringstream str;
    str << "Mouse position is " << event->pos.x() << ";" << event->pos().y();
    ui->label->setText( str.str().c_str() );
}

值得记住a = b "foo" / b "bar" / b "baz" b = /* something expensive */ 规则,因为它被用作多个表达式的前缀。

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

b

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