В чем разница между токеном и лексемой?

86

В «Конструировании компилятора» Ахо Уллмана и Сетхи указано, что входная строка символов исходной программы делится на последовательность символов, имеющих логическое значение и называемых токенами, а лексемы - это последовательности, составляющие токен, и что в чем принципиальная разница?

user1707873
источник

Ответы:

118

Используя " Принципы, методы и инструменты компиляторов, 2-е изд. " (WorldCat) Ахо, Лам, Сетхи и Уллман, также известная как Книга Пурпурного Дракона ,

Лексема стр. 111

Лексема - это последовательность символов в исходной программе, которая соответствует шаблону для токена и идентифицируется лексическим анализатором как экземпляр этого токена.

Жетон стр. 111

Токен - это пара, состоящая из имени токена и необязательного значения атрибута. Имя токена - это абстрактный символ, представляющий своего рода лексическую единицу, например, конкретное ключевое слово или последовательность входных символов, обозначающих идентификатор. Имена токенов - это входные символы, которые обрабатывает анализатор.

Выкройка стр. 111

Шаблон - это описание формы, которую могут принимать лексемы токена. В случае ключевого слова как лексемы шаблон - это просто последовательность символов, образующих ключевое слово. Для идентификаторов и некоторых других токенов шаблон представляет собой более сложную структуру, которой соответствует множество строк.

Рисунок 3.2: Примеры токенов стр.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; это названия токенов. Обычно в лексере / парсере токен представляет собой структуру, которая содержит не только имя токена, но и символы / символы, составляющие токен, а также начальную и конечную позицию строки символов, составляющих токен, с начальная и конечная позиции, используемые для сообщения об ошибках, выделения и т. д.

Теперь лексер принимает вводимые символы / символы и, используя правила лексера, преобразует введенные символы / символы в токены. Теперь у людей, которые работают с лексером / парсером, есть свои слова для того, что они часто используют. То, что вы думаете о последовательности символов / символов, составляющих токен, люди, использующие лексеры / парсеры, называют лексемой. Поэтому, когда вы видите лексему, просто подумайте о последовательности символов / символов, представляющих токен. В сравнительном примере последовательность знаков / символов может представлять собой различные шаблоны, такие как <или >или elseили 3.14и т. Д.

Другой способ подумать о взаимосвязи между ними состоит в том, что токен - это программная структура, используемая анализатором, которая имеет свойство, называемое лексемой, которое содержит символ / символы из ввода. Теперь, если вы посмотрите на большинство определений токена в коде, вы можете не увидеть лексему как одно из свойств токена. Это связано с тем, что токен, скорее всего, будет содержать начальную и конечную позицию символов / символов, которые представляют токен и лексему, последовательность символов / символов может быть получена из начальной и конечной позиции по мере необходимости, поскольку входной сигнал является статическим.

Гай Кодер
источник
12
В разговорной речи компиляторы люди склонны использовать эти два термина как синонимы. Точное различие - это хорошо, если и когда вам это нужно.
Ира Бакстер
Это определение не является чисто информативным, но оно относится к обработке естественного языка и имеет отношение к an individual entry in the lexicon
Guy Coder
Абсолютно понятное объяснение. Вот как следует объяснять вещи на небесах.
Тимур Файзрахманов
отличное объяснение. У меня есть еще одно сомнение, я также читал про этап синтаксического анализа, парсер запрашивает токены у лексического анализатора, так как парсер не может проверить токены. не могли бы вы объяснить, вводя простой ввод на этапе парсера, и когда парсер запрашивает токены у лексера.
Прасанна Сасне,
@PrasannaSasne can you please explain by taking simple input at parser stage and when does parser asks for tokens from lexer.SO не является дискуссионным сайтом. Это новый вопрос, и его нужно задавать как новый.
Guy Coder
36

Когда исходная программа загружается в лексический анализатор, она начинается с разбиения символов на последовательности лексем. Затем лексемы используются при построении токенов, в которых лексемы отображаются в токены. Переменная с именем myVar будет отображаться в токен с указанием < id , "num">, где "num" должно указывать на расположение переменной в таблице символов.

Вкратце поставил:

  • Лексемы - это слова, полученные из потока ввода символов.
  • Токены - это лексемы, отображаемые в имя токена и значение атрибута.


Пример включает:
x = a + b * 2,
что дает лексемы: {x, =, a, +, b, *, 2}
с соответствующими токенами: {< id , 0>, <=>, < id , 1 >, <+>, < id , 2>, <*>, < id , 3>}

Уильям
источник
2
Это должно быть <id, 3>? потому что 2 не является идентификатором
Адитья
но где написано, что x - это идентификатор? Означает ли это, что таблица символов представляет собой таблицу с 3 столбцами, имеющую 'name' = x, 'type' = 'identifier (id)', pointer = '0' как конкретную запись? тогда она должна иметь какую-то другую запись, например 'name' = while, 'type' = 'keyword', pointer = '21 '??
8

а) Токены - это символические имена сущностей, составляющих текст программы; например, if для ключевого слова if и id для любого идентификатора. Они составляют результат работы лексического анализатора. 5

(b) Шаблон - это правило, определяющее, когда последовательность символов из ввода составляет токен; например, последовательность i, f для токена if и любая буквенно-цифровая последовательность, начинающаяся с буквы для идентификатора токена.

(c) лексема - это последовательность символов из входных данных, которые соответствуют шаблону (и, следовательно, составляют экземпляр токена); например, if соответствует шаблону для if, а foo123bar соответствует шаблону для id.

Shasmoe
источник
8

LEXEME - Последовательность символов, соответствующих ШАБЛОНУ, образующему ЖЕТОН

ШАБЛОН - набор правил, определяющих ТОКЕН

ТОКЕН - значащий набор символов над набором символов языка программирования, например: ID, Константа, Ключевые слова, Операторы, Пунктуация, Литеральная строка.

Шраван Кумар
источник
7

Лексема - лексема - это последовательность символов в исходной программе, которая соответствует шаблону для токена и идентифицируется лексическим анализатором как экземпляр этого токена.

Токен - токен - это пара, состоящая из имени токена и необязательного значения токена. Имя токена - это категория лексической единицы.

  • идентификаторы: имена, которые выбирает программист
  • ключевые слова: имена уже на языке программирования
  • разделители (также известные как знаки пунктуации): знаки препинания и парные разделители.
  • операторы: символы, которые работают с аргументами и производят результаты
  • литералы: числовые, логические, текстовые, ссылочные литералы

Рассмотрим это выражение на языке программирования C:

сумма = 3 + 2;

Токенизированы и представлены в следующей таблице:

 Lexeme        Token category
------------------------------
sum      |    Identifier
 =       |    Assignment operator
 3       |    Integer literal
 +       |    Addition operator
 2       |    Integer literal
 ;       |    End of statement
Раджат Бхатт
источник
5

Посмотрим, как работает лексический анализатор (он же Сканер)

Возьмем пример выражения:

INPUT : cout << 3+2+3;

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

но не фактический результат.

СКАНЕР ПРОСТО ПОВТОРНО ИЩЕТ ЛЕКСЕМ В ТЕКСТЕ ИСТОЧНИКА ПРОГРАММЫ, ПОКА ВХОД ИСЧЁТ

Лексема - это подстрока ввода, которая образует допустимую строку терминалов, присутствующую в грамматике. Каждая лексема следует шаблону, который объясняется в конце (часть, которую читатель может наконец пропустить)

(Важное правило - искать максимально длинный префикс, образующий допустимую строку терминалов, пока не встретится следующий пробел ... объяснено ниже)

ЛЕКСЕМЫ:

  1. cout
  2. <<

(хотя «<» также является допустимой строкой терминала, но вышеупомянутое правило должно выбирать шаблон для лексемы «<<», чтобы сгенерировать токен, возвращаемый сканером)

  1. 3
  2. +
  3. 2
  4. ;

ЖЕТОНЫ: токены возвращаются по одному (Сканером по запросу Парсера) каждый раз, когда Сканер находит (действительную) лексему. Сканер создает, если еще не присутствует, запись в таблице символов (с атрибутами: в основном, категория-токен и несколько других) , когда он находит лексему, чтобы сгенерировать ее токен.

'#' обозначает запись в таблице символов. Я указал на номер лексемы в приведенном выше списке для простоты понимания, но технически это должен быть фактический индекс записи в таблице символов.

Следующие токены возвращаются сканером парсеру в указанном порядке для примера выше.

  1. <идентификатор, # 1>

  2. <Оператор, №2>

  3. <Литерал, # 3>

  4. <Оператор, №4>

  5. <Литерал, # 5>

  6. <Оператор, №4>

  7. <Литерал, # 3>

  8. <Пунктуатор, # 6>

Как видите разницу, токен - это пара, в отличие от лексемы, которая является подстрокой ввода.

И первый элемент пары - это токен-класс / категория.

Классы токенов перечислены ниже:

  • КЛЮЧЕВЫЕ СЛОВА
  • ИДЕНТИФИКАТОРЫ
  • ЛИТЕРАЛЫ
  • ПУНКТЮАТОРЫ
  • ОПЕРАТОРЫ
  • И еще одно: Scanner обнаруживает пробелы, игнорирует их и вообще не формирует токен для пробелов. Не все разделители являются пробелами, пробелы - это одна из форм разделителей, используемых сканерами для этой цели. Табуляция, перевод строки, пробелы, экранированные символы во вводе все вместе называются разделителями пробелов. Несколько других разделителей - это ";" ',' ':' и т. д., которые широко известны как лексемы, образующие токен.

    Общее количество возвращаемых токенов здесь равно 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.`
    
    Маянк Нарула
    источник
    5

    Лексема - Лексема - это строка символов, которая является синтаксической единицей самого низкого уровня в языке программирования.

    Токен - токен - это синтаксическая категория, которая формирует класс лексем, который означает, к какому классу принадлежит лексема, является ли это ключевым словом, идентификатором или чем-то еще. Одна из основных задач лексического анализатора - создать пару лексем и токенов, то есть собрать все символы.

    Возьмем пример: -

    если (y <= t)

    у = у-3;

    Токен лексемы

    если KEYWORD

    (ЛЕВЫЙ ПАРЕНТЕЗ

    y ИДЕНТИФИКАТОР

    <= СРАВНЕНИЕ

    t ИДЕНТИФИКАТОР

    ) ПРАВИЛЬНЫЙ ПАРЕНТЕЗ

    y ИДЕНТИФИКАТОР

    = ПРИЗНАНИЕ

    y ИДЕНТИФИКАТОР

    _ АРИФМАТИЧЕСКИЙ

    3 INTEGER

    ;                                    ТОЧКА С ЗАПЯТОЙ

    Связь между лексемой и токеном

    Связь между лексемой и токеном

    coding_ninza
    источник
    4

    Токен: тип (ключевые слова, идентификатор, знаки препинания, многосимвольные операторы) просто является токеном.

    Pattern: Правило формирования токена из вводимых символов.

    Лексема: это последовательность символов в ПРОГРАММЕ ИСТОЧНИКА, соответствующая шаблону для токена. По сути, это элемент Token.

    грязь
    источник
    3

    Токен: токен - это последовательность символов, которую можно рассматривать как единый логический объект. Типичными токенами являются:
    1) идентификаторы
    2) ключевые слова
    3) операторы
    4) специальные символы
    5) константы.

    Шаблон: набор строк на входе, для которых такой же токен создается в качестве вывода. Этот набор строк описывается правилом, называемым шаблоном, связанным с токеном.
    Лексема: лексема - это последовательность символов в исходной программе, которая соответствует образцу токена.

    прадип
    источник
    1

    Лексема Лексемами называется последовательность символов (буквенно-цифровых) в токене.

    Токен Токен - это последовательность символов, которую можно идентифицировать как единый логический объект. Обычно токенами являются ключевые слова, идентификаторы, константы, строки, знаки препинания, операторы. числа.

    Шаблон Набор строк, описываемых правилом, называемым шаблоном. Шаблон объясняет, что может быть токеном, и эти шаблоны определяются с помощью регулярных выражений, связанных с токеном.

    user10715886
    источник
    1

    Исследователи CS, как и математики, любят создавать «новые» термины. Все ответы выше хороши, но, очевидно, нет такой большой необходимости различать токены и лексемы, ИМХО. Они похожи на два способа представить одно и то же. Лексема конкретна - здесь набор символов; лексема, с другой стороны, абстрактна - обычно относится к типу лексемы вместе с ее семантическим значением, если это имеет смысл. Всего два цента.

    Zell
    источник
    0

    Lexical Analyzer берет последовательность символов, определяет лексему, которая соответствует регулярному выражению, и затем классифицирует ее как токен. Таким образом, лексема - это соответствующая строка, а имя токена - это категория этой лексемы.

    Например, рассмотрим ниже регулярное выражение для идентификатора с вводом «int foo, bar;»

    буква (буква | цифра | _) *

    Здесь fooи barсоответствует регулярному выражению, таким образом, обе лексемы, но классифицируются как один токен, IDто есть идентификатор.

    Также обратите внимание, что следующая фаза, то есть синтаксический анализатор, должна знать не лексему, а токен.

    Викрам Барандвал
    источник
    -2

    Lexeme - это, по сути, единица токена, и это в основном последовательность символов, которая соответствует токену и помогает разбить исходный код на токены.

    Например: Если источник x=b, то лексема будет x, =, bи жетоны бы <id, 0>, <=>, <id, 1>.

    Отправить Halder
    источник
    Ответ должен быть более конкретным. Пример может быть полезен.
    Зверев Евгений