递归下降解析器的局限性?

时间:2015-05-26 00:50:54

标签: regex recursive-descent

假设我有一个简单的上下文无关语法:

var listItems = model.arrayItems.map(function(item) {
    return(<ChildComponent item={item}></ChildComponent>)
}, this);

这个语法的简化递归下降解析器如下所示:

return (
    <div>
        <h1>My items:<h1>
        <ul>{listItems}</ul>
    </div>
);

问题是如何将“abababc”与此算法匹配?它看起来像是递归下降解析器的限制,只是想确认一下,如果我的理解错误,请纠正我。

PS:有些人提到它不需要递归下降解析器,它是一个正则表达式。我对这个问题中的递归下降解析器的功能和局限性感兴趣,对使用正则表达式解决它没兴趣。更具体地说,使用递归下降解析器可以解析什么样的语法?什么不可以。

1 个答案:

答案 0 :(得分:1)

您的代码的递归下降版本将是:

int Z(string s)
{
    int m = X(s);
    if (m < 0)
        return m;

    string sub = s.Substring(m);
    int m2 = Y(sub);
    if (m2 < 0)
    {
        m2 = Z(sub);    // recursive call
        if (m2 < 0)
            return m2;
    }

    return m + m2;
}

int X(string s)
{
    return s.StartsWith("ab") ? 2 : -1;
}

int Y(string s)
{
    return s.Equals("abc") ? 3 : -1;
}

请注意,正如@EJP所说,这可以在没有递归下降的情况下完成。递归下降解析context-free种语言。大多数编程语言都是无上下文的;值得注意的例外包括Lisp和C ++。解析这些语言需要recursively-enumerable解析器,因为它们允许在解析期间更改令牌(例如Lisp宏或C ++模板)的含义。