【发布时间】:2018-11-29 02:38:52
【问题描述】:
我试图了解编译器中“词素”和“令牌”之间的区别。
如果我的编译器的词法分析器部分在要编译的源代码中遇到以下字符序列。
"abc"
说上面是5个字符的词位对吗?
如果我的编译器是用 C 语言实现的,并且我为这个词位的标记分配空间,那么标记将是一个结构。结构的第一个成员将是int,它将具有某个枚举的类型,在本例中为 STRING_LITERAL。该结构的第二个成员将是一个char *,它指向一些(动态分配的)具有4 个字节的内存。第一个字节是'a',第二个是'b',第三个是'c',第四个是NULL,用来终止字符串。
所以...
词位是源代码文本的 5 个字符。
token在内存中总共有6个字节。
这是使用术语的正确方法吗?
(我忽略了跟踪元数据的标记,如文件名、行号和列号。)
相关问题:
让词法分析器将整数词位转换为令牌中的整数值是不常见的做法吗?还是将词位的字符存储在令牌中并让解析器阶段将这些字符转换为整数节点以附加到 AST 是否更好(或更标准)?
【问题讨论】:
-
这里离题了。但是请阅读 Dragon Book、Lexical analysis 和 Parsing 维基页面。你错了,lexeme 和lexical tokens 通常都是abstract data types,而不是输入流的一部分。一般来说,输入流在解析后会丢失
-
很多编译器(或解释器)都是free software,所以你可以研究他们的源代码....
-
在实践中,术语“token”和“lexeme”是等价的。选择一个并坚持下去。我更喜欢“词素”,因为它听起来像是来自词法分析器的东西。 (当然,“token”来自分词器 :-)。
-
关于词法分析器是否保留词位全文或进行转换的问题,这是我的建议:stackoverflow.com/questions/6320132/…
-
我给了你一个 +1 来反驳反对票。我认为你的问题是完全合理的。
标签: parsing compiler-construction lexical-analysis