0Pricing
Lua Academy · レッスン

シンプルな式パーサー

純粋なLuaで算術式用の再帰下降パーサーを構築します。

「シンプルな式パーサー」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

目標:算術式の解析

純粋なLuaで再帰下降パーサーを構築し、3 + 4 * (2 - 1)のような式を演算子の優先順位に従って解析・評価します。

トークナイザー

まず、入力を数値、演算子、括弧のトークンに分割します。

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

改良されたトークナイザー

gmatchパターンを使った、より堅牢なトークナイザーです。

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

式の文法

この文法は優先順位に従います:

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

項の解析

項を解析し、+/-を左から右へ畳み込むことで、加算式と減算式を解析します。

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(Parsing Expression Grammars)のようなパーサージェネレーターを使用してください。大規模な文法では、LPEGは手書きの再帰下降パーサーよりもはるかに強力で表現力に優れています。

パーサーに関する質問

再帰下降パーサーは、演算子の優先順位をどのように適用しますか?

まとめ:簡単な式パーサー

再帰下降パーサーは文法規則ごとに1つの関数を使い、関数の呼び出し階層によって自然に演算子の優先順位を適用します。まずトークン化し、次にexpr → term → factorの関数を実装します。変数と関数を追加すれば、完全な式言語に拡張できます。

よくある質問

「シンプルな式パーサー」レッスンは無料ですか?

はい。「シンプルな式パーサー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「シンプルな式パーサー」で何を学びますか?

純粋なLuaで算術式用の再帰下降パーサーを構築します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応の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に戻る