令牌和lexeme有什么区别?

时间:2013-02-19 10:02:19

标签: compiler-construction compilation

在Aho Ullman和Sethi的编译器构造中,给出了源程序的输入字符串被分成具有逻辑意义的字符序列,并且被称为标记和词汇是构成令牌,那么基本的区别是什么?

13 个答案:

答案 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中的令牌列,我们会看到ifelsecomparisonidnumberliteral等令牌;这些是令牌的名称。通常使用词法分析器/解析器,令牌是一种结构,它不仅包含令牌的名称,还包含构成令牌的字符/符号以及构成令牌的字符串的起始和结束位置,开始和结束位置用于错误报告,突出显示等。

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

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

答案 1 :(得分:29)

当源程序被送入词法分析器时,它首先将字符分解为词汇序列。然后将词汇用于构造令牌,其中词汇被映射到令牌中。名为 myVar 的变量将被映射到一个标记,表示&lt; id ,&#34; num&#34;&gt;,其中&#34; num&#34;应该指向符号表中变量的位置。

不久:

  • Lexemes是从字符输入流派生的单词。
  • 标记是映射到令牌名称和属性值的词汇。


一个例子包括:
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:

  1. COUT
  2. &LT;&LT;
  3.   

    (虽然“&lt;”也是有效的终端字符串,但上面提到的规则应选择lexeme“&lt;&lt;”的模式,以便生成扫描仪返回的令牌)

    1. 3
    2. +
    3. 2
    4. TOKENS:每次扫描程序找到(有效)词位时,一次返回一个标记(由Parser请求时由Scanner)。扫描程序创建(如果尚未存在)符号表条目(具有属性:主要是令牌类别和其他少数几个),当它找到词汇时,为了生成它的标记

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

      以上示例中,扫描程序按指定顺序将以下标记返回给解析器。

      1. &LT;标识符,#1&gt;

      2. &LT;运营商,#2&gt;

      3. &LT;文字,#3&gt;

      4. &LT;运营商,#4&gt;

      5. &LT;文字,#5&gt;

      6. &LT;运营商,#4&gt;

      7. &LT;文字,#3&gt;

      8. &LT;标点符号,#6&gt;

      9. 正如你可以看到差异,一个标记是一对不同于lexeme,它是输入的子串。

        该对的第一个元素是令牌类/类别

        令牌类列在下面:        

      10. 关键字
      11.    
      12. IDENTIFIERS
      13.    
      14. 文字
      15.    
      16. 标点符号
      17.    
      18.    

          

        还有一件事,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 - 词汇是源程序中与令牌模式匹配的一系列字符,并由词法分析器识别为该令牌的实例。

令牌 - 令牌是由令牌名称和可选令牌值组成的对。令牌名称是词法单元的类别。常用令牌名称是

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

在编程语言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;

Lexeme Token

  

如果      KEYWORD

     

(   左父母

     

ÿ      IDENTIFIER

     

&LT; =   比较

     

吨      IDENTIFIER

     

)   正确的父母

     

ÿ      IDENTIFIER

     

= ASSGNMENT

     

ÿ   IDENTIFIER

     

_ ARITHMATIC

     

3   INTEGER

     

<强>   SEMICOLON

Lexeme与令牌之间的关系

Relation between lexeme and token

答案 9 :(得分:1)

与Math的研究人员一样,CS研究人员也喜欢创建“新”术语。上面的答案都很不错,但是显然,不需要如此区分令牌和词位恕我直言。它们就像两种表示同一事物的方式。一个词素是具体的-这里是一组字符;另一方面,令牌是抽象的-如果有意义,通常指代词素的类型及其语义值。只是我的两分钱。

答案 10 :(得分:0)

词素词素被称为令牌中的字符序列(字母数字)。

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

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

答案 11 :(得分:-1)

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

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

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

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

还请注意,下一阶段,即语法分析器不必知道lexeme而是令牌。

答案 12 :(得分:-2)

Lexeme基本上是令牌的单位,它基本上是与令牌匹配的字符序列,有助于将源代码分解为令牌。

例如:如果来源为x=b,那么词汇将为x=b,而令牌将为<id, 0>,{ {1}},<=>