【发布时间】:2019-10-27 13:06:27
【问题描述】:
我最近了解到C does not have a context-free grammar。我最近还了解到gcc used to use yacc to parse C。 yacc 实用程序的手册指出 "The class of specifications accepted [by yacc] is a very general one: LALR(1) grammars with disambiguating rules",而 Wikipedia states 指出 LALR 语法是确定性上下文无关语法的子集,它是上下文无关语法的子集。如果 C 甚至不是上下文无关的(更不用说确定性的上下文无关语言),但 yacc 可以解析 C,那么 yacc 可以解析哪类语言,如果不是具有 LALR(1) 的上下文无关语言的子集语法?
【问题讨论】:
-
C 通常用 Yacc 编译,在词法分析器和解析器之间有上下文感知反馈。这样才能正确处理
typedef名称之类的内容。 -
仅供参考,您链接到的第一个问题是关于 C++,而不是 C,尽管 C 也是如此。
-
正如@JonathanLeffler 所说,它使用解析器和词法分析器之间的反馈。我的猜测:定义名称后,它会被添加到词法分析器使用的标记表中,并且该名称的未来用途会得到正确分类。这使得它与上下文相关,即使语法不是。
-
我没有说它来自手册页,我说它来自手册,并且我给出的引述字面上链接到 yacc 手册,其中说 yacc 接受 LALR(1) 语法作为输入。维基百科页面说 LALR 语法是上下文无关语法的子集。因此,yacc 接受上下文无关文法子集的规范作为输入。
-
@user207421 具有消除歧义规则的 LALR(1) 语法仍然不比上下文无关语法更强大。消歧规则是关于如何处理模棱两可的 CFG,它们不允许 YACC 突然接受上下文相关的语法。正如其他人所说,YACC 可以通过使解析器将信息反馈给词法分析器来解析 C - 这与消除歧义规则无关。
标签: parsing grammar yacc formal-languages