Lua Academy · Les

Eenvoudige expressieparser

Bouw een recursive-descentparser voor rekenkundige expressies in pure Lua

Les 4 van 414 stappen

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
end

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

Parserstatus

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

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

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

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

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

Gratis beginnen

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

  1. Ontwerpprincipes voor DSL's in Lua
  2. Operatoroverloading voor vloeiende DSL's
  3. Een configuratie-DSL bouwen
  4. Eenvoudige expressieparser
← Terug naar Lua Academy