Enkel uttrycksparser
Bygg en rekursiv descent-parser för aritmetiska uttryck i ren Lua.
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
endFö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
endParserns 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}
endGrammatik 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
endTolkning 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
endTolkning 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
endSä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.
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
- Principer för DSL-design i Lua
- Operatoröverlagring för flytande DSL:er
- Bygga en konfigurations-DSL
- Enkel uttrycksparser