在C++;编译过程? 昨天我询问了C++上下文的敏感度,请参阅。在众多优秀的答案中,最为人接受的答案是

在C++;编译过程? 昨天我询问了C++上下文的敏感度,请参阅。在众多优秀的答案中,最为人接受的答案是,c++,parsing,compiler-construction,C++,Parsing,Compiler Construction,然而,我仍然认为关于这一点有一些话要说(可能是一些术语上的混淆?)。问题是:汇编的哪一部分处理了这种模糊性 为了澄清我的术语:CFG是一种在规则左侧只有一个非终结符符号的语法(例如,A->zC),CSG是在左侧有一个终结符(加上一个非终结符)(aAv->QT),其中大写字母是非终结符,小写字母是终结符 是在强>语法> 解析C++源代码中的任何表示吗?p> 谢谢你,很抱歉推这个问题 我敢说,任何上下文敏感的问题都应该通过语义分析来解决 因为没有其他人在加速(并且承认我对“真正的”编译器的功能非常粗

然而,我仍然认为关于这一点有一些话要说(可能是一些术语上的混淆?)。问题是:汇编的哪一部分处理了这种模糊性

为了澄清我的术语:CFG是一种在规则左侧只有一个非终结符符号的语法(例如,
A->zC
),CSG是在左侧有一个终结符(加上一个非终结符)(
aAv->QT
),其中大写字母是非终结符,小写字母是终结符

是在强>语法> <强>解析C++源代码中的任何表示吗?p>


谢谢你,很抱歉推这个问题

我敢说,任何上下文敏感的问题都应该通过语义分析来解决

因为没有其他人在加速(并且承认我对“真正的”编译器的功能非常粗略):

围绕这样一个语句的歧义

B = A();
通过查阅符号表,找出语句中任何非关键字、非运算符(此处为
B
A
)的类型,并尝试从中形成可接受的赋值来解决此问题。如果找不到此类安排,则发布错误

这可能是在分析过程的早期AST形成期间完成的,但在词法分析完成之后

汇编的哪一部分涉及 模棱两可


在构建语法树之后,应该没有歧义。因此,最后的语法树应该已经准备好进行翻译了。简而言之,语法分析器应该在派生过程(AKA语法分析)中解决上下文敏感语法(AKA歧义语法)

您似乎假设编译器是由严格基于语法的阶段构建的。没有比这更离谱的了。语法用于解析输入的某些位,然后使用各种启发式方法解析其他位,然后进行更多语法解析,依此类推。理想的编译器,如教科书中所描述的那样,并不存在


一个简单的例子是递归下降编译器,它对算术表达式使用表驱动的解析器。或者事实上,反之亦然。

首先,语言和语法之间存在差异。A. 语言是一组字符串。语法是描述一组语法的一种方式 字符串(人们常说语法“生成”字符串)。给定的 语言可以用几种语法来描述

最著名的语法类型是基于产生式的语法。那些 乔姆斯基在哪里分类

  • 不受限制的语法,在语法的两边可以有任何东西 制作

  • 单调语法,其中左手边最多与 右侧

  • 上下文相关,仅扩展一个非终端

  • 上下文无关,其中产品的左侧仅包含一个 非终端

  • 常规语法,其中产品的左侧仅包含 生产的一个非终端和右侧可能只有一个 非终端,作为最新的元素

单调语法和上下文敏感语法也称为1型语法。 它们能够生成相同的语言。他们的力量不如他们 键入0语法。好吧,虽然我看到了语言存在的证据 有0型语法,但没有1型语法,我不知道任何例子

上下文相关语法称为类型2语法。他们不那么 强于类型1语法。语言的标准示例 没有类型2语法,但类型1语法是字符串集 由相等数量的a、b和c组成,a在b和c之前 b在c之前

常规语法也称为3型语法。他们没有那么强大 比第2类语法好。一种语言的标准示例,其中 不是类型3语法,但类型2语法是具有 正确匹配括号

语法中的歧义超出了层次结构。语法是 如果给定字符串可以通过多种方式生成,则不明确。有 无歧义的1型语法,还有歧义的3型语法

还有其他种类的语法,它们不是乔姆斯基的一部分 分类(两级语法、属性语法、树语法) 语法,…)即使它们基于产品。其中一些是 甚至能够描述编程语言的语义

还有解析算法。这些通常是基于CFG和强制的 更多限制以获得更好的解析速度(解析CSG需要 指数时间,CFG需要立方时间,常用算法仅为线性 时间)。这些限制引入了其他类别的语法

CSG和单调语法实际上在描述或编译时几乎没有用处 一种编程语言:它们的全局行为并不明显,而是 由本地属性合成,因此它们很难理解和识别 将语义附加到产品是有问题的,解析它们的成本很高-- 通常情况下,错误处理是困难的。非乔姆斯基 引入语法来解决这些问题

回到C++。该标准描述了上下文无关的C++语言。 语法但是

  • 存在歧义(著名的“最令人烦恼的解析”)。那么编译器呢 必须识别歧义并使用正确的解释(即。
    cx();
    是函数声明,而不是对象定义)

  • 语法不是LR(1)(CFG中最为人熟知的一个子集) 其中存在线性解析算法)。其他算法(潜在的 使用的时间或空间成本更高),或者基于更一般的 理论o