像 ()、{} 和 ; 这样的结构标记如何?如果它们未包含在符号表中,是否会被跟踪?

问题描述 投票:0回答:1

我正在学习编译器构造,并且有一个关于处理结构标记的问题,例如括号 ()、大括号 {} 和分号 ;。我知道这些标记对于解析至关重要,但通常不包含在符号表中。如果这些标记没有存储在符号表中,编译器如何跟踪和管理它们?

这是我目前所理解的:

  1. 词法分析:将源代码转换为标记流 包括标识符、关键字、文字、运算符和结构 ()、{} 和 ; 等标记。
  2. 符号表:主要用于跟踪变量等实体, 函数以及稍后需要引用的文字。才不是 通常包括结构性标记。

我好奇的是:

  • 解析器在语法分析过程中如何使用结构标记,如果 它们没有记录在符号表中吗?
  • 使用什么机制或数据结构来跟踪仓位 以及解析过程中这些标记的用途?

示例 考虑以下 C++ 代码:

int main() {
    int a = 10;
    float b = 5.5;
    a = a + b;
    return 0;
}
  • main()中的小括号()和大括号{}是怎样的 解析此代码期间跟踪的函数体?

  • 这些标记在解析树的构建中起什么作用 或者抽象语法树(AST)?

另外,检查我的符号表是否正确(词法分析阶段)

enter image description here

compiler-construction compiler-development
1个回答
0
投票

在简化/理想化的流程中,词法分析之后是解析,然后是静态分析,然后是其他阶段。符号表是作为静态分析的一部分创建和修改的。所以问:

如果结构标记没有记录在符号表中,解析器在语法分析时如何使用结构标记?

很奇怪,因为解析器不关心符号表中记录或未记录什么,因为它甚至还不存在。

您为词法分析阶段提供了一个“符号表”的示例,但词法分析的输出不是符号表,而是标记序列(源文本中的每个标记按照它们出现的顺序排列) ),这不是该表中出现的内容。

在解析过程中使用什么机制或数据结构来跟踪这些令牌的位置和用途?

令牌的位置通常是令牌数据结构的成员/属性。任何更具体的内容都取决于您使用的解析器的类型。

这些标记在解析树或抽象语法树(AST)的构建中起什么作用?

结构标记对于解析器构建语法树很重要,但是一旦完成,它们对后续阶段就不是很有用。如果您有 AST,它可能甚至没有引用它们。

© www.soinside.com 2019 - 2024. All rights reserved.