Lua Academy · leksjon

Enkel uttrykksparser

Bygg en rekursiv nedstigningsparser for aritmetiske uttrykk i ren Lua.

Leksjon 4 av 414 trinn

Enkel uttrykksparser er en gratis leksjon i Lua Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Lua Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Lua Academy inneholder totalt 4 leksjoner.

Mål: Analysere aritmetiske uttrykk

Bygg en rekursiv nedstigningsparser i ren Lua som analyserer og evaluerer uttrykk som 3 + 4 * (2 - 1), og som overholder operatorprioriteten.

Tokenisering

Tokeniser først inndataene til tall, 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 mer robust tokeniserer som bruker 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 inneholder en tokenliste og en posisjon. Hjelpefunksjonene peek og consume går gjennom tokenene.

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

Grammatikk for uttrykk

Grammatikken overholder prioriteten:

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

Analysere termer

Analyser additive uttrykk ved å analysere termer og akkumulere +/- fra venstre mot høyre.

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

Analysere faktorer

Analyser multiplikative uttrykk, inkludert eksponentiering.

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

Analysere tall og parenteser

Analyser atomer: litteraler, underuttrykk i parentes og unær negasjon.

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

Sette alt sammen

Tokeniser, analyser og evaluer et uttrykk.

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)

Utvide parseren

Legg til variabler, funksjoner, sammenligningsoperatorer og strenglitteraler ved å utvide grammatikken og legge til nye tilfeller i parseFactor.

Feilrapportering

Registrer linje og kolonne i tokenisereren. Utløs meningsfulle feil: "Expected ')' at position 7, got '+'".

Parsergeneratorer

For komplekse grammatikker kan De bruke parsergeneratorer som LPEG (grammatikker for analyseuttrykk). LPEG er langt kraftigere og mer uttrykksfullt enn en håndskrevet rekursiv nedstigningsparser for store grammatikker.

Spørsmål om parseren

Hva bruker en rekursiv nedstigningsparser for å håndheve operatorprioritet?

Oppsummering: Enkel uttrykksparser

En rekursiv nedstigningsparser bruker én funksjon per grammatikkregel, og håndhever naturlig operatorprioritet gjennom kallehierarkiet. Tokeniser først, og implementer deretter funksjonene expr → term → factor. Utvid med variabler og funksjoner for å lage et fullstendig uttrykksspråk.

Gratis å komme i gang

Lær deg Lua med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
40
Leksjoner
159

Ofte stilte spørsmål

Er leksjonen «Enkel uttrykksparser» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Lua Academy, inkludert «Enkel uttrykksparser», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Lua Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Enkel uttrykksparser»?

Bygg en rekursiv nedstigningsparser for aritmetiske uttrykk i ren Lua. Du øver på Lua Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Lua Academy?

Ingen tidligere erfaring er nødvendig. Lua Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Enkel uttrykksparser»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Lua Academy-leksjonen?

Ja. Alle Lua Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Prinsipper for DSL-utforming i Lua
  2. Operatoroverbelastning for flytende DSL-er
  3. Bygge en konfigurasjons-DSL
  4. Enkel uttrykksparser
← Tilbake til Lua Academy