Lua Academy · Oppitunti

Yksinkertainen lausekejäsennin

Rakentakaa rekursiivinen laskeutumiseen perustuva jäsennin aritmeettisille lausekkeille puhtaalla Lualla.

Oppitunti 4/414 vaihetta

Yksinkertainen lausekejäsennin on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Lua Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Tavoite: aritmeettisten lausekkeiden jäsentäminen

Rakentakaa puhtaalla Lualla rekursiivinen laskeutuva parseri, joka jäsentää ja arvioi esimerkiksi lausekkeen 3 + 4 * (2 - 1) operaattoreiden etusijajärjestystä noudattaen.

Tokenisoija

Tokenisoikaa syöte ensin luvuiksi, operaattoreiksi ja sulkeiksi.

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

Parannettu tokenisoija

Vankempi tokenisoija, joka käyttää gmatch-kuvioita.

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

Parserin tila

Parseri sisältää tokeniluettelon ja sijainnin. Apufunktiot peek ja consume siirtävät käsittelyä tokenien läpi.

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

Lausekkeiden kielioppi

Kielioppi noudattaa etusijajärjestystä:

  • expr = term ((+ | -) term)*
  • term = factor ((* | /) factor)*
  • factor = number | (expr) | -factor

Termien jäsentäminen

Jäsentäkää yhteen- ja vähennyslausekkeet jäsentämällä termit ja kokoamalla +/- vasemmalta oikealle.

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

Tekijöiden jäsentäminen

Jäsentäkää kerto- ja jakolausekkeet, mukaan lukien potenssiinkorotus.

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

Lukujen ja sulkeiden jäsentäminen

Jäsentäkää atomit: literaalit, sulkeilla ympäröidyt alilausekkeet ja unaarinen negaatio.

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

Kootaan kokonaisuus

Tokenisoikaa, jäsentäkää ja arvioikaa lauseke.

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)

Parserin laajentaminen

Lisätkää muuttujat, funktiot, vertailuoperaattorit ja merkkijonoliteraalit laajentamalla kielioppia ja lisäämällä uusia tapauksia parseFactor-funktioon.

Virheiden ilmoittaminen

Seuratkaa tokenisoijassa riviä ja saraketta. Tuottakaa merkityksellisiä virheilmoituksia: "Expected ')' at position 7, got '+'".

Parserigeneraattorit

Monimutkaisissa kieliopeissa käyttäkää parserigeneraattoreita, kuten LPEG (Parsing Expression Grammars). LPEG on paljon tehokkaampi ja ilmaisuvoimaisempi kuin käsin kirjoitettu rekursiivinen laskeutuva parseri suurten kielioppien yhteydessä.

Kysymys parserista

Mitä rekursiivinen laskeutuva parseri käyttää operaattoreiden etusijajärjestyksen toteuttamiseen?

Kertaus: yksinkertainen lausekeparseri

Rekursiivinen laskeutuva parseri käyttää yhtä funktiota jokaista kielioppisääntöä kohden ja toteuttaa operaattoreiden etusijajärjestyksen luontevasti kutsuhierarkian avulla. Tokenisoikaa ensin ja toteuttakaa sitten expr → term → factor -funktiot. Laajentakaa sitä muuttujilla ja funktioilla täydelliseksi lausekekieleksi.

Aloita maksutta

Opi Lua tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
40
Oppitunnit
159

Usein kysytyt kysymykset

Onko oppitunti ”Yksinkertainen lausekejäsennin” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “Yksinkertainen lausekejäsennin”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Lua Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Yksinkertainen lausekejäsennin”?

Rakentakaa rekursiivinen laskeutumiseen perustuva jäsennin aritmeettisille lausekkeille puhtaalla Lualla. Harjoittelet Lua Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Lua Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Lua Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Yksinkertainen lausekejäsennin”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Lua Academy-oppitunnilla?

Kyllä. Jokainen Lua Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. DSL-suunnittelun periaatteet Luassa
  2. Operaattorien ylikuormitus sujuvaa DSL:ää varten
  3. Määritys-DSL:n rakentaminen
  4. Yksinkertainen lausekejäsennin
← Takaisin: Lua Academy