在C编译器中,编译过程中的词法和语法分析是什么?

在C编译器中,编译过程中的词法和语法分析是什么?,c,parsing,compilation,preprocessor,lexical-analysis,C,Parsing,Compilation,Preprocessor,Lexical Analysis,编译过程中的词汇和句法分析是什么。预处理是在词法和句法分析之后进行的吗?预处理是在词法分析iirc之前进行的 注释被过滤掉,#定义。。。然后,编译器使用scanner/lexer(词法分析)生成标记。在此之后,编译器生成用于语法分析的ParseTree,也有例外,但通常是这样: 预处理-将程序文本转换为程序文本 词法分析-将程序文本转换为“标记”,本质上是带有属性的小整数 语法分析-将程序文本转换为抽象语法 “抽象语法”的定义可能会有所不同。在一次性编译器中,抽象语法相当于一段代码。但是现在

编译过程中的词汇和句法分析是什么。预处理是在词法和句法分析之后进行的吗?

预处理是在词法分析iirc之前进行的
注释被过滤掉,#定义。。。然后,编译器使用scanner/lexer(词法分析)生成标记。在此之后,编译器生成用于语法分析的ParseTree,也有例外,但通常是这样:

  • 预处理-将程序文本转换为程序文本
  • 词法分析-将程序文本转换为“标记”,本质上是带有属性的小整数
  • 语法分析-将程序文本转换为抽象语法

“抽象语法”的定义可能会有所不同。在一次性编译器中,抽象语法相当于一段代码。但是现在通常是一棵树或DAG逻辑上代表程序的结构。

词法分析发生在语法分析之前。这是合乎逻辑的,因为当需要调用宏时,必须首先标识标识符的边界。这是通过词法分析完成的。在那之后,句法分析开始了。请注意,编译器通常不会在开始语法分析之前生成完整的预处理源代码。他们一次只读一个词汇表,必要时进行预处理,并将结果反馈给语法分析

在一种情况下,词汇分析会发生两次。这是粘贴缓冲区。看看代码:

#define En(x) Abcd ## x ## x

enum En(5)
{
    a, b = 20, c, d
};
此代码使用名称
Abcd55
定义枚举。在宏展开过程中处理
##
时,数据将被放入内部缓冲区。之后,这个缓冲区就像一个小的include一样被扫描。在扫描过程中,编译器会将缓冲区的内容分解为词汇表。扫描词汇表的边框可能与放入缓冲区的原始词汇表的边框不匹配。在上面的示例中,3个词法被放入缓冲区,但只检索到一个。

考虑以下代码:

     int a = 10;
     if (a < 4)
     {
          printf("%d", a);
     }
inta=10;
if(a<4)
{
printf(“%d”,a);
}
词法分析阶段:识别每个单词/标记并赋予其意义。 在上面的代码中,首先确定i后接n后接t,然后空格是单词int,它是一个语言关键字1后接0,空格是数字10,依此类推

语法分析阶段:验证代码是否遵循语言语法(语法规则)。例如,检查运算符的LHS上是否只有一个变量(考虑语言C),每个语句是否以结尾,如果后面跟着一个条件/布尔语句,则为


正如其他人提到的,预处理通常发生在词法分析或语法分析之前。

当我们谈论C编程语言时,我们应该注意到该语言有一个ISO(ANSI)标准。以下是C99的最新公开草案(ISO/IEC 9899:1999):www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf

有一节“5.1.1.2翻译阶段”说明了如何解析C程序。分为以下几个阶段:

。。。多字节、三角图和反斜杠处理的一些步骤

3) 。源文件被分解为预处理标记和序列 空白字符(包括注释)

这是用于预处理的词法分析。这里只对预处理器指令、标点符号、字符串常量、标识符和注释进行词法分析

4) 。执行预处理指令,扩展宏调用

这是预处理本身。此阶段还将包括来自
\include
的文件,然后将删除预处理指令(如
\define
\ifdef
和其他)

。。。正在处理字符串文字

7) 。分隔标记的空白字符不再有效。每个 预处理令牌被转换为令牌。生成的令牌是 从语法和语义上分析并翻译为一个翻译单元

转换为令牌意味着语言关键字检测和常量检测。 这是最后的词汇分析步骤;句法和语义分析

所以,你的问题是:

预处理是在词法和句法分析之后进行的吗

需要一些词法分析来进行预处理,所以顺序是: 词法预处理器,预处理,真词法,其他分析


PS:真正的C编译器的组织方式可能略有不同,但其行为方式必须与标准中编写的相同。

您在谈论什么语言?请添加相关标记。预处理在链接完成之前进行。所有宏在编译之前都会被替换。@在链接完成之前,会进行词法分析和编译。。。所以那是什么意思(“预处理发生在词法分析iirc注释被过滤掉之前,…”谢谢你提供的信息!如果你想把它与自然语言进行比较,预处理就是把文本从纸上、屏幕上输入。你过滤图片等东西。然后你得到单词,这就是词法分析。你要寻找词库中的单词。然后你做语法,这就是句子的构建方式,语法,…那不应该是“Lexemas”吗?“Lexemas”是西班牙语。