Enkel uttrykksparser
Bygg en rekursiv nedstigningsparser for aritmetiske uttrykk i ren Lua.
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
endForbedret 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
endParsertilstand
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}
endGrammatikk 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
endAnalysere 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
endAnalysere 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
endSette 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.
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
- Prinsipper for DSL-utforming i Lua
- Operatoroverbelastning for flytende DSL-er
- Bygge en konfigurasjons-DSL
- Enkel uttrykksparser