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:
- cout
- <<
(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)
- 3
- +
- 2
- ;
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.
<pengenal, # 1>
<Operator, # 2>
<Literal, # 3>
<Operator, # 4>
<Literal, # 5>
<Operator, # 4>
<Literal, # 3>
<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.`