0Pricing
Lua Academy · 강의

간단한 표현식 파서

순수 Lua로 산술 표현식을 위한 재귀 하강 파서를 만듭니다.

간단한 표현식 파서은(는) CoddyKit의 무료 Lua Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Lua Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

목표: 산술 표현식 구문 분석

연산자 우선순위를 준수하면서 3 + 4 * (2 - 1)와 같은 표현식을 구문 분석하고 평가하는 순수 Lua 재귀 하강 구문 분석기를 만드십시오.

토큰화기

먼저 입력을 숫자, 연산자, 괄호로 토큰화하십시오.

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

개선된 토큰화기

패턴 일치 기능을 사용하는 더 견고한 토큰화기입니다.

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

구문 분석기 상태

구문 분석기는 토큰 목록과 위치를 유지합니다. 도우미 함수 peek와 consume이 토큰을 따라 이동합니다.

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

표현식 문법

이 문법은 우선순위를 준수합니다:

  • 표현식 = 항 ((+ | -) 항)*
  • 항 = 인수 ((* | /) 인수)*
  • 인수 = 숫자 | (표현식) | -인수

항 구문 분석

항을 구문 분석하고 +/-를 왼쪽에서 오른쪽으로 결합하여 덧셈 표현식을 구문 분석하십시오.

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

인수 구문 분석

거듭제곱을 포함한 곱셈 표현식을 구문 분석하십시오.

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

숫자와 괄호 구문 분석

리터럴, 괄호로 묶인 하위 표현식, 단항 부정을 원자로 구문 분석하십시오.

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

함께 구성하기

표현식을 토큰화하고 구문 분석한 후 평가하십시오.

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)

구문 분석기 확장

문법을 확장하고 parseFactor에 새 경우를 추가하여 변수, 함수, 비교 연산자, 문자열 리터럴을 지원하십시오.

오류 보고

토큰화기에서 행과 열을 추적하십시오. 의미 있는 오류를 발생시키십시오: "Expected ')' at position 7, got '+'".

구문 분석기 생성기

복잡한 문법에는 LPEG(구문 분석 표현 문법)와 같은 구문 분석기 생성기를 사용하십시오. 대규모 문법에서는 LPEG가 직접 작성한 재귀 하강 구문 분석기보다 훨씬 강력하고 표현력이 뛰어납니다.

구문 분석기 질문

재귀 하강 구문 분석기는 연산자 우선순위를 적용하기 위해 무엇을 사용하나요?

복습: 간단한 표현식 구문 분석기

재귀 하강 구문 분석기는 문법 규칙마다 하나의 함수를 사용하며, 호출 계층을 통해 자연스럽게 연산자 우선순위를 적용합니다. 먼저 토큰화한 다음 표현식 → 항 → 인수 함수를 구현하십시오. 완전한 표현식 언어를 위해 변수와 함수를 추가하십시오.

자주 묻는 질문

“간단한 표현식 파서” 강의는 무료인가요?

네 — “간단한 표현식 파서” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Lua Academy 강의 전체를 잠금 해제할 수 있습니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“간단한 표현식 파서”에서 뭘 배우나요?

순수 Lua로 산술 표현식을 위한 재귀 하강 파서를 만듭니다. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Lua Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Lua Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“간단한 표현식 파서” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Lua Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Lua Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Lua의 DSL 설계 원칙
  2. DSL 활용을 위한 연산자 오버로딩
  3. 설정 DSL 만들기
  4. 간단한 표현식 파서
← Lua Academy(으)로 돌아가기