在C++;编译过程? 昨天我询问了C++上下文的敏感度,请参阅。在众多优秀的答案中,最为人接受的答案是
然而,我仍然认为关于这一点有一些话要说(可能是一些术语上的混淆?)。问题是:汇编的哪一部分处理了这种模糊性 为了澄清我的术语:CFG是一种在规则左侧只有一个非终结符符号的语法(例如,在C++;编译过程? 昨天我询问了C++上下文的敏感度,请参阅。在众多优秀的答案中,最为人接受的答案是,c++,parsing,compiler-construction,C++,Parsing,Compiler Construction,然而,我仍然认为关于这一点有一些话要说(可能是一些术语上的混淆?)。问题是:汇编的哪一部分处理了这种模糊性 为了澄清我的术语:CFG是一种在规则左侧只有一个非终结符符号的语法(例如,A->zC),CSG是在左侧有一个终结符(加上一个非终结符)(aAv->QT),其中大写字母是非终结符,小写字母是终结符 是在强>语法> 解析C++源代码中的任何表示吗?p> 谢谢你,很抱歉推这个问题 我敢说,任何上下文敏感的问题都应该通过语义分析来解决 因为没有其他人在加速(并且承认我对“真正的”编译器的功能非常粗
A->zC
),CSG是在左侧有一个终结符(加上一个非终结符)(aAv->QT
),其中大写字母是非终结符,小写字母是终结符
是在强>语法> <强>解析C++源代码中的任何表示吗?p>
谢谢你,很抱歉推这个问题 我敢说,任何上下文敏感的问题都应该通过语义分析来解决 因为没有其他人在加速(并且承认我对“真正的”编译器的功能非常粗略): 围绕这样一个语句的歧义
B = A();
通过查阅符号表,找出语句中任何非关键字、非运算符(此处为B
和A
)的类型,并尝试从中形成可接受的赋值来解决此问题。如果找不到此类安排,则发布错误
这可能是在分析过程的早期AST形成期间完成的,但在词法分析完成之后
汇编的哪一部分涉及
模棱两可
在构建语法树之后,应该没有歧义。因此,最后的语法树应该已经准备好进行翻译了。简而言之,语法分析器应该在派生过程(AKA语法分析)中解决上下文敏感语法(AKA歧义语法) 您似乎假设编译器是由严格基于语法的阶段构建的。没有比这更离谱的了。语法用于解析输入的某些位,然后使用各种启发式方法解析其他位,然后进行更多语法解析,依此类推。理想的编译器,如教科书中所描述的那样,并不存在
一个简单的例子是递归下降编译器,它对算术表达式使用表驱动的解析器。或者事实上,反之亦然。首先,语言和语法之间存在差异。A. 语言是一组字符串。语法是描述一组语法的一种方式 字符串(人们常说语法“生成”字符串)。给定的 语言可以用几种语法来描述 最著名的语法类型是基于产生式的语法。那些 乔姆斯基在哪里分类
- 不受限制的语法,在语法的两边可以有任何东西 制作
- 单调语法,其中左手边最多与 右侧
- 上下文相关,仅扩展一个非终端
- 上下文无关,其中产品的左侧仅包含一个 非终端
- 常规语法,其中产品的左侧仅包含 生产的一个非终端和右侧可能只有一个 非终端,作为最新的元素
回到C++。该标准描述了上下文无关的C++语言。 语法但是
- 存在歧义(著名的“最令人烦恼的解析”)。那么编译器呢
必须识别歧义并使用正确的解释(即。
是函数声明,而不是对象定义)cx();
- 语法不是LR(1)(CFG中最为人熟知的一个子集) 其中存在线性解析算法)。其他算法(潜在的 使用的时间或空间成本更高),或者基于更一般的 理论o