Penghurai Ungkapan Ringkas
Bina penghurai penurunan rekursif untuk ungkapan aritmetik dalam Lua tulen.
Penghurai Ungkapan Ringkas ialah pelajaran Lua Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Lua Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.
Matlamat: Menghurai Ungkapan Aritmetik
Bina penghurai penurunan rekursif dalam Lua tulen yang menghuraikan dan menilai ungkapan seperti 3 + 4 * (2 - 1), sambil mematuhi keutamaan operator.
Penukaran kepada Token
Mula-mula, pecahkan input kepada nombor, operator dan tanda kurung.
local function tokenize(expr)
local tokens = {}
for tok in expr:gmatch("[%d%.]+|[%+%-%*/%(%)%^]|%S") do
tokens[#tokens+1] = tok
end
return tokens
endPenukaran Token yang Dipertingkatkan
Penukar token yang lebih mantap menggunakan corak gmatch.
local function tokenize(expr)
local tokens = {}
for tok in expr:gmatch("%d+%.?%d*|[%+%-%*/%(%)%^]") do
tokens[#tokens+1] = tok
end
return tokens
endKeadaan Penghurai
Penghurai menyimpan senarai token dan satu kedudukan. Fungsi pembantu peek dan consume bergerak melalui token.
local function newParser(tokens)
local pos = 1
local function peek() return tokens[pos] end
local function consume() pos = pos + 1; return tokens[pos-1] end
return {peek=peek, consume=consume}
endTatabahasa untuk Ungkapan
Tatabahasa ini mematuhi keutamaan:
- ungkapan = sebutan ((+ | -) sebutan)*
- sebutan = faktor ((* | /) faktor)*
- faktor = nombor | (ungkapan) | -faktor
Menghurai Sebutan
Hurai ungkapan tambah-tolak dengan menghuraikan sebutan dan menggabungkan operasi +/- dari kiri ke kanan.
local parseExpr, parseTerm, parseFactor
parseExpr = function(p)
local val = parseTerm(p)
while p.peek() == "+" or p.peek() == "-" do
local op = p.consume()
local right = parseTerm(p)
if op == "+" then val = val + right
else val = val - right end
end
return val
endMenghurai Faktor
Hurai ungkapan darab-bahagi, termasuk pemangkatan.
parseTerm = function(p)
local val = parseFactor(p)
while p.peek() == "*" or p.peek() == "/" do
local op = p.consume()
local right = parseFactor(p)
if op == "*" then val = val * right
else val = val / right end
end
return val
endMenghurai Nombor dan Tanda Kurung
Hurai atom: literal, subungkapan dalam tanda kurung dan penafian unari.
parseFactor = function(p)
local tok = p.peek()
if tok == "(" then
p.consume() -- (
local val = parseExpr(p)
p.consume() -- )
return val
elseif tok == "-" then
p.consume()
return -parseFactor(p)
else
return tonumber(p.consume())
end
endMenggabungkan Semuanya
Tukarkan kepada token, hurai dan nilai suatu ungkapan.
local function eval(expr)
local tokens = tokenize(expr)
local parser = newParser(tokens)
return parseExpr(parser)
end
print(eval("3 + 4 * 2")) -- 11
print(eval("(3 + 4) * 2")) -- 14
print(eval("2 ^ 10")) -- 1024 (if ^ is supported)Melanjutkan Penghurai
Tambahkan pemboleh ubah, fungsi, operator perbandingan dan literal rentetan dengan melanjutkan tatabahasa serta menambahkan kes baharu pada parseFactor.
Pelaporan Ralat
Jejaki baris dan lajur dalam penukar token. Timbulkan ralat yang bermakna: "Expected ')' at position 7, got '+'".
Penjana Penghurai
Untuk tatabahasa yang kompleks, gunakan penjana penghurai seperti LPEG (Tatabahasa Ungkapan Penghuraian). LPEG jauh lebih berkuasa dan ekspresif berbanding penurunan rekursif yang ditulis secara manual untuk tatabahasa besar.
Soalan Penghurai
Apakah yang digunakan oleh penghurai penurunan rekursif untuk menguatkuasakan keutamaan operator?
Ulang Kaji: Penghurai Ungkapan Ringkas
Penghurai penurunan rekursif menggunakan satu fungsi bagi setiap peraturan tatabahasa, lalu menguatkuasakan keutamaan operator secara semula jadi melalui hierarki panggilan. Tokenkan input dahulu, then laksanakan fungsi ungkapan → sebutan → faktor. Lanjutkan penghurai dengan pemboleh ubah dan fungsi untuk membina bahasa ungkapan yang lengkap.
Pelajari Lua dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 40
- Pelajaran
- 159
Soalan Lazim
Adakah pelajaran “Penghurai Ungkapan Ringkas” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Lua Academy, termasuk “Penghurai Ungkapan Ringkas”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Penghurai Ungkapan Ringkas”?
Bina penghurai penurunan rekursif untuk ungkapan aritmetik dalam Lua tulen. Anda berlatih Lua Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Lua Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Lua Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “Penghurai Ungkapan Ringkas” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Lua Academy ini?
Ya. Setiap pelajaran Lua Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Prinsip Reka Bentuk DSL dalam Lua
- Lebihan Beban Operator untuk Kefasihan DSL
- Membina DSL Konfigurasi
- Penghurai Ungkapan Ringkas