Lua Academy · Lektion

Enkel uttrycksparser

Bygg en rekursiv descent-parser för aritmetiska uttryck i ren Lua.

Lektion 4 av 414 steg

Enkel uttrycksparser är en gratis lektion i Lua Academy på CoddyKit. Detta är lektion 4 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Lua Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Lua Academy innehåller totalt 4 lektioner.

Mål: Tolka aritmetiska uttryck

Bygg en rekursiv nedstigningsparser i ren Lua som tolkar och utvärderar uttryck som 3 + 4 * (2 - 1) och respekterar operatorprioritet.

Tokeniserare

Tokenisera först indata till tal, operatorer och parenteser.

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

Förbättrad tokeniserare

En mer robust tokeniserare som använder gmatch-mönster.

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

Parserns tillstånd

Parsern innehåller en lista med token och en position. Hjälpfunktionerna peek och consume går vidare genom tokenen.

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 för uttryck

Grammatiken respekterar operatorprioritet:

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

Tolkning av termer

Tolka additiva uttryck genom att tolka termer och ackumulera +/- från vänster till höger.

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

Tolkning av faktorer

Tolka multiplikativa uttryck, inklusive exponentiering.

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

Tolkning av tal och parenteser

Tolka atomuttryck: literaler, parentessatta deluttryck och 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ätt ihop allt

Tokenisera, tolka och utvärdera ett uttryck.

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)

Utöka parsern

Lägg till variabler, funktioner, jämförelseoperatorer och strängliteraler genom att utöka grammatiken och lägga till nya fall i parseFactor.

Felrapportering

Spåra rad och kolumn i tokeniseraren. Generera meningsfulla fel: "Expected ')' at position 7, got '+'".

Parsergeneratorer

Använd parsergeneratorer som LPEG (Parsing Expression Grammars) för komplexa grammatiker. LPEG är mycket kraftfullare och mer uttrycksfullt än handskriven rekursiv nedstigning för stora grammatiker.

Parserfråga

Vad använder en rekursiv nedstigningsparser för att upprätthålla operatorprioritet?

Sammanfattning: Enkel uttrycksparser

En rekursiv nedstigningsparser använder en funktion per grammatikregel och upprätthåller naturligt operatorprioriteten genom anropshierarkin. Tokenisera först och implementera sedan funktionerna expr → term → factor. Utöka med variabler och funktioner för att skapa ett komplett uttrycksspråk.

Gratis att börja

Lär dig Lua med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
40
Lektioner
159

Vanliga frågor

Är lektionen ”Enkel uttrycksparser” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Lua Academy, inklusive ”Enkel uttrycksparser”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Lua Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Enkel uttrycksparser”?

Bygg en rekursiv descent-parser för aritmetiska uttryck i ren Lua. Ni övar på Lua Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Lua Academy?

Du behöver inga förkunskaper. Utbildningen i Lua Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Enkel uttrycksparser”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Lua Academy-lektionen?

Ja. Varje Lua Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Principer för DSL-design i Lua
  2. Operatoröverlagring för flytande DSL:er
  3. Bygga en konfigurations-DSL
  4. Enkel uttrycksparser
← Tillbaka till Lua Academy