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


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


7745
2017-07-29 12:10


起源



答案:


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

以下面的声明为例:

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 []类型的变量。

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


13
2017-07-29 12:30



非常感谢你的回复!我以某种方式混淆了符号表的名称;-) - stefan.at.wpf
因此,从上面开始 - 认为进入符号表的所有令牌实际上只是标识符是公平的吗?即,可以在符号表中输入哪些令牌不是标识符? ..符号的定义是一个标识符吗? (与其他令牌'[',';','100'等相反,我猜测,我不知道。) - wardw
据我所知你是对的:在符号表中输入的唯一标记是(函数,变量等)的标识符(参见 en.wikipedia.org/wiki/Symbol_table) - Giorgio


答案:


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

以下面的声明为例:

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 []类型的变量。

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


13
2017-07-29 12:30



非常感谢你的回复!我以某种方式混淆了符号表的名称;-) - stefan.at.wpf
因此,从上面开始 - 认为进入符号表的所有令牌实际上只是标识符是公平的吗?即,可以在符号表中输入哪些令牌不是标识符? ..符号的定义是一个标识符吗? (与其他令牌'[',';','100'等相反,我猜测,我不知道。) - wardw
据我所知你是对的:在符号表中输入的唯一标记是(函数,变量等)的标识符(参见 en.wikipedia.org/wiki/Symbol_table) - Giorgio


符号是GIVEN常量IN THAT KEY,如该表中的S = S,或该等式中的Pi = Pi,而令牌表示在该条件下作为介质OF交换的给定。


0
2017-07-02 16:00