Lua Academy · Pelajaran

Penghurai Ungkapan Ringkas

Bina penghurai penurunan rekursif untuk ungkapan aritmetik dalam Lua tulen.

Pelajaran 4 daripada 414 langkah

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
end

Penukaran 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
end

Keadaan 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}
end

Tatabahasa 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
end

Menghurai 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
end

Menghurai 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
end

Menggabungkan 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.

Percuma untuk bermula

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

  1. Prinsip Reka Bentuk DSL dalam Lua
  2. Lebihan Beban Operator untuk Kefasihan DSL
  3. Membina DSL Konfigurasi
  4. Penghurai Ungkapan Ringkas
← Kembali ke Lua Academy