如果不能用LR(1)解析器解析c++,gccclang如何解析?

问题描述 投票:0回答:1

GCCClang是手写的解析器。我看过一个帖子,说C++不能被LR(1)解析器解析(为什么C++不能用LR(1)解析器解析?). 如果是这样的话,LR(1)比递归后裔更强大,为什么GCCClang是手写的递归后裔解析器?

c++ parsing grammar recursive-descent lr
1个回答
3
投票

GCCClang不是严格的递归后裔解析器,它们允许回溯(rearsing一个任意长的文本),还有其他偏离理论纯粹性的情况。严格来说,回溯解析器比非回溯解析器更强大(但代价是不再是线性时间)。

当问题这样表述的时候,解析C++的真正复杂性就消失了。如果你把C++剥离到附录A中BNF描述的超集,那么你基本上只需要准备考虑几种可供选择的解析。你可以通过回溯--尝试一种可能性,然后如果失败了,再尝试其他的可能性--或者通过并行探索,使用GLRGLL或者其他的变体来实现;没什么太痛苦的。但真正的工作还是需要面对。

  • 预处理器,它并不是特别复杂,但不能用任何类似于形式化解析框架的东西来描述。

  • 模板实例化,它将语义分析融入到解析过程中(为了发现正确的解析,需要这样做)。

  • 名称解析,有些人可能不认为这是解析的一部分,但在你知道一个特定的标识符指的是哪个语法对象之前,你是不会进入下一步的。如果你认为名称解析很简单,请重读C++标准的6.5节(名称查找)中的13页密密麻麻的内容,然后继续阅读第12节中关于解析重载名称的35页)。

© www.soinside.com 2019 - 2024. All rights reserved.