Apa perbedaan antara token dan lexeme?

86

Pada Compiler Construction oleh Aho Ullman dan Sethi, diberikan bahwa string input karakter program sumber dibagi menjadi urutan karakter yang memiliki arti logis, dan dikenal sebagai token dan lexemes adalah urutan yang membentuk token jadi apa. apakah perbedaan dasarnya?

pengguna1707873
sumber

Jawaban:

120

Menggunakan " Prinsip Penyusun, Teknik, & Alat, Edisi ke-2 " (WorldCat) oleh Aho, Lam, Sethi dan Ullman, AKA Buku Naga Ungu ,

Lexeme hal. 111

Lexeme adalah urutan karakter dalam program sumber yang cocok dengan pola token dan diidentifikasi oleh penganalisis leksikal sebagai turunan dari token itu.

Token hal. 111

Token adalah pasangan yang terdiri dari nama token dan nilai atribut opsional. Nama token adalah simbol abstrak yang mewakili jenis unit leksikal, misalnya, kata kunci tertentu, atau urutan karakter input yang menunjukkan pengenal. Nama token adalah simbol input yang diproses parser.

Pola pg. 111

Pola adalah deskripsi bentuk yang dapat diambil oleh leksem token. Dalam kasus kata kunci sebagai token, polanya hanyalah urutan karakter yang membentuk kata kunci. Untuk pengenal dan beberapa token lainnya, polanya merupakan struktur yang lebih kompleks yang dicocokkan dengan banyak string.

Gambar 3.2: Contoh token hal.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"

Untuk lebih memahami hubungan ini dengan lexer dan parser, kita akan mulai dengan parser dan bekerja mundur ke input.

Untuk mempermudah mendesain parser, parser tidak bekerja dengan input secara langsung tetapi mengambil daftar token yang dihasilkan oleh lexer. Melihat kolom tanda pada Gambar 3.2 kita melihat token seperti if, else, comparison, id, numberdan literal; ini adalah nama token. Biasanya dengan lexer / parser, token adalah struktur yang tidak hanya menyimpan nama token, tetapi juga karakter / simbol yang menyusun token dan posisi awal dan akhir dari string karakter yang membentuk token, dengan posisi awal dan akhir digunakan untuk pelaporan kesalahan, penyorotan, dll.

Sekarang lexer mengambil input karakter / simbol dan menggunakan aturan lexer mengubah karakter / simbol input menjadi token. Sekarang orang yang bekerja dengan lexer / parser memiliki kata-kata sendiri untuk hal-hal yang sering mereka gunakan. Apa yang Anda anggap sebagai urutan karakter / simbol yang membentuk token adalah apa yang oleh orang menggunakan lexer / parsers disebut lexeme. Jadi ketika Anda melihat lexeme, pikirkan saja urutan karakter / simbol yang mewakili sebuah token. Dalam contoh perbandingan, urutan karakter / simbol dapat berupa pola yang berbeda seperti <atau >atau elseatau 3.14, dll.

Cara lain untuk memikirkan hubungan antara keduanya adalah bahwa token adalah struktur pemrograman yang digunakan oleh parser yang memiliki properti bernama lexeme yang menyimpan karakter / simbol dari input. Sekarang jika Anda melihat sebagian besar definisi token dalam kode, Anda mungkin tidak melihat lexeme sebagai salah satu properti token. Hal ini dikarenakan sebuah token akan lebih cenderung menahan posisi awal dan akhir dari karakter / simbol yang merepresentasikan token dan lexeme, urutan karakter / simbol dapat diturunkan dari posisi awal dan akhir sesuai kebutuhan karena inputnya statis.

Guy Coder
sumber
12
Dalam penggunaan kompilator sehari-hari, orang cenderung menggunakan dua istilah tersebut secara bergantian. Perbedaan yang tepat itu bagus, jika dan saat Anda membutuhkannya.
Ira Baxter
Meskipun bukan definisi ilmu komputer murni, ini adalah salah satu dari pemrosesan bahasa alami yang memiliki relevansi dari Pengantar semantik leksikal an individual entry in the lexicon
Guy Coder
Penjelasan yang sangat jelas. Beginilah seharusnya hal-hal dijelaskan di surga.
Timur Fayzrakhmanov
penjelasan yang bagus. Saya punya satu keraguan lagi, saya juga membaca tentang tahap parsing, parser meminta token dari penganalisis leksikal, karena parser tidak dapat memvalidasi token. dapatkah Anda menjelaskan dengan mengambil masukan sederhana pada tahap parser dan kapan parser meminta token dari lexer.
Prasanna Sasne
@PrasannaSasne can you please explain by taking simple input at parser stage and when does parser asks for tokens from lexer.SO bukan situs diskusi. Itu adalah pertanyaan baru dan perlu ditanyakan sebagai pertanyaan baru.
Guy Coder
37

Ketika program sumber dimasukkan ke dalam penganalisis leksikal, program itu dimulai dengan memecah karakter menjadi urutan leksem. Leksem kemudian digunakan dalam pembangunan token, di mana leksem dipetakan menjadi token. Variabel bernama myVar akan dipetakan menjadi token yang menyatakan < id , "num">, di mana "num" harus menunjuk ke lokasi variabel dalam tabel simbol.

Singkatnya:

  • Leksem adalah kata-kata yang diturunkan dari aliran input karakter.
  • Token adalah leksem yang dipetakan menjadi nama token dan nilai atribut.


Contohnya termasuk:
x = a + b * 2
Yang menghasilkan lexemes: {x, =, a, +, b, *, 2}
Dengan token yang sesuai: {< id , 0>, <=>, < id , 1 >, <+>, < id , 2>, <*>, < id , 3>}

William
sumber
2
Apakah seharusnya <id, 3>? karena 2 bukan pengenal
Aditya
tapi di mana dikatakan bahwa x adalah pengenal? apakah itu berarti tabel simbol adalah tabel 3 kolom yang memiliki 'name' = x, 'type' = 'identifier (id)', pointer = '0' sebagai entri tertentu? maka harus memiliki entri lain seperti 'name' = while, 'type' = 'keyword', pointer = '21 '??
8

a) Token adalah nama simbolis untuk entitas yang membentuk teks program; misal jika untuk kata kunci if, dan id untuk pengenal apapun. Ini membentuk keluaran dari penganalisis leksikal. 5

(b) Pola adalah aturan yang menentukan kapan urutan karakter dari input merupakan token; misalnya urutan i, f untuk token jika, dan urutan alfanumerik apa pun yang dimulai dengan huruf untuk id token.

(c) Lexeme adalah urutan karakter dari input yang cocok dengan pola (dan karenanya merupakan turunan dari token); misalnya jika cocok dengan pola jika, dan foo123bar cocok dengan pola untuk id.

shasmoe
sumber
8

LEXEME - Urutan karakter yang cocok dengan PATTERN membentuk TOKEN

POLA - Himpunan aturan yang mendefinisikan TOKEN

TOKEN - Kumpulan karakter yang bermakna di atas kumpulan karakter bahasa pemrograman misalnya: ID, Konstanta, Kata Kunci, Operator, Tanda Baca, String Literal

sravan kumar
sumber
7

Lexeme - Lexeme adalah urutan karakter dalam program sumber yang cocok dengan pola token dan diidentifikasi oleh penganalisis leksikal sebagai turunan dari token itu.

Token - Token adalah pasangan yang terdiri dari nama token dan nilai token opsional. Nama token adalah kategori unit leksikal. Nama token umum adalah

  • pengidentifikasi: nama yang dipilih programmer
  • kata kunci: nama sudah ada dalam bahasa pemrograman
  • pemisah (juga dikenal sebagai punctuators): karakter tanda baca dan pembatas berpasangan
  • operator: simbol yang beroperasi pada argumen dan menghasilkan hasil
  • literals: numerik, logika, tekstual, literal referensi

Pertimbangkan ungkapan ini dalam bahasa pemrograman C:

jumlah = 3 + 2;

Ditandai dan diwakili oleh tabel berikut:

 Lexeme        Token category
------------------------------
sum      |    Identifier
 =       |    Assignment operator
 3       |    Integer literal
 +       |    Addition operator
 2       |    Integer literal
 ;       |    End of statement
Rajat Bhatt
sumber
5

Mari kita lihat cara kerja penganalisis leksikal (juga disebut Scanner)

Mari kita ambil contoh ekspresi:

INPUT : cout << 3+2+3;

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

bukan keluaran sebenarnya.

PEMINDAI HANYA MENCARI BERULANG UNTUK LEXEME DALAM TEKS PROGRAM SUMBER SAMPAI INPUT DIHAPUS

Lexeme adalah substring input yang membentuk string-of-terminal valid yang ada dalam tata bahasa. Setiap leksem mengikuti pola yang dijelaskan di bagian akhir (bagian yang akhirnya dilewati oleh pembaca)

(Aturan penting adalah mencari awalan terpanjang yang membentuk string-of-terminal yang valid hingga spasi berikutnya ditemukan ... dijelaskan di bawah)

LEXEMES:

  1. cout
  2. <<

(meskipun "<" juga merupakan terminal-string yang valid tetapi aturan yang disebutkan di atas akan memilih pola untuk lexeme "<<" untuk menghasilkan token yang dikembalikan oleh pemindai)

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

TOKEN: Token dikembalikan satu per satu (oleh Scanner ketika diminta oleh Parser) setiap kali Scanner menemukan lexeme (valid). Pemindai membuat, jika belum ada, entri tabel-simbol (memiliki atribut: terutama kategori-token dan beberapa lainnya) , ketika ia menemukan sebuah lexeme, untuk menghasilkan tokennya

'#' menunjukkan entri tabel simbol. Saya telah menunjuk ke nomor lexeme dalam daftar di atas untuk memudahkan pemahaman tetapi secara teknis harus indeks catatan aktual dalam tabel simbol.

Token berikut dikembalikan oleh pemindai ke parser dalam urutan yang ditentukan untuk contoh di atas.

  1. <pengenal, # 1>

  2. <Operator, # 2>

  3. <Literal, # 3>

  4. <Operator, # 4>

  5. <Literal, # 5>

  6. <Operator, # 4>

  7. <Literal, # 3>

  8. <Punctuator, # 6>

Seperti yang Anda lihat perbedaannya, token adalah pasangan tidak seperti lexeme yang merupakan substring input.

Dan elemen pertama dari pasangan tersebut adalah token-class / category

Kelas Token terdaftar di bawah ini:

  • KATA KUNCI
  • IDENTIFIER
  • LITERAL
  • PUNCTUATOR
  • OPERATOR
  • Dan satu hal lagi, Pemindai mendeteksi spasi putih, mengabaikannya, dan sama sekali tidak membentuk token apa pun untuk spasi. Tidak semua pembatas adalah spasi, spasi adalah salah satu bentuk pembatas yang digunakan oleh pemindai untuk tujuannya. Tabs, Newlines, Spaces, Escaped Characters in input semuanya secara kolektif disebut Pembatas spasi. Beberapa pembatas lainnya adalah ';' ',' ':' etc, yang secara luas dikenal sebagai lexemes yang membentuk token.

    Jumlah token yang dikembalikan adalah 8 di sini, namun hanya 6 entri tabel simbol yang dibuat untuk leksem. Leksem juga berjumlah 8 (lihat definisi leksem)

    --- Anda dapat melewati bagian ini

    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.`
    
    Mayank narula
    sumber
    5

    Lexeme - Leksem adalah rangkaian karakter yang merupakan unit sintaksis tingkat terendah dalam bahasa pemrograman.

    Token - Token adalah kategori sintaksis yang membentuk kelas lexemes yang berarti kelas mana dari lexeme itu apakah itu kata kunci atau pengenal atau yang lainnya. Salah satu tugas utama dari penganalisis leksikal adalah membuat sepasang leksem dan token, yaitu mengumpulkan semua karakter.

    Mari kita ambil contoh:-

    jika (y <= t)

    y = y-3;

    Token Lexeme

    jika KEYWORD

    (ORANG TUA KIRI

    y IDENTIFIER

    <= PERBANDINGAN

    t IDENTIFIER

    ) ORANG TUA KANAN

    y IDENTIFIER

    = PENUGASAN

    y IDENTIFIER

    _ ARITMATIK

    3 INTEGER

    ;                                    TITIK KOMA

    Hubungan antara Lexeme dan Token

    Hubungan antara lexeme dan token

    coding_ninza
    sumber
    4

    Token: Jenis untuk (kata kunci, pengenal, karakter tanda baca, operator multi-karakter), sederhananya, adalah Token.

    Pola: Aturan untuk pembentukan token dari karakter masukan.

    Lexeme: Ini adalah urutan karakter dalam PROGRAM SUMBER yang cocok dengan pola untuk sebuah token. Pada dasarnya, ini adalah elemen Token.

    mud1t
    sumber
    4

    Token: Token adalah urutan karakter yang dapat diperlakukan sebagai entitas logis tunggal. Token tipikal adalah,
    1) Pengidentifikasi
    2) kata kunci
    3) operator
    4) simbol khusus
    5) konstanta

    Pola: Sekumpulan string dalam masukan yang token yang sama diproduksi sebagai keluaran. Kumpulan string ini dijelaskan oleh aturan yang disebut pola yang terkait dengan token.
    Lexeme: Lexeme adalah urutan karakter dalam program sumber yang cocok dengan pola token.

    pradip
    sumber
    1

    Lexeme Lexemes dikatakan sebagai urutan karakter (alfanumerik) dalam sebuah token.

    Token Token adalah urutan karakter yang dapat diidentifikasi sebagai entitas logis tunggal. Biasanya token adalah kata kunci, pengenal, konstanta, string, simbol tanda baca, operator. nomor.

    Pola Sekumpulan string yang dijelaskan oleh aturan yang disebut pola. Pola menjelaskan apa yang bisa menjadi token dan pola ini didefinisikan dengan ekspresi reguler, yang terkait dengan token.

    pengguna10715886
    sumber
    1

    Peneliti Ilmu Komputer, seperti yang berasal dari Matematika, gemar membuat istilah "baru". Jawaban di atas semuanya bagus tetapi tampaknya, tidak ada kebutuhan yang begitu besar untuk membedakan token dan lexemes IMHO. Mereka seperti dua cara untuk merepresentasikan hal yang sama. Leksem adalah konkret - di sini satu set karakter; token, di sisi lain, bersifat abstrak - biasanya mengacu pada jenis leksem bersama dengan nilai semantiknya jika itu masuk akal. Hanya dua sen saya.

    zell
    sumber
    0

    Lexical Analyzer mengambil urutan karakter yang mengidentifikasi leksem yang cocok dengan ekspresi reguler dan selanjutnya mengkategorikannya ke token. Jadi, Lexeme cocok dengan string dan nama Token adalah kategori dari lexeme itu.

    Misalnya, pertimbangkan ekspresi reguler di bawah ini untuk pengenal dengan input "int foo, bar;"

    huruf (huruf | angka | _) *

    Di sini, foodan barcocok dengan ekspresi reguler keduanya adalah leksem tetapi dikategorikan sebagai satu token, IDyaitu pengenal.

    Perhatikan juga, tahap selanjutnya yaitu penganalisis sintaks tidak perlu tahu tentang lexeme tetapi token.

    vikram barandwal
    sumber
    -2

    Lexeme pada dasarnya adalah unit token dan pada dasarnya adalah urutan karakter yang cocok dengan token dan membantu memecah kode sumber menjadi token.

    Sebagai contoh: Jika sumber adalah x=b, maka leksem akan x, =, bdan token akan <id, 0>, <=>, <id, 1>.

    Kirimkan halder
    sumber
    Jawabannya harus lebih spesifik. Contoh bisa bermanfaat.
    Zverev Evgeniy