0Pricing
Lua Academy · Ders

Basit İfade Ayrıştırıcısı

Salt Lua ile aritmetik ifadeler için özyinelemeli iniş ayrıştırıcısı oluşturun.

Basit İfade Ayrıştırıcısı, CoddyKit'te ücretsiz bir Lua Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Lua Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Lua Academy kursu toplamda 4 dersten oluşur.

Amaç: Aritmetik İfadeleri Ayrıştırma

Operatör önceliğine uyarak 3 + 4 * (2 - 1) gibi ifadeleri ayrıştırıp değerlendiren, yalnızca Lua ile yazılmış özyinelemeli iniş ayrıştırıcısı oluşturun.

Belirteçlere Ayırma

Öncelikle girişi sayılara, operatörlere ve parantezlere ayırın.

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

Geliştirilmiş Belirteçlere Ayırma

gmatch kalıplarını kullanan daha dayanıklı bir belirteçleyici.

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

Ayrıştırıcı Durumu

Ayrıştırıcı bir belirteç listesi ve konum taşır. peek ve consume yardımcı işlevleri belirteçler arasında ilerler.

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

İfadeler için Dilbilgisi

Dilbilgisi önceliğe uyar:

  • ifade = terim ((+ | -) terim)*
  • terim = çarpan ((* | /) çarpan)*
  • çarpan = sayı | (ifade) | -çarpan

Terimleri Ayrıştırma

Terimleri ayrıştırarak ve +/- işlemlerini soldan sağa katlayarak toplamsal ifadeleri ayrıştırın.

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

Çarpanları Ayrıştırma

Üs alma da dahil olmak üzere çarpımsal ifadeleri ayrıştırın.

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

Sayıları ve Parantezleri Ayrıştırma

Temel öğeleri ayrıştırın: sabitleri, parantez içindeki alt ifadeleri ve tekli olumsuzlamayı.

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

Birleştirme

Bir ifadeyi belirteçlere ayırın, ayrıştırın ve değerlendirin.

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)

Ayrıştırıcıyı Genişletme

Dilbilgisini genişletip parseFactor işlevine yeni durumlar ekleyerek değişkenler, işlevler, karşılaştırma operatörleri ve dize sabitleri ekleyin.

Hata Bildirimi

Belirteçleyicide satır ve sütun bilgilerini izleyin. Anlamlı hatalar oluşturun: "Expected ')' at position 7, got '+'".

Ayrıştırıcı Oluşturucuları

Karmaşık dilbilgileri için LPEG gibi ayrıştırıcı oluşturucuları kullanın (Ayrıştırma İfade Dilbilgileri). Büyük dilbilgilerinde LPEG, elle yazılmış özyinelemeli iniş yönteminden çok daha güçlü ve ifade edicidir.

Ayrıştırıcı Sorusu

Özyinelemeli iniş ayrıştırıcısı, operatör önceliğini uygulamak için ne kullanır?

Özet: Basit İfade Ayrıştırıcısı

Özyinelemeli iniş ayrıştırıcısı, her dilbilgisi kuralı için bir işlev kullanır ve çağrı hiyerarşisi aracılığıyla operatör önceliğini doğal olarak uygular. Önce belirteçlere ayırın, then ifade → terim → çarpan işlevlerini uygulayın. Tam bir ifade dili için değişkenler ve işlevlerle genişletin.

Sıkça Sorulan Sorular

“Basit İfade Ayrıştırıcısı” dersi ücretsiz mi?

Evet — “Basit İfade Ayrıştırıcısı” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Lua Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Lua Academy kursu toplamda 4 dersten oluşur.

“Basit İfade Ayrıştırıcısı” dersinde ne öğreneceğim?

Salt Lua ile aritmetik ifadeler için özyinelemeli iniş ayrıştırıcısı oluşturun. Lua Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Lua Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Lua Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.

“Basit İfade Ayrıştırıcısı” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Lua Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Lua Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Lua'da DSL Tasarım İlkeleri
  2. DSL Akıcılığı için Operatör Aşırı Yükleme
  3. Yapılandırma DSL'i Oluşturma
  4. Basit İfade Ayrıştırıcısı
← Lua Academy Sayfasına Dön