У чому різниця між лексемою та лексемою?


86

У побудові компілятора Ахо Уллмана та Сетхі дано, що вхідний рядок символів вихідної програми поділяється на послідовність символів, що мають логічне значення, і відомі як лексеми, а лексеми - це послідовності, що складають маркер, так що це основна різниця?

Відповіді:


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 ; це назви лексем. Зазвичай для лексера / синтаксичного аналізатора маркер - це структура, що містить не тільки ім'я маркера, але символи / символи, що складають маркер, і початкову та кінцеву позицію рядка символів, що складають маркер, з початкове та кінцеве положення, що використовуються для повідомлення про помилки, виділення тощо.

Тепер лексер бере введення символів / символів і використовуючи правила лексера перетворює введені символи / символи в лексеми. Зараз люди, які працюють з lexer / parser, мають власні слова щодо речей, якими вони часто користуються. Те, що ви вважаєте послідовністю символів / символів, що складають маркер, те, що люди, які використовують лексер / парсери, називають лексемою. Отже, коли ви бачите лексему, просто подумайте про послідовність символів / символів, що представляють маркер. У прикладі порівняння послідовність символів / символів може бути різними візерунками, такими як <або >або elseабо 3.14тощо.

Інший спосіб думати про взаємозв'язок між ними полягає в тому, що маркер - це структура програмування, що використовується парсером, що має властивість, що називається лексемою, що містить символ / символи з вводу. Тепер, якщо ви подивитесь на більшість визначень маркера в коді, ви можете не розглядати лексему як одне з властивостей маркера. Це пов’язано з тим, що маркер, швидше за все, утримуватиме початкову та кінцеву позицію символів / символів, що представляють маркер і лексему, послідовність символів / символів може бути виведена з початкової та кінцевої позицій за необхідності, оскільки введення статичне.


12
При використанні розмовного компілятора люди, як правило, використовують два терміни як взаємозамінні. Точне розрізнення приємне, якщо і коли воно вам потрібно.
Ira Baxter

Хоча це не суто визначення інформатики, ось одне з обробки природної мови, яке має значення з Вступу до лексичної семантики 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 не є дискусійним сайтом. Це нове питання, і його потрібно поставити як нове питання.
Гай Кодер,

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 - це не ідентифікатор
Aditya

але де сказано, що х - ідентифікатор? чи означає це, що символьна таблиця - це 3-стовпчаста таблиця, що має як ім'я '= x,' type '=' ідентифікатор (id) ', pointer =' 0 'як певний запис? тоді вона повинна мати інший запис, такий як' name ' = while, 'type' = 'ключове слово', покажчик = '21 '??

8

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

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

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


8

ЛЕКСЕМА - Послідовність символів, відповіднаних ШАБЛОНУ, що утворює ЖЕТОН

ШАБЛОН - набір правил, що визначають ЛОКЕН

TOKEN - Значущий набір символів над набором символів мови програмування, наприклад: ID, Constant, Keywords, Operators, Punctuation, Literal String


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. кут
  2. <<

(хоча "<" також є дійсним терміналом-рядком, але вищезазначене правило вибирає шаблон для лексеми "<<" для того, щоб генерувати маркер, повернутий сканером)

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

ЛОКЕНИ: Токени повертаються по черзі (Сканером на запит Парсера) кожного разу, коли Сканер знаходить (дійсну) лексему. Сканер створює запис таблиці символів, якщо він ще не присутній (має атрибути: в основному категорія маркерів та кілька інших) , коли знаходить лексему, щоб згенерувати її маркер

"#" позначає запис таблиці символів. Я вказав номер лексеми у наведеному вище списку для зручності розуміння, але технічно він повинен бути фактичним індексом запису в таблиці символів.

Наступні маркери повертаються сканером до синтаксичного аналізатора у вказаному порядку для наведеного вище прикладу.

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

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

  3. <Буквальний, №3>

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

  5. <Буквальний, №5>

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

  7. <Буквальний, №3>

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

Як ви можете бачити різницю, маркер - це пара, на відміну від лексеми, яка є підрядком введення.

І першим елементом пари є маркер-клас / категорія

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

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

    Загальна кількість повернутих лексем тут 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)

    y = y-3;

    Лексема Жетон

    якщо КЛЮЧОВЕ СЛОВО

    (ЛІВИЙ ПАРЕНТЕЗ

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

    <= ПОРІВНЕННЯ

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

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

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

    = ЗАДАННЯ

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

    _ АРИТМАТИЧНИЙ

    3 ЦІЛИЙ

    ;                                    НАПІВКОЛОН

    Співвідношення між лексемою та жетоном

    Співвідношення між лексемою та лексемою


    4

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

    Шаблон: Правило формування токена із введених символів.

    Лексема: це послідовність символів у ПРОГРАМІ ДЖЕРЕЛА, що відповідає шаблону для маркера. В основному, це елемент Token.


    3

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

    Шаблон: набір рядків у вхідних даних, для яких той самий маркер створюється як вихідний. Цей набір рядків описується правилом, яке називається шаблоном, асоційованим з маркером.
    Лексема: Лексема - це послідовність символів у вихідній програмі, яка відповідає шаблону для маркера.


    1

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

    Токен Токен - це послідовність символів, яку можна ідентифікувати як єдину логічну сутність. Зазвичай маркери - це ключові слова, ідентифікатори, константи, рядки, пунктуаційні символи, оператори. числа.

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


    1

    Дослідники CS, як і математики, захоплюються створенням "нових" термінів. Наведені вище відповіді приємні, але, мабуть, немає такої великої потреби розрізняти лексеми та лексеми IMHO. Вони схожі на два способи представити одне і те ж. Лексема конкретна - тут набір символів; лексема, навпаки, абстрактна - як правило, посилається на тип лексеми разом із її семантичним значенням, якщо це має сенс. Лише мої два центи.


    0

    Лексичний аналізатор бере послідовність символів, визначає лексему, яка відповідає регулярному виразу, і надалі класифікує її на маркер. Таким чином, лексема відповідає рядку, а назва лексеми є категорією цієї лексеми.

    Наприклад, розглянемо нижче регулярний вираз для ідентифікатора із введенням "int foo, bar;"

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

    Тут, fooі barзбіг регулярного виразу, таким чином, є обома лексемами, але класифікуються як один маркер, IDтобто ідентифікатор.

    Також зверніть увагу, що наступний етап, тобто аналізатор синтаксису, повинен знати не про лексему, а про маркер.


    -2

    Лексема в основному є одиницею маркера, і це в основному послідовність символів, яка відповідає маркеру і допомагає розбити вихідний код на маркери.

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


    Відповідь повинна бути більш конкретною. Приклад може бути корисним.
    Звєрєв Євген
    Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
    Licensed under cc by-sa 3.0 with attribution required.