“ Lexeme”与“令牌”术语

时间:2018-06-20 04:18:16

标签: parsing compiler-construction lexical-analysis

我试图了解编译器中“ lexeme”和“ token”之间的区别。

如果我的编译器的lexer部分在要编译的源代码中遇到以下字符序列。

"abc"

说上面是一个5个字符长的词素是正确的吗?

如果我的编译器使用C语言实现,并且我为此空间分配了令牌空间,则该令牌将是一个结构。结构的第一个成员将是int,其类型将来自某些枚举,在本例中为STRING_LITERAL。结构的第二个成员将是char *,它指向一些具有4个字节的(动态分配的)内存。第一个字节为'a',第二个'b',第三个'c',第四个字节为NULL以终止字符串。

所以...

lexeme是源代码文本的5个字符。

令牌在内存中总共有6个字节。

这是使用术语的正确方法吗?

(我忽略了跟踪元数据(如文件名,行号和列号)的令牌。)


相关问题的排序:

让词法分析器将整数lexeme转换为令牌中的整数值是不常见的做法吗?还是更好(或更标准)的将lexeme的字符存储在令牌中,并让解析器阶段将这些字符转换为要附加到AST的整数节点?

1 个答案:

答案 0 :(得分:1)

“ lexeme”是源中的文字字符,例如,“ a”是“ abc”中的lexeme。它是最小的单位。 “词法分析器”或词法分析阶段将词素转换为令牌(例如,关键字,标识符,文字,运算符等),这是解析器可用于创建AST的最小单位。因此,如果我们有声明

int x = 0;

词法分析器会输出

<type:int> <id: x> <operator: = > <literal: 0> <semicolon>

词法分析器通常是一个正则表达式的集合,它们可以简单地将字符集合定义为语言语法中的终端。这些被转换为令牌,这些令牌作为流被馈送到解析器中。

但是,大多数人可以互换使用lexeme和token,通常不会引起混淆。对于您关于转换int文字的问题,您将需要AST的包装器类。仅仅拥有一个整数可能不足以提供信息。