Eenvoudige expressieparser
Bouw een recursive-descentparser voor rekenkundige expressies in pure Lua
Eenvoudige expressieparser is een gratis Lua Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Lua Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Lua Academy bevat in totaal 4 lessen.
Doel: rekenkundige expressies parseren
Bouw in puur Lua een parser voor recursieve afdaling die expressies zoals 3 + 4 * (2 - 1) parseert en evalueert, met behoud van de prioriteit van operatoren.
Tokenisering
Tokeniseer eerst de invoer in getallen, operatoren en haakjes.
local function tokenize(expr)
local tokens = {}
for tok in expr:gmatch("[%d%.]+|[%+%-%*/%(%)%^]|%S") do
tokens[#tokens+1] = tok
end
return tokens
endVerbeterde tokeniseerder
Een robuustere tokeniseerder die patronen van gmatch gebruikt.
local function tokenize(expr)
local tokens = {}
for tok in expr:gmatch("%d+%.?%d*|[%+%-%*/%(%)%^]") do
tokens[#tokens+1] = tok
end
return tokens
endParserstatus
De parser bevat een tokenlijst en een positie. De hulpfuncties peek en consume gaan door de tokens heen.
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}
endGrammatica voor expressies
De grammatica houdt rekening met prioriteit:
- expr = term ((+ | -) term)*
- term = factor ((* | /) factor)*
- factor = number | (expr) | -factor
Termen parseren
Parseer optel-expressies door termen te parseren en +/- van links naar rechts samen te vouwen.
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
endFactoren parseren
Parseer vermenigvuldigings-expressies, inclusief machtsverheffing.
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
endGetallen en haakjes parseren
Parseer atomen: literalen, expressies tussen haakjes en unair negatief maken.
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
endAlles samenvoegen
Tokeniseer, parseer en evalueer een expressie.
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)De parser uitbreiden
Voeg variabelen, functies, vergelijkingsoperatoren en stringliteralen toe door de grammatica uit te breiden en nieuwe gevallen aan parseFactor toe te voegen.
Foutmeldingen
Houd regel en kolom bij in de tokeniseerder. Geef betekenisvolle fouten: "Expected ')' at position 7, got '+'".
Parsergeneratoren
Gebruik voor complexe grammatica's parsergeneratoren zoals LPEG (grammatica's voor het parseren van expressies). LPEG is voor grote grammatica's veel krachtiger en expressiever dan recursieve afdaling die je met de hand schrijft.
Vraag over parsers
Wat gebruikt een parser voor recursieve afdaling om de prioriteit van operatoren af te dwingen?
Samenvatting: eenvoudige expressieparser
Een parser voor recursieve afdaling gebruikt één functie per grammaticaregel en dwingt zo op natuurlijke wijze de prioriteit van operatoren af via de aanroepingshiërarchie. Tokeniseer eerst en implementeer daarna de functies expr → term → factor. Breid dit uit met variabelen en functies voor een volledige expressietaal.
Leer Lua met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 40
- Lessen
- 159
Veelgestelde vragen
Is de les “Eenvoudige expressieparser” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad Lua Academy, waaronder “Eenvoudige expressieparser”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Lua Academy bevat in totaal 4 lessen.
Wat leer ik in “Eenvoudige expressieparser”?
Bouw een recursive-descentparser voor rekenkundige expressies in pure Lua Je oefent met Lua Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Lua Academy te beginnen?
Ervaring vooraf is niet nodig. Lua Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.
Hoe lang duurt de les “Eenvoudige expressieparser”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Lua Academy?
Ja. Elke les over Lua Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Ontwerpprincipes voor DSL's in Lua
- Operatoroverloading voor vloeiende DSL's
- Een configuratie-DSL bouwen
- Eenvoudige expressieparser