【问题标题】:"Lexeme" vs "Token" Terminology“Lexeme”与“Token”术语
【发布时间】:2018-11-29 02:38:52
【问题描述】:

我试图了解编译器中“词素”和“令牌”之间的区别。

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

"abc"

说上面是5个字符的词位对吗?

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

所以...

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

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

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

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


相关问题:

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

【问题讨论】:

  • 这里离题了。但是请阅读 Dragon BookLexical analysisParsing 维基页面。你错了,lexeme 和lexical tokens 通常都是abstract data types,而不是输入流的一部分。一般来说,输入流在解析后会丢失
  • 很多编译器(或解释器)都是free software,所以你可以研究他们的源代码....
  • 在实践中,术语“token”和“lexeme”是等价的。选择一个并坚持下去。我更喜欢“词素”,因为它听起来像是来自词法分析器的东西。 (当然,“token”来自分词器 :-)。
  • 关于词法分析器是否保留词位全文或进行转换的问题,这是我的建议:stackoverflow.com/questions/6320132/…
  • 我给了你一个 +1 来反驳反对票。我认为你的问题是完全合理的。

标签: parsing compiler-construction lexical-analysis


【解决方案1】:

“词位”是源中的文字字符,例如“a”是“abc”中的词位。它是最小的单位。 “词法分析器”或词法分析阶段将词位转换为标记(例如关键字、标识符、文字、运算符等),这些标记是解析器可以用来创建 AST 的最小单位。所以如果我们有这个声明

int x = 0;

词法分析器会输出

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

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

但是,大多数人交替使用词位和标记,通常不会引起混淆。对于有关转换 int 文字的问题,您可能需要一个用于 AST 的包装类。仅仅有一个整数可能还不够信息。

【讨论】:

    猜你喜欢
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    相关资源
    最近更新 更多