|
|
1
8
递归对象的警告是什么?显示文本;对于这种情况,有一个这样的警告是可以忽略的(实际上,在某种意义上是可取的)。 如果由于递归值而无法编译,只需将“语法值”转换为“语法函数”。那是,而不是
使用
即使“parseinfix2”的类型在任何方面都是相同的函数类型…F(与haskell不同)有时会要求你明确(do eta-conversion 如上所述)。 我会忽略关于插入“lazy”的建议,解析器实际上是函数,而不是值,因此eta转换将涵盖相同的问题(所有这些都不会被急切地评估,它都需要“等待”直到传递要分析的字符串,然后才开始“运行”)。 关于stackoverflowexceptions,如果您发布一个堆栈的循环片段,它可能会有所帮助,但您可以自己查看,例如,如果您有语法的左递归部分,它不消耗任何输入,并被捕获在一个循环中。我认为对于大多数语言中的大多数解析技术来说,这是一个容易的陷阱。 |
|
|
2
2
_-转换不一定是一个很好的解决方案-如果您这样做,您必须证明延迟的函数最多只运行一次,或者在解析期间为调用它支付大量开销。 你想要这样的东西:
如果您有工作流生成器,一个更好的方法是定义延迟成员来为您执行此操作:
|
|
|
3
1
ETA重写和延迟都不是一件确定的事情。F编译器似乎很难处理深度递归。对我来说有效的方法是将递归折叠成一个顶级函数(通过将要递归调用的函数作为参数传递)。这个顶层是ETA风格的。 顶层,我有:
注:维基百科说:“在像ocaml这样的严格语言中,我们可以通过强制使用闭包来避免无限递归问题。”这对我很有用。 |
|
|
David542 · 任何语言都允许函数名中有空格吗? 1 年前 |
|
Andy · 将LENGTH OF移动到COMP字段解析失败 1 年前 |
|
|
Chris Geo · 如何找到LR0项目的FOLLOW集合? 1 年前 |
|
|
Yash Singhal · 在reactjs中解析Pdf中的文本 2 年前 |
|
|
i33SoDA · 如何将逗号分隔的数字字符串解析为int数组? 2 年前 |