0Pricing
Lua Academy · Pelajaran

Parser Ekspresi Sederhana

Bangun parser recursive descent untuk ekspresi aritmetika dalam Lua murni.

Parser Ekspresi Sederhana adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.

Tujuan: Mengurai Ekspresi Aritmetika

Bangun pengurai penurunan rekursif dalam Lua murni yang mengurai dan mengevaluasi ekspresi seperti 3 + 4 * (2 - 1) dengan mengikuti prioritas operator.

Tokenisasi

Pertama, lakukan tokenisasi terhadap masukan menjadi bilangan, 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
end

Tokenisasi yang Disempurnakan

Tokenisasi yang lebih tangguh menggunakan pola gmatch.

local function tokenize(expr)
  local tokens = {}
  for tok in expr:gmatch("%d+%.?%d*|[%+%-%*/%(%)%^]") do
    tokens[#tokens+1] = tok
  end
  return tokens
end

Keadaan Pengurai

Pengurai membawa daftar token dan sebuah posisi. Fungsi pembantu peek dan consume bergerak maju menelusuri 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}
end

Tata Bahasa untuk Ekspresi

Tata bahasa ini mengikuti prioritas:

  • ekspresi = suku ((+ | -) suku)*
  • suku = faktor ((* | /) faktor)*
  • faktor = bilangan | (ekspresi) | -faktor

Mengurai Suku

Urai ekspresi penjumlahan dengan mengurai suku, lalu menggabungkan +/- 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
end

Mengurai Faktor

Urai ekspresi perkalian, termasuk perpangkatan.

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
end

Mengurai Bilangan dan Tanda Kurung

Urai atom: literal, subekspresi dalam tanda kurung, dan negasi 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
end

Menggabungkan Semuanya

Lakukan tokenisasi, penguraian, dan evaluasi terhadap sebuah ekspresi.

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)

Memperluas Pengurai

Tambahkan variabel, fungsi, operator perbandingan, dan literal string dengan memperluas tata bahasa serta menambahkan kasus baru ke parseFactor.

Pelaporan Kesalahan

Lacak baris dan kolom dalam tokenisasi. Munculkan kesalahan yang bermakna: "Expected ')' at position 7, got '+'".

Pembuat Pengurai

Untuk tata bahasa yang kompleks, gunakan pembuat pengurai seperti LPEG (Tata Bahasa Ekspresi Penguraian). LPEG jauh lebih kuat dan ekspresif daripada penguraian penurunan rekursif yang ditulis secara manual untuk tata bahasa berukuran besar.

Pertanyaan tentang Pengurai

Apa yang digunakan pengurai penurunan rekursif untuk menerapkan prioritas operator?

Ringkasan: Pengurai Ekspresi Sederhana

Pengurai penurunan rekursif menggunakan satu fungsi untuk setiap aturan tata bahasa, sehingga prioritas operator diterapkan secara alami melalui hierarki pemanggilan. Lakukan tokenisasi terlebih dahulu, lalu implementasikan fungsi ekspresi → suku → faktor. Perluas dengan variabel dan fungsi untuk membangun bahasa ekspresi lengkap.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Parser Ekspresi Sederhana” gratis?

Ya — teks lengkap “Parser Ekspresi Sederhana” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Parser Ekspresi Sederhana”?

Bangun parser recursive descent untuk ekspresi aritmetika dalam Lua murni. Kamu berlatih Lua Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Lua Academy?

Tidak diperlukan pengalaman sebelumnya. Lua Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Parser Ekspresi Sederhana” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Lua Academy ini?

Ya. Setiap pelajaran Lua Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Prinsip Desain DSL dalam Lua
  2. Pembebanan Operator untuk Keluwesan DSL
  3. Membangun DSL Konfigurasi
  4. Parser Ekspresi Sederhana
← Kembali ke Lua Academy