提问人:Luciano Robino 提问时间:5/9/2023 最后编辑:templatetypedefLuciano Robino 更新时间:6/6/2023 访问量:59
语法、解析器和无限循环
Grammars, parsers and infinite loops
问:
我对解析器和语法不是很熟悉,所以我需要帮助来理解相关的主题。
假设我有一个语法,我想为该语法定义一个解析器。查看其他 Stack Overflow 问题,我了解到语法可能有无限的解析器。但是,我应该对语法或解析器施加什么条件来防止解析器上的无限循环?
在 Stack Overflow 中检查了类似的问题后,我了解到我的语法必须是确定性的上下文无关语法。如果这是正确的,则意味着语法可以由确定性下推自动机生成。什么充分条件可以确保上下文无关语法在不参考下推自动机的情况下是确定性的?
最后,对于我真正感兴趣的问题,语言中单词的长度是固定的,所以我想在这些情况下可以避免无限循环。我的这个猜测正确吗?
我怀疑这些都是已经研究和发表的众所周知的结果,所以我完全可以得到关于这个主题的书或论文的推荐。
答:
但是,我应该对语法或解析器施加什么条件来防止解析器上的无限循环?
有许多不同的解析算法可供选择,每种算法都会施加自己的规则和限制。因此,从这个意义上说,这个问题没有一个统一的答案。例如,一些无法通过 LL(1) 解析器解析的 CFG 可以使用 LR(0) 解析器进行解析,反之亦然。因此,一个好的第一步是选择要使用的解析算法。LL(1) 解析器可能是最容易理解的,但需要一些体操来处理许多语法。LR 系列解析器功能更强大,但需要一些有关其内部工作原理的专业知识才能使用。
在 Stack Overflow 中检查了类似的问题后,我了解到我的语法必须是确定性的上下文无关语法。如果这是正确的,则意味着语法可以由确定性下推自动机生成。什么充分条件可以确保上下文无关语法在不参考下推自动机的情况下是确定性的?
这里有一些微妙之处,使这种说法在技术上不正确。你说得对,确定性下推自动机和确定性语法之间存在联系,但这是一个棘手的问题。只有当你使用 LR 样式的解析器时,确定性语法才值得关注,虽然有一个定理说一种语言是确定性的 CFL,当且仅当存在确定性语法时,该定理并不一定能帮助你找到一种方法来为使用 LR 解析器的语言编写语法,除非你非常熟悉确定性下推自动机的工作原理。(即便如此,你得到的语法也很难处理。
你会看到人们检查语法是否适用于 LR 解析器的最常见方法是通过 LR 解析器生成器运行语法,看看它是否会产生任何移位/减少或减少/减少冲突。
最后,对于我真正感兴趣的问题,语言中单词的长度是固定的,所以我想在这些情况下可以避免无限循环。我的这个猜测正确吗?
是的,任何固定长度字符串的“合理”CFG 都应该避免上述类型的冲突 - 除非这些字符串的结构非常复杂。
评论