在Aho Ullman和Sethi的编译器构造中,给出了源程序的输入字符串被分成具有逻辑意义的字符序列,并且被称为标记和词汇是构成令牌,那么基本的区别是什么?
答案 0 :(得分:100)
使用Aho,Lam,Sethi和Ullman的“Compilers Principles, Techniques, & Tools, 2nd Ed.”(WorldCat),AKA Purple Book,
Lexeme pg。 111
lexeme是源程序中的一系列字符 匹配令牌的模式,并由词法识别 分析器作为该令牌的一个实例。
Token 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中的令牌列,我们会看到if
,else
,comparison
,id
,number
和literal
等令牌;这些是令牌的名称。通常使用词法分析器/解析器,令牌是一种结构,它不仅包含令牌的名称,还包含构成令牌的字符/符号以及构成令牌的字符串的起始和结束位置,开始和结束位置用于错误报告,突出显示等。
现在词法分析器接受字符/符号的输入,并使用词法分析器的规则将输入的字符/符号转换为标记。现在,使用词法分析器/解析器的人对他们经常使用的东西有自己的话。您认为构成令牌的一系列字符/符号是使用词法分析器/解析器调用lexeme的人。因此,当您看到lexeme时,只需考虑表示令牌的一系列字符/符号。在比较示例中,字符/符号序列可以是不同的模式,例如<
或>
或else
或3.14
等。
另一种思考二者之间关系的方法是,令牌是解析器使用的编程结构,它具有一个名为lexeme的属性,用于保存输入中的字符/符号。现在,如果您查看代码中令牌的大多数定义,您可能看不到lexeme作为令牌的属性之一。这是因为令牌更可能保持表示令牌和词位的字符/符号的开始和结束位置,因为输入是静态的,所以可以根据需要从开始和结束位置导出字符/符号序列。 / p>
答案 1 :(得分:29)
当源程序被送入词法分析器时,它首先将字符分解为词汇序列。然后将词汇用于构造令牌,其中词汇被映射到令牌中。名为 myVar 的变量将被映射到一个标记,表示&lt; id ,&#34; num&#34;&gt;,其中&#34; num&#34;应该指向符号表中变量的位置。
不久:
一个例子包括:
x = a + b * 2
产生词汇:{x,=,a,+,b,*,2}
使用相应的令牌:{&lt; id ,0&gt;,&lt; =&gt;,&lt; id ,1&gt;,&lt; +&gt;,&lt; id ,2&gt;,&lt; *&gt;,&lt; id ,3&gt;}
答案 2 :(得分:6)
a)代币是构成程序文本的实体的符号名称; 例如如果是关键字if,则为任何标识符的id。这些构成了输出 词法分析器。 5
(b)模式是指定输入中的一系列字符的规则 构成一个象征;例如,令牌的序列i,f,以及任何序列 字母数字以令牌ID的字母开头。
(c)词汇是输入中与模式匹配的一系列字符(因此 构成一个令牌的实例);例如,如果匹配if,和的模式 foo123bar匹配id的模式。
答案 3 :(得分:5)
LEXEME - 形成TOKEN的PATTERN匹配的字符序列
PATTERN - 定义TOKEN的规则集
TOKEN - 编程语言字符集上有意义的字符集合:ID,常量,关键字,运算符,标点符号,字符串
答案 4 :(得分:4)
令牌:(关键字,标识符,标点符号,多字符运算符)的类型只是一个令牌。
模式:从输入字符形成令牌的规则。
Lexeme:它在SOURCE PROGRAM中的一系列字符与一个令牌的模式相匹配。 基本上,它是令牌的一个元素。
答案 5 :(得分:3)
令牌:令牌是一系列字符,可以视为单个逻辑实体。典型的代币是,
1)标识符
2)关键词
3)操作员
4)特殊符号
5)常数
模式:输入中的一组字符串,作为输出生成相同的标记。这组字符串由称为与令牌关联的模式的规则描述 Lexeme:词汇是源程序中的一系列字符,与令牌的模式匹配。
答案 6 :(得分:3)
让我们看看词法分析器(也称为扫描仪)的工作原理
我们来看一个示例表达式:
INPUT : cout << 3+2+3;
FORMATTING PERFORMED BY SCANNER : {cout}|space|{<<}|space|{3}{+}{2}{+}{3}{;}
虽然不是实际的输出。
扫描仪简单地查看源代码文本中的LEXEME,直到输入已经耗尽
Lexeme是输入的子字符串,它形成语法中存在的有效字符串。每个词位都遵循模式,最后会对此进行解释(读者可能最后跳过的部分)
(重要规则是寻找形成有效终端字符串的最长前缀,直到遇到下一个空格......如下所述)
LEXEMES:
(虽然“&lt;”也是有效的终端字符串,但上面提到的规则应选择lexeme“&lt;&lt;”的模式,以便生成扫描仪返回的令牌)
TOKENS:每次扫描程序找到(有效)词位时,一次返回一个标记(由Parser请求时由Scanner)。扫描程序创建(如果尚未存在)符号表条目(具有属性:主要是令牌类别和其他少数几个),当它找到词汇时,为了生成它的标记
'#'表示符号表条目。为了便于理解,我在上面的列表中指出了lexeme数字,但技术上应该是符号表中记录的实际索引。
以上示例中,扫描程序按指定顺序将以下标记返回给解析器。
&LT;标识符,#1&gt;
&LT;运营商,#2&gt;
&LT;文字,#3&gt;
&LT;运营商,#4&gt;
&LT;文字,#5&gt;
&LT;运营商,#4&gt;
&LT;文字,#3&gt;
&LT;标点符号,#6&gt;
正如你可以看到差异,一个标记是一对不同于lexeme,它是输入的子串。
该对的第一个元素是令牌类/类别
令牌类列在下面:
还有一件事,Scanner会检测到空格,忽略它们,并且根本不会为空格形成任何标记。并非所有分隔符都是空格,空格是扫描程序用于其目的的分隔符的一种形式。输入中的选项卡,换行符,空格,转义字符统称为空白分隔符。很少有其他分隔符';' ','':'等,被广泛认为是形成令牌的词汇。
此处返回的令牌总数为8,但只有6个符号表条目用于lexemes。 Lexemes也总共8个(见lexeme的定义)
---你可以跳过这部分
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.`
答案 7 :(得分:3)
Lexeme - 词汇是源程序中与令牌模式匹配的一系列字符,并由词法分析器识别为该令牌的实例。
令牌 - 令牌是由令牌名称和可选令牌值组成的对。令牌名称是词法单元的类别。常用令牌名称是
在编程语言C中考虑这个表达式:
sum = 3 + 2;
标记并由下表表示:
Lexeme Token category
------------------------------
sum | Identifier
= | Assignment operator
3 | Integer literal
+ | Addition operator
2 | Integer literal
; | End of statement
答案 8 :(得分:2)
Lexeme - lexeme是一串字符,是编程语言中最低级别的语法单元。
令牌 - 令牌是一个语法类别,它构成一个词类,意味着词汇所属的类是关键字或标识符或其他任何类。词法分析器的主要任务之一是创建一对词法和标记,即收集所有字符。
让我们举一个例子: -
if(y <= t)
<强> Y = Y-3; 强>
如果 KEYWORD
( 左父母
ÿ IDENTIFIER
&LT; = 比较
吨 IDENTIFIER
) 正确的父母
ÿ IDENTIFIER
= ASSGNMENT
ÿ IDENTIFIER
_ ARITHMATIC
3 INTEGER
<强> 强> SEMICOLON
Lexeme与令牌之间的关系
答案 9 :(得分:1)
与Math的研究人员一样,CS研究人员也喜欢创建“新”术语。上面的答案都很不错,但是显然,不需要如此区分令牌和词位恕我直言。它们就像两种表示同一事物的方式。一个词素是具体的-这里是一组字符;另一方面,令牌是抽象的-如果有意义,通常指代词素的类型及其语义值。只是我的两分钱。
答案 10 :(得分:0)
词素词素被称为令牌中的字符序列(字母数字)。
令牌令牌是可以识别为单个逻辑实体的一系列字符。通常,令牌是关键字,标识符,常量,字符串,标点符号,运算符。数字。
模式一组由规则描述的字符串,称为模式。模式解释了什么可以是令牌,并且这些模式是通过与令牌相关联的正则表达式定义的。
答案 11 :(得分:-1)
词法分析器采用一系列字符来识别与正则表达式匹配的词素,并将其进一步分类为标记。 因此,Lexeme是匹配的字符串,并且令牌名称是该Lexeme的类别。
例如,考虑在正则表达式下面查找带有输入“ int foo,bar;”的标识符。
字母(字母|数字| _)*
在这里,foo
和bar
匹配正则表达式,因此都是词素,但被归类为一个令牌ID
,即标识符。
还请注意,下一阶段,即语法分析器不必知道lexeme而是令牌。
答案 12 :(得分:-2)
Lexeme基本上是令牌的单位,它基本上是与令牌匹配的字符序列,有助于将源代码分解为令牌。
例如:如果来源为x=b
,那么词汇将为x
,=
,b
,而令牌将为<id, 0>
,{ {1}},<=>
。