我试图了解编译器中“ lexeme”和“ token”之间的区别。
如果我的编译器的lexer部分在要编译的源代码中遇到以下字符序列。
"abc"
说上面是一个5个字符长的词素是正确的吗?
如果我的编译器使用C语言实现,并且我为此空间分配了令牌空间,则该令牌将是一个结构。结构的第一个成员将是int
,其类型将来自某些枚举,在本例中为STRING_LITERAL。结构的第二个成员将是char *
,它指向一些具有4个字节的(动态分配的)内存。第一个字节为'a'
,第二个'b'
,第三个'c'
,第四个字节为NULL
以终止字符串。
所以...
lexeme是源代码文本的5个字符。
令牌在内存中总共有6个字节。
这是使用术语的正确方法吗?
(我忽略了跟踪元数据(如文件名,行号和列号)的令牌。)
相关问题的排序:
让词法分析器将整数lexeme转换为令牌中的整数值是不常见的做法吗?还是更好(或更标准)的将lexeme的字符存储在令牌中,并让解析器阶段将这些字符转换为要附加到AST的整数节点?
答案 0 :(得分:1)
“ lexeme”是源中的文字字符,例如,“ a”是“ abc”中的lexeme。它是最小的单位。 “词法分析器”或词法分析阶段将词素转换为令牌(例如,关键字,标识符,文字,运算符等),这是解析器可用于创建AST的最小单位。因此,如果我们有声明
int x = 0;
词法分析器会输出
<type:int> <id: x> <operator: = > <literal: 0> <semicolon>
词法分析器通常是一个正则表达式的集合,它们可以简单地将字符集合定义为语言语法中的终端。这些被转换为令牌,这些令牌作为流被馈送到解析器中。
但是,大多数人可以互换使用lexeme和token,通常不会引起混淆。对于您关于转换int文字的问题,您将需要AST的包装器类。仅仅拥有一个整数可能不足以提供信息。