Parsing 可以用yacc解析的语言类别是什么?

Parsing 可以用yacc解析的语言类别是什么?,parsing,grammar,yacc,formal-languages,Parsing,Grammar,Yacc,Formal Languages,我最近才知道。我最近也了解到了这一点。yacc实用程序的手册指出,而维基百科则指出,LALR语法是确定性上下文无关语法的子集,确定性上下文无关语法是上下文无关语法的子集。如果C甚至不是上下文无关的(更不用说确定性上下文无关语言),而yacc可以解析C,那么如果不是具有LALR(1)语法的上下文无关语言的子集,yacc可以解析哪类语言呢?yacc生成图灵完全的计算机程序。yacc框架使用LALR(1)框架来触发动作,但动作是任意代码 此外,yacc的输入是令牌流,而不是直接输入。令牌流由另一个用图

我最近才知道。我最近也了解到了这一点。yacc实用程序的手册指出,而维基百科则指出,LALR语法是确定性上下文无关语法的子集,确定性上下文无关语法是上下文无关语法的子集。如果C甚至不是上下文无关的(更不用说确定性上下文无关语言),而yacc可以解析C,那么如果不是具有LALR(1)语法的上下文无关语言的子集,yacc可以解析哪类语言呢?

yacc生成图灵完全的计算机程序。yacc框架使用LALR(1)框架来触发动作,但动作是任意代码

此外,yacc的输入是令牌流,而不是直接输入。令牌流由另一个用图灵完全语言编写的计算机程序生成,该程序也可以不受上下文无关转码限制的方式操作其输入

最后,没有什么能阻止yacc生成的解析器最初接受预期语言的超集,然后分析上下文无关的解析树,并拒绝基于任意计算的某些构造,例如坚持在使用前声明变量(上下文敏感计算)

简而言之,真实世界的解析器是实用的编写程序,而不是理论性的学术练习。bison/yacc解析的语言通常是“大部分”LALR(1),它们的词法分析通常是“大部分”规则的,但是当计算机程序充分利用它们的能力来超越这些限制时,不要感到惊讶

这就是为什么编程是一项有趣的活动


所有这些都不会降低学术理论的实用性。Bison/yacc和其他解析器生成器从构建解析器中花费了大量精力,因为它们可以处理“大部分”分析。语言越接近可分析的上下文无关模型,就越容易生成(“大多数”)其他有用的工具:linter、语法高亮器、重新格式化器、索引器、静态分析器、文档提取器等。,更不用说作为语言本身语法的文档了。

C没有上下文无关语法,只是因为标识符标记(其词法类别)的语义分类有时需要理解它是如何声明的。C是为一次编译而设计的,因此在解析过程中的任何时候,与解析相关的所有内容都可以从之前的声明中知道。作用域中的声明可用于将词法类别分配给标记

< P> >例如,如果分析器在语句块的中间面向“代码>(a)(b)< /代码>,则可以是:

  • 表达式
    (B)
    被转换为类型
    A

  • 参数列表
    (B)
    应用于函数表达式
    (A)

但是这种歧义不必出现在解析器中,因为词法分析器可以窥视范围,并根据
typedef
名称或其他内容对
A
进行不同的分类,然后这些不同分类的标识符可以被单独的语法规则作为目标。这就像有一个神奇的甲骨文,用语义信息标记令牌,这样就可以应用上下文无关技术


首先,C语言中的另一个问题是它有一个预处理器。C的语法是在单独的部分中指定的:有一个预处理器语法,还有一个用于预处理令牌流的语法。C语言不可能有上下文无关的语法来捕捉其短语结构的细微差别,因为预处理可以重新定义语法,宏可以在任何地方调用,除了注释和字符串文本。

C通常使用Yacc编译,并在词法分析器和解析器之间提供上下文感知反馈。这就是“代码> TyPulf< /Cord>名称”可以被正确处理。FYI,第一个问题是关于C++,而不是C,尽管C也是如此。正如JonathanLeffler所说,它使用解析器和词法分析器之间的反馈。我的猜测是:当一个名称被定义时,它会被添加到lexer使用的令牌表中,并且该名称的未来使用会得到正确的分类。这使得它对上下文敏感,即使语法不是。我没有说它来自手册页,我说它来自手册,我给出的引文直接链接到yacc手册,其中说yacc接受LALR(1)语法作为输入。维基百科页面上说,LALR语法是上下文无关语法的一个子集。因此,yacc接受上下文无关语法子集的规范作为输入。@user207421 LALR(1)具有消歧规则的语法仍然不比上下文无关语法更强大。消歧规则是关于如何处理歧义CFG的,它们不允许YACC突然接受上下文敏感语法。正如其他人所说,YACC可以通过让解析器将信息反馈给词法分析器来解析C,这与消除歧义规则无关。我猜如果词法分析器是图灵完备的,那么它可以解析整个东西,然后发出完整解析树的序列化表示,这意味着理论上它可以解析到自然语言。这很好地回答了我的问题。谢谢@用户:C语言与上下文无关性最明显的偏差是预处理器,它是语言的一个基本部分,不管别人怎么说。C宏不是完全图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图灵图。然而,它就在那里。Yacc很高兴地不知道在传递令牌之前进行了什么转换,也不知道在识别每个缩减之后会发生什么。所以,是的,天空是极限。但有些语言比其他语言更适合yacc。