在编译器构造中,符号和标记一样吗?

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

在编译器构造中,当您谈论令牌时,令牌是否与符号相同/只是符号的另一个术语?经过一番研究,我想明白了,令牌是一个引用符号表的符号,因此某种属性符号/带有一些附加信息的符号?感谢您的任何澄清:-)

terminology token symbols compiler-construction
3个回答
19
投票

令牌不一定是符号表中的符号。 例如,如果令牌是保留字,则不会将其输入符号表中。如果令牌是标识符,那么它可能会被输入到符号表中。

以以下声明为例:

char s[100];

词法分析器可以输出以下标记:

<"char", IDENTIFIER>

根据实现,它可以被识别为保留字或作为预定义类型名称输入到符号表中(我在这里不是 100% 确定),

<"s", IDENTIFIER>

“s”作为变量标识符输入符号表中,

<"[", OPEN_SQUARE_BRACKET>

未输入符号表,

<"100", INTEGER_LITERAL>

未输入符号表,

<"]", CLOSE_SQUARE_BRACKET>

未输入符号表,

<";", SEMI_COLON>

未输入符号表。

因此,您基本上只在符号表中输入稍后在编译过程中需要引用的标记。例如,稍后在函数体中,当您发现

strcpy(s, "Hello, world\n");

您再次识别该标记<"s", IDENTIFIER>并在符号表中查找它。符号表会说“s”已被声明为 char [] 类型的变量。

所以,我想说token是词法分析器识别的任何输入块,并且只有具有特殊含义的某些标记才会在符号表中作为symbols输入。


0
投票

符号是该键中的给定常数,如该表中的 S=S,或该等式中的 Pi = Pi,而令牌表示在该条件下作为交换媒介的给定。


0
投票

解析代码时,您将源文件拆分为标记。您可以在句子中使用单词的类比。令牌由 Lexer/Scanner 创建。

int x = arr[4];

在此示例中,令牌为:

  • int
  • x
  • =
  • arr
  • [
  • 4
  • ]
  • ;

解析器检查语法并(通常)生成抽象语法树(AST)。这棵树可能会被多次遍历以收集符号和类型、执行检查等。

符号是

  • 变量
  • 功能
  • 等等

这里变量

x
arr
是符号。符号被插入到符号表中。他们可能持有额外的信息,如类型、地址等。

因此,代币

x
代表类型为
x
的符号
int
。再次用词语来类比:主语/宾语/谓语都是用词语来表示的,但它们的含义是不同的。

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