假设我有一个简单的上下文无关语法:
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:有些人提到它不需要递归下降解析器,它是一个正则表达式。我对这个问题中的递归下降解析器的功能和局限性感兴趣,对使用正则表达式解决它没兴趣。更具体地说,使用递归下降解析器可以解析什么样的语法?什么不可以。答案 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 ++模板)的含义。