В чем разница между токеном и лексемой?
при построении компилятора Aho Ullman и Sethi задается, что входная строка символов исходной программы разделена на последовательность символов, которые имеют логическое значение, и известны как токены, а лексемы-это последовательности, которые составляют токен, так в чем же основное различие?
10 ответов:
через "принципы, методы и инструменты компиляторов, 2-е изд."(WorldCat) АХО, Лам, Сэти и Уллман, он же Фиолетовый Книги,
лексема pg. 111
лексема-это последовательность символов в исходной программе, которая соответствует шаблону для токена и идентифицируется лексическим анализатор как экземпляр этого токена.
маркер pg. 111
токен-это пара, состоящая из имени токена и необязательного атрибута значение. Имя токена-это абстрактный символ, представляющий собой вид лексическая единица, например, конкретное ключевое слово, или последовательность ввода символы, обозначающие идентификатор. Имена токенов являются входными данными символы, которые обрабатывает парсер.
Pattern 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; это имена токенов. Обычно с лексером/синтаксическим анализатором токен-это структура, которая содержит не только имя токена, но и символы / символы, составляющие токен, а также начальную и конечную позицию строки символов, составляющих токен, с начальной и конечной позицией используется для сообщения об ошибках, выделения и т. д.теперь лексер принимает ввод символов/символов и с помощью правил лексера преобразует входные символы / символы в токены. Теперь у людей, которые работают с lexer / parser, есть свои собственные слова для вещей, которые они часто используют. То, что вы думаете о последовательности символов/символов, которые составляют токен, - это то, что люди, которые используют лексеры/Парсеры, называют лексемой. Поэтому, когда вы видите лексему, просто подумайте о последовательности символов/символов представление токена. В примере сравнения последовательность символов / символов может быть разной, например
<или>илиelseили3.14и т. д.другой способ думать о связи между ними заключается в том, что токен-это программная структура, используемая синтаксическим анализатором, которая имеет свойство под названием лексема, которая содержит символ/символы из входных данных. Теперь, если вы посмотрите на большинство определений токена в коде, вы можете не увидеть лексему как одно из свойств знак. Это связано с тем, что токен, скорее всего, будет содержать начальную и конечную позицию символов/символов, представляющих токен и лексему, последовательность символов/символов может быть получена из начальной и конечной позиции по мере необходимости, поскольку вход статичен.
когда исходная программа подается в лексический анализатор, она начинается с разбиения символов на последовательности лексем. Затем лексемы используются при построении токенов, в которых лексемы отображаются в токены. Переменная с именем myVar будет отображаться в маркер с указанием id," num">, где" num " должно указывать на расположение переменной в таблице символов.
коротко:
- лексемы являются слова, полученные из потока ввода символов.
- токены-это лексемы, сопоставленные с именем токена и значением атрибута.
Пример включает в себя:
x = a + b * 2
Что дает лексемы: {x,=, a,+, b,*, 2}
С соответствующими маркерами: { id, 0>, , id, 1>, , id, 2>, , id, 3>}
A) токены-это символические имена для сущностей, составляющих текст программы; например, если для ключевого слова if и id для любого идентификатора. Это выход лексический анализатор. 5
(b) шаблон-это правило, которое определяет, когда последовательность символов из входных данных представляет собой токен; например, последовательность i, f для токена if и любая последовательность буквенно-цифровые символы, начинающиеся с буквы для идентификатора токена.
(c) лексема-это последовательность символов из входных данных, которые соответствуют шаблону (и, следовательно, составляют экземпляр токена); например, если соответствует шаблону для if, и foo123bar соответствует шаблону для удостоверения личности.
маркер: вид для (ключевые слова,идентификатор, знак препинания ,многозначные операторы)-это просто маркер.
Pattern: правило формирования токена из входных символов.
лексема: ее последовательность символов в исходной программе соответствует шаблону для токена. В принципе, это элемент токена.
лексема - последовательность символов, соответствующих шаблону, образующему токен
PATTERN - набор правил, определяющих токен
TOKEN - осмысленная коллекция символов над набором символов языка программирования ex: ID, Константа, ключевые слова, операторы, пунктуация, Литеральная строка
знак: токен-это последовательность символов, которую можно рассматривать как единый логический объект. Типичные маркеры,
1) идентификаторы
2) ключевые слова
3) операторов
4) специальных символов
5)константышаблон: набор строк на входе, для которых создается тот же токен, что и на выходе. Этот набор строк описывается правилом, называемым шаблоном, связанным с токеном.
лексемы: лексемой является последовательность символов в исходной программе, которая соответствует шаблону для маркера.
давайте посмотрим, как работает лексический анализатор (также называемый сканером )
давайте возьмем пример выражения:
INPUT : cout << 3+2+3; FORMATTING PERFORMED BY SCANNER : {cout}|space|{<<}|space|{3}{+}{2}{+}{3}{;}не фактический объем .
СКАНЕР ПРОСТО ИЩЕТ ЛЕКСЕМУ В ИСХОДНОМ ТЕКСТЕ ПРОГРАММЫ ДО ТЕХ ПОР, ПОКА ВВОД НЕ БУДЕТ ИСЧЕРПАН
лексема-это подстрока ввода, которая формирует допустимую строку терминалов, присутствующую в грамматике . Каждая лексема следует за pattern что объяснил в конце (часть, которую читатель может пропустить наконец)
(важное правило состоит в том, чтобы искать самый длинный возможный префикс, формирующий допустимую строку терминалов, пока не встретится следующий пробел ... объяснено ниже )
лексемы :
- cout
(хотя "
- 3
- +
- 2
- ;
маркеры : токены возвращаются по одному ( сканером по запросу парсера) каждый раз, когда сканер находит (допустимую) лексему. Сканер создает, если он еще не присутствует, запись таблицы символов (имея атрибуты: в основном токен-категория и несколько других) , когда он находит лексему, чтобы сгенерировать ее токен
' # ' обозначает запись таблицы символов . Я указал на номер лексемы в приведенном выше списке для удобства понимания, но технически это должен быть фактический индекс записи в таблице символов.
следующие маркеры возвращаются сканером синтаксическому анализатору в указанном порядке для приведенного выше примера.
как вы можете увидеть разницу , маркер-это пара, в отличие от лексемы, которая является подстрокой ввода.
и первый элементом пары является токен-класс / категория
классы токенов перечислены ниже:
ключевые слова коды литералы знаки пунктуации операторы и еще одна вещь , сканер обнаруживает пробелы , игнорирует их и не образует никакого маркера для пробела вообще. Не все разделители являются пробелами, пробел-это одна из форм разделителя, используемого сканерами для своей цели . Вкладки , новые строки , пробелы, экранированные символы во входных данных все вместе называются разделителями пробелов. Несколько других разделителей - это';'','': 'и т. д., которые широко известны как лексемы, образующие маркер.
общее количество возвращенных токенов составляет 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 isfollowing the rule specified by any of the listed patterns , it isvalidated as a lexeme and selected pattern will identify the categoryof lexeme, else a lexical error is reported due to either (i) notfollowing any of the rules or (ii) input consists of a badterminal-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.`
лексема - лексема-это последовательность символов в исходной программе, которая соответствует шаблону для токена и идентифицируется лексическим анализатором как экземпляр этого токена.
маркер - токен-это пара, состоящая из имени токена и необязательного значения токена. Имя токена-это категория лексической единицы.Общие имена токенов
- идентификаторы: имена программист выбирает
- ключевые слова: имена уже на языке программирования
- разделители (также известные как знаки препинания): знаки препинания и парные разделители
- операторы: символы, которые работают с аргументами и дают результаты
- литералы: числовые, логические, текстовые, справочные литералы
рассмотрим это выражение в языке программирования C:
sum = 3 + 2;
обозначено и представлено следующей таблицей:
Lexeme Token category ------------------------------ sum | Identifier = | Assignment operator 3 | Integer literal + | Addition operator 2 | Integer literal ; | End of statement
лексема- лексема-это строка символов, которая является синтаксической единицей самого низкого уровня в языке программирования.
маркер- токен-это синтаксическая категория, которая образует класс лексем, что означает, к какому классу принадлежит лексема это ключевое слово или идентификатор или что-нибудь еще. Одной из основных задач лексического анализатора является создание пары лексем и токенов, то есть сбор всех письмена.
давайте возьмем пример: -
если(y
y=y-3;
Маркер Лексемы
Если Ключевое слово
( ЛЕВАЯ СКОБКА
y Идентификатор
t Идентификатор
) ПРАВАЯ СКОБКА
y Идентификатор
= ASSGNMENT
y Идентификатор
_ ARITHMATIC
3 Целое число
; Точка с запятой
связь между лексемой и токеном
лексема-это в основном единица токена, и это в основном последовательность символов, которая соответствует токену и помогает разбить исходный код на токены.
например: если источник
x=b, тогда лексемы были быx,=,bи жетоны будут<id, 0>,<=>,<id, 1>.

Comments