Yksinkertainen lausekejäsennin
Rakentakaa rekursiivinen laskeutumiseen perustuva jäsennin aritmeettisille lausekkeille puhtaalla Lualla.
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
endParannettu 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
endParserin 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}
endLausekkeiden 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
endTekijö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
endLukujen 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
endKootaan 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.
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
- DSL-suunnittelun periaatteet Luassa
- Operaattorien ylikuormitus sujuvaa DSL:ää varten
- Määritys-DSL:n rakentaminen
- Yksinkertainen lausekejäsennin