我正在学习编译器构造,并且有一个关于处理结构标记的问题,例如括号 ()、大括号 {} 和分号 ;。我知道这些标记对于解析至关重要,但通常不包含在符号表中。如果这些标记没有存储在符号表中,编译器如何跟踪和管理它们?
这是我目前所理解的:
我好奇的是:
示例 考虑以下 C++ 代码:
int main() {
int a = 10;
float b = 5.5;
a = a + b;
return 0;
}
main()中的小括号()和大括号{}是怎样的 解析此代码期间跟踪的函数体?
这些标记在解析树的构建中起什么作用 或者抽象语法树(AST)?
另外,检查我的符号表是否正确(词法分析阶段)
在简化/理想化的流程中,词法分析之后是解析,然后是静态分析,然后是其他阶段。符号表是作为静态分析的一部分创建和修改的。所以问:
如果结构标记没有记录在符号表中,解析器在语法分析时如何使用结构标记?
很奇怪,因为解析器不关心符号表中记录或未记录什么,因为它甚至还不存在。
您为词法分析阶段提供了一个“符号表”的示例,但词法分析的输出不是符号表,而是标记序列(源文本中的每个标记按照它们出现的顺序排列) ),这不是该表中出现的内容。
在解析过程中使用什么机制或数据结构来跟踪这些令牌的位置和用途?
令牌的位置通常是令牌数据结构的成员/属性。任何更具体的内容都取决于您使用的解析器的类型。
这些标记在解析树或抽象语法树(AST)的构建中起什么作用?
结构标记对于解析器构建语法树很重要,但是一旦完成,它们对后续阶段就不是很有用。如果您有 AST,它可能甚至没有引用它们。