在编译器构造中,符号是否与令牌相同?

ste*_*wpf 13 compiler-construction symbols terminology token

在编译器构造中,当你谈论令牌时,一个令牌就像一个符号/只是一个符号的另一个术语?经过一些研究后,我想要明白,令牌是一个带有符号表参考的符号,因此某种归属符号/带有一些额外信息的符号?谢谢你的任何澄清:-)

Gio*_*gio 15

令牌不一定是符号表中的符号.例如,如果令牌是保留字,则它不会输入到符号表中.如果令牌是标识符,则可能会在符号表中输入.

以下面的声明为例:

char s[100];
Run Code Online (Sandbox Code Playgroud)

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

<"char", IDENTIFIER>
Run Code Online (Sandbox Code Playgroud)

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

<"s", IDENTIFIER>
Run Code Online (Sandbox Code Playgroud)

"s"作为变量标识符输入到符号表中,

<"[", OPEN_SQUARE_BRACKET>
Run Code Online (Sandbox Code Playgroud)

未输入符号表,

<"100", INTEGER_LITERAL>
Run Code Online (Sandbox Code Playgroud)

未输入符号表,

<"]", CLOSE_SQUARE_BRACKET>
Run Code Online (Sandbox Code Playgroud)

未输入符号表,

<";", SEMI_COLON>
Run Code Online (Sandbox Code Playgroud)

没有输入符号表.

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

strcpy(s, "Hello, world\n");
Run Code Online (Sandbox Code Playgroud)

你再次识别标记<"s",IDENTIFIER>并在符号表中查找它.符号表将声明"s"已声明为char []类型的变量.

因此,我会说令牌是词法分析器识别的任何输入块,并且只有特定含义的某些令牌在符号表中作为符号输入.