【发布时间】:2011-09-17 17:08:41
【问题描述】:
大多数解析可以通过仅查看下一个符号(用于词法分析的字符,用于正确解析的标记)来完成,而其余大多数情况可以通过仅查看一个符号来处理。
对于实际使用的编程语言或数据格式,是否有任何实际案例需要多个或无限多个前瞻符号(或等效回溯)?
【问题讨论】:
大多数解析可以通过仅查看下一个符号(用于词法分析的字符,用于正确解析的标记)来完成,而其余大多数情况可以通过仅查看一个符号来处理。
对于实际使用的编程语言或数据格式,是否有任何实际案例需要多个或无限多个前瞻符号(或等效回溯)?
【问题讨论】:
我记得,Fortran 是一种需要大前瞻缓冲区的语言。解析 Fortran 需要(理论上)无限前瞻,尽管大多数实现都会限制语句行的长度,这会限制前瞻缓冲区的大小。
另外,请参阅Why can't C++ be parsed with a LR(1) parser? 的选定答案。特别是引用:
“C++ 语法有歧义,依赖于上下文,可能需要无限前瞻来解决一些歧义”。
【讨论】:
Knuth 证明了任何 LR(k) 文法都可以机械地转换为 LR(1) 文法。此外,AFAIK,任何 LR(k) 语法都可以按与解析字符串的长度成比例的时间进行解析。由于它包含 LR(1),我看不出用 k > 1 实现 LR(k) 解析有什么用。
我从未研究过 LR(k)->LR(1) 转换,因此在某些情况下它可能并不实用。
【讨论】: