令牌和词位有啥区别?

Posted

技术标签:

【中文标题】令牌和词位有啥区别?【英文标题】:What is the difference between a token and a lexeme?令牌和词位有什么区别? 【发布时间】:2013-02-03 23:18:05 【问题描述】:

在 Aho Ullman 和 Sethi 的 Compiler Construction 中,给定源程序的输入字符串被划分为具有逻辑意义的字符序列,称为标记,词位是组成令牌那么基本的区别是什么?

【问题讨论】:

【参考方案1】:

CS 研究人员和数学领域的研究人员一样,喜欢创造“新”术语。上面的答案都很好,但显然,没有那么大的需要区分令牌和词位恕我直言。它们就像代表同一事物的两种方式。一个词位是具体的——这里是一组字符;另一方面,标记是抽象的——如果有意义的话,通常指的是词位的类型及其语义值。只是我的两分钱。

【讨论】:

【参考方案2】:

使用 Aho、Lam、Sethi 和 Ullman 的“Compilers Principles, Techniques, & Tools, 2nd Ed.”(WorldCat),又名 Purple Dragon Book,

词素 pg。 111

词位是源程序中的一个字符序列 匹配标记的模式并由词法标识 分析器作为该令牌的一个实例。

代币 pg. 111

标记是由标记名称和可选属性组成的对 价值。令牌名称是一个抽象符号,代表一种 词汇单元,例如,特定的关键字或输入序列 表示标识符的字符。令牌名称是输入 解析器处理的符号。

模式 pg。 111

模式是对标记的词位可能的形式的描述 拿。在关键字作为标记的情况下,模式只是 构成关键字的字符序列。对于标识符和一些 其他标记,模式是更复杂的结构,匹配 很多字符串。

图 3.2:标记示例 pg.112

[Token]       [Informal Description]                  [Sample Lexemes]
if            characters i, f                         if
else          characters e, l, s, e                   else
comparison    < or > or <= or >= or == or !=          <=, !=
id            letter followed by letters and digits   pi, score, D2
number        any numeric constant                    3.14159, 0, 6.02e23
literal       anything but ", surrounded by "'s       "core dumped"

为了更好地理解这种与词法分析器和解析器的关系,我们将从解析器开始,然后回溯到输入。

为了更容易设计解析器,解析器不直接处理输入,而是接收由词法分析器生成的标记列表。查看图 3.2 中的令牌列,我们看到诸如 ifelsecomparisonidnumberliteral 之类的令牌;这些是令牌的名称。通常,对于词法分析器/解析器,标记是一种结构,它不仅包含标记的名称,还包含组成标记的字符/符号以及组成标记的字符串的开始和结束位置,其中用于错误报告、突出显示等的开始和结束位置。

现在词法分析器接受字符/符号的输入,并使用词法分析器的规则将输入的字符/符号转换为标记。现在使用词法分析器/解析器的人对他们经常使用的东西有自己的说法。您认为构成标记的字符/符号序列是使用词法分析器/解析器的人所说的词素。因此,当您看到词素时,只需想到代表令牌的一系列字符/符号。在比较示例中,字符/符号的序列可以是不同的模式,例如&lt;&gt;else3.14等。

另一种思考两者之间关系的方式是,标记是解析器使用的一种编程结构,它具有一个名为词素的属性,用于保存输入中的字符/符号。现在,如果您查看代码中标记的大多数定义,您可能不会将词位视为标记的属性之一。这是因为标记更有可能保存表示标记和词位的字符/符号的开始和结束位置,字符/符号的序列可以根据需要从开始和结束位置导出,因为输入是静态的。

【讨论】:

在通俗的编译器使用中,人们倾向于互换使用这两个术语。精确的区别很好,如果你需要的话。 虽然不是纯粹的计算机科学定义,但这里有一个来自自然语言处理的定义,与 Introduction to lexical semantics an individual entry in the lexicon 相关。 解释清楚。天上的事应该这样解释。 很好的解释。我还有一个疑问,我还阅读了有关解析阶段的信息,解析器从词法分析器中请求令牌,因为解析器无法验证令牌。你能解释一下在解析器阶段接受简单的输入吗?解析器什么时候从词法分析器请求标记。 @PrasannaSasne can you please explain by taking simple input at parser stage and when does parser asks for tokens from lexer. SO 不是讨论网站。这是一个新问题,需要作为一个新问题提出。【参考方案3】:

Lexeme Lexeme 被称为标记中的一系列字符(字母数字)。

令牌 令牌是可以识别为单个逻辑实体的字符序列。通常,标记是关键字、标识符、常量、字符串、标点符号、运算符。数字。

模式 由规则描述的一组字符串,称为模式。模式解释了什么是标记,这些模式是通过与标记相关联的正则表达式定义的。

【讨论】:

【参考方案4】:

词法分析器采用一系列字符识别与正则表达式匹配的词位,并将其进一步分类为标记。 因此,一个 Lexeme 是匹配的字符串,一个 Token 名称是该词位的类别。

例如,考虑下面带有输入“int foo, bar;”的标识符的正则表达式

字母(字母|数字|_)*

这里,foobar 匹配正则表达式,因此都是词位,但被归类为一个标记 ID 即标识符。

另请注意,下一阶段,即语法分析器不必知道词素而是一个标记。

【讨论】:

【参考方案5】:

Lexeme- 词位是一串字符串,是编程语言中最低级别的句法单元。

标记- 标记是一个句法类别,它形成了一个词位类别,这意味着该词位属于哪个类别,它是关键字或标识符还是其他任何内容。词法分析器的主要任务之一是创建一对词位和标记,即收集所有字符。

我们举个例子:-

如果(y

y=y-3;

词位                      Token

如果 关键字

( 左括号

y 标识符

t 标识符

) 右括号

y 标识符

=                 分配

y 标识符

_                 算术

3 整数

; 分号

Lexeme 和 Token 的关系

【讨论】:

【参考方案6】:

Lexeme - 词位是源程序中与某个标记的模式相匹配的字符序列,并被词法分析器识别为该标记的一个实例。

令牌 - 令牌是由令牌名称和可选令牌值组成的对。记号名是词法单元的一个类别。常见的记号名有

标识符:程序员选择的名称 关键字:编程语言中已有的名称 分隔符(也称为标点符号):标点符号和成对分隔符 运算符:对参数进行运算并产生结果的符号 文字:数字、逻辑、文本、参考文字

考虑一下编程语言 C 中的这个表达式:

总和 = 3 + 2;

标记化并由下表表示:

 Lexeme        Token category
------------------------------
sum      |    Identifier
 =       |    Assignment operator
 3       |    Integer literal
 +       |    Addition operator
 2       |    Integer literal
 ;       |    End of statement

【讨论】:

【参考方案7】:

让我们看看词法分析器(也称为扫描器)的工作原理

让我们举个例子:

INPUT : cout << 3+2+3;

FORMATTING PERFORMED BY SCANNER :  cout|space|<<|space|3+2+3; 

虽然不是实际输出。

扫描仪简单地重复查找源程序文本中的词汇,直到输入用尽

Lexeme 是输入的子串,它形成了语法中存在的有效终端字符串。每个词位都遵循一个pattern,并在最后解释(读者可以跳过的部分)

(重要的规则是寻找形成有效终端字符串的最长可能前缀,直到遇到下一个空格......下面解释)

词汇:

    cout

(虽然“

    3 + 2 ;

TOKENS : 每次 Scanner 找到一个(有效的)词位时,一次返回一个令牌(由 Scanner 在 Parser 请求时)。扫描器创建(如果尚未存在)符号表条目(具有属性:主要是令牌类别和少数其他属性),当它找到一个词素时,以生成它的令牌

'#' 表示符号表条目。为了便于理解,我在上面的列表中指出了词位编号,但从技术上讲,它应该是符号表中记录的实际索引。

扫描仪以指定的顺序将以下标记返回给解析器。

正如你所看到的区别,一个标记是一对不像词素是输入的子串。

这对的第一个元素是token-class/category

下面列出了令牌类:

关键词 标识符 文字 标点符号 运营商

还有一件事,Scanner 检测到空格,忽略它们并且根本不为空格形成任何标记。并非所有分隔符都是空格,空格是扫描仪用于其目的的分隔符的一种形式。输入中的 Tabs 、 Newlines 、 Spaces 、 Escaped Characters 统称为空白分隔符。很少有其他分隔符是';' ',' ':' 等,被广泛认为是构成记号的词位。

这里返回的记号总数是 8 个,但是只为词位创建了 6 个符号表条目。词位也是8个(见词位定义)

---你可以跳过这部分

A ***pattern*** is a rule ( say, a regular expression ) that is used to check if a string-of-terminals is valid or not.

If a substring of input composed only of grammar terminals is following the rule specified by any of the listed patterns , it is validated as a lexeme and selected pattern will identify the category of lexeme, else a lexical error is reported due to either (i) not following any of the rules or (ii) input consists of a bad terminal-character not present in grammar itself.

for example :

1. No Pattern Exists : In C++ , "99Id_Var" is grammar-supported string-of-terminals but is not recognised by any of patterns hence lexical error is reported .

2. Bad Input Character : $,@,unicode characters may not be supported as a valid character in few programming languages.`

【讨论】:

【参考方案8】:

LEXEME - 由形成 TOKEN 的 PATTERN 匹配的字符序列

PATTERN - 定义 TOKEN 的规则集

TOKEN - 编程语言字符集上有意义的字符集合,例如:ID、常量、关键字、运算符、标点符号、文字字符串

【讨论】:

【参考方案9】:

Lexeme 基本上是一个标记的单元,它基本上是与标记匹配的字符序列,有助于将源代码分解为标记。

例如:如果源是x=b,则词位为x=b,而标记为&lt;id, 0&gt;&lt;=&gt;&lt;id, 1&gt;

【讨论】:

答案应该更具体。举个例子可能会有用。【参考方案10】:

Token: Token 是可以被视为单个逻辑实体的字符序列。典型的令牌是, 1) 标识符 2) 关键字 3) 运营商 4) 特殊符号 5)常数

模式:输入中的一组字符串,为其生成相同的标记作为输出。这组字符串由称为与标记关联的模式的规则描述。词位:词位是源程序中与标记的模式匹配的字符序列。

【讨论】:

【参考方案11】:

当将源程序输入词法分析器时,它首先将字符分解为词素序列。然后将词位用于构建标记,其中词位被映射到标记中。一个名为 myVar 的变量将被映射到一个标记为 id, "num"> 的标记中,其中 "num" 应该指向变量在符号表中的位置。

简而言之:

词素是从字符输入流中派生出来的词。 标记是映射到标记名称和属性值的词位。

一个例子包括: x = a + b * 2 这会产生词位:x, =, a, +, b, *, 2 对应的标记:id, 0>, , id, 1>, , id, 2 >, , id, 3>

【讨论】:

它应该是 吗?因为 2 不是标识符 但是它在哪里说 x 是一个标识符?这是否意味着符号表是一个 3 列表,具有 'name'=x 、'type' ='identifier(id)'、pointer ='0' 作为特定条目?那么它必须有一些其他条目,如 'name' =while, 'type' ='keyword', 指针 ='21' ??【参考方案12】:

Token:(关键字、标识符、标点符号、多字符运算符)的种类,简单来说就是一个Token。

模式:从输入字符形成标记的规则。

Lexeme :它是 SOURCE PROGRAM 中与令牌模式匹配的字符序列。 基本上,它是 Token 的一个元素。

【讨论】:

【参考方案13】:

a) 标记是组成程序文本的实体的符号名称; 例如if 用于关键字 if,id 用于任何标识符。这些构成了输出 词法分析器。 5

(b) 模式是一种规则,它指定何时输入的字符序列 构成代币;例如,令牌 if 的序列 i、f 和任何序列 以字母开头的字母数字表示令牌 ID。

(c) 词位是输入中匹配某个模式的字符序列(因此 构成令牌的实例);例如 if 匹配 if 的模式,并且 foo123bar 匹配 id 的模式。

【讨论】:

以上是关于令牌和词位有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

用于用户身份验证的个人访问令牌和 json Web 令牌有啥区别?

具有长 TTL 的引用令牌和刷新令牌+短寿命 JWT 有啥区别?

护照谷歌oauth和护照谷歌令牌有啥区别?

ios堆栈溢出中的uuid,udid和设备令牌有啥区别

Firebase 云消息传递令牌和服务器密钥有啥区别?

当我想使 JWT 令牌无效时,JWT 和 session-cookie 有啥区别?