Lua Academy · Lektion

Simpel udtryksparser

Opbyg en rekursiv descent-parser til aritmetiske udtryk i ren Lua.

Lektion 4 af 414 trin

Simpel udtryksparser er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Lua Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Lua Academy-kurset indeholder 4 lektioner i alt.

Mål: Analysér aritmetiske udtryk

Opbyg en rekursiv descent-parser i ren Lua, som analyserer og evaluerer udtryk som 3 + 4 * (2 - 1) og respekterer operatorprioriteten.

Tokenisering

Tokenisér først inddataene til tal, operatorer og parenteser.

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

Forbedret tokenisering

En mere robust tokeniseringsfunktion, der bruger gmatch-mønstre.

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

Parsertilstand

Parseren indeholder en tokenliste og en position. Hjælpefunktionerne peek og consume bevæger sig gennem tokens.

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

Grammatik for udtryk

Grammatikken respekterer operatorprioriteten:

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

Analyse af led

Analysér additive udtryk ved at analysere led og sammenkæde +/- fra venstre mod højre.

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

Analyse af faktorer

Analysér multiplikative udtryk, herunder potensopløftning.

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

Analyse af tal og parenteser

Analysér atomer: literaler, underudtryk i parentes og unær negation.

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

Sæt det hele sammen

Tokenisér, analysér og evaluér et udtryk.

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)

Udvidelse af parseren

Tilføj variabler, funktioner, sammenligningsoperatorer og strengliteraler ved at udvide grammatikken og tilføje nye tilfælde til parseFactor.

Fejlrapportering

Registrér linje og kolonne i tokeniseringsfunktionen. Udløs sigende fejl: "Expected ')' at position 7, got '+'".

Parsergeneratorer

Brug parsergeneratorer som LPEG (grammatikker for parseudtryk) til komplekse grammatikker. LPEG er langt mere kraftfuld og udtryksfuld end en håndskrevet rekursiv descent-parser til store grammatikker.

Spørgsmål om parseren

Hvad bruger en rekursiv descent-parser til at håndhæve operatorprioriteten?

Opsamling: Enkel udtryksparser

En rekursiv descent-parser bruger én funktion pr. grammatikregel og håndhæver naturligt operatorprioriteten gennem kaldhierarkiet. Tokenisér først, og implementér derefter funktionerne expr → term → factor. Udvid parseren med variabler og funktioner for at få et komplet udtrykssprog.

Gratis at komme i gang

Lær Lua med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
40
Lektioner
159

Ofte stillede spørgsmål

Er lektionen “Simpel udtryksparser” gratis?

Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “Simpel udtryksparser”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Lua Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Simpel udtryksparser”?

Opbyg en rekursiv descent-parser til aritmetiske udtryk i ren Lua. Du øver dig i Lua Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Lua Academy?

Der kræves ingen tidligere erfaring. Lua Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “Simpel udtryksparser”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Lua Academy-lektion?

Ja. Alle Lua Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Principper for DSL-design i Lua
  2. Operatoroverbelastning til flydende DSL'er
  3. Opbygning af en konfigurations-DSL
  4. Simpel udtryksparser
← Tilbage til Lua Academy