← 用語集一覧へ戻る

パーサ

Parser
プログラムやデータ(HTML、JSONなど)の構造を解析し、プログラムで扱いやすいデータ構造(抽象構文木など)に変換する処理プログラム。
パーサ (Parser)

概要(サマリー)

パーサ(Parser / 構文解析器)とは、テキスト形式で書かれたプログラムのソースコードやデータ(JSONHTMLなど)を読み込み、その言語の文法ルールに従って構造を分析し、コンピューター(プログラム)が処理しやすい内部データ構造に変換するプログラムである。また、その解析を行う動作を「パース(Parse)する」と呼ぶ。

例えるなら、「提出された書類を読みながら、『これが名前』『これが住所』『これが年齢』と内容を細かく分類し、会社のデータベース(整理された棚)へ正しく整理して保管し直す事務員」のようなものである。文法に合わない記述が見つかると、パーサは「書類に不備があります」と処理を止め、シンタックスエラー(構文エラー)を発生させる。

詳細解説

コンピューターがテキストを理解する最初のステップ

コンピューターにとって、人間が書いたソースコードやデータファイルは、ただの「文字(テキスト)の並び」に過ぎない。そのままでは、どこが命令でどこがデータなのかを解釈して実行することができない。そこで、プログラムを実行したり変換したりする前段階として、必ずパーサがテキストを読み取って構造化する。

パーサ(構文解析器)の具体的な役割

パーサは、コンパイラトランスパイラ、インタプリタといった言語処理系のほか、Webブラウザの内部など、あらゆる場所で裏方として働いている。

  1. 文法チェック: ソースコードに文法的な間違い(括弧の閉じ忘れや綴りミスなど)がないかを検証する。
  2. 構造の可視化: 単なる文字列だったプログラムを、親子関係や実行順序を表すデータ(木構造など)に変換する。

構文解析の流れ(字句解析と構文解析)

テキストをパースする際、プログラムは通常、以下の2つのステップを踏む。

  • ステップ1: 字句解析(Lexical Analysis):
    テキストを意味のある最小単位の単語(トークン)に切り分ける。この処理を行うプログラムを「レクサー」や「スキャナー」と呼ぶ。
  • 例:const total = 10 + 20; ──> [const], [total], [=], [10], [+], [20], [;] という単語リストに分解する。
  • ステップ2: 構文解析(Parsing):
    切り分けた単語リストを読み込み、文法規則に照らし合わせて正しい構文になっているかを判定し、関係性を表すツリー構造を組み立てる。この処理を行うのが「パーサ」である。

抽象構文木(AST)とは何か

パーサが構文解析を行った結果として作り出す、プログラムの構造を表す木構造のデータを抽象構文木(AST: Abstract Syntax Tree)と呼ぶ。

例えば、10 + 20 という数式をパーサが解析すると、以下のような木構造データに変換される。

    [+] (演算子)
    / \
 [10] [20] (数値)

このASTが作成されることで、コンパイラは「まず左の子と右の子を足す処理を実行すればよい」と理解し、実行可能なプログラムコードや機械語へ変換できるようになる。

身近なパーサの例(JSON・HTML・CSS)

Web開発において、開発者が最も身近に触れるパーサの処理は、JSONデータの読み込みである。

JSONパースのコード例

// 1. JSON形式のただの「文字列」(テキストデータ)
const jsonText = '{"name": "たろう", "age": 20}';

// 2. JSONパーサを呼び出して、JavaScriptの「オブジェクト(データ)」に変換(パース)
const user = JSON.parse(jsonText);

// 3. パースされたので、プログラムからプロパティとして簡単に値を取り出せる
console.log(user.name); // 出力: たろう

もし jsonText の末尾に余分なカンマがあるなど文法が壊れている場合、JSON.parse() というパーサは解析できず、エラーをスローする。

また、WebブラウザもHTMLパーサやCSSパーサを内蔵している。ダウンロードしたHTMLテキストをパースして「DOM(Document Object Model)ツリー」を組み立て、CSSテキストをパースしてスタイル情報を抽出し、それらを組み合わせて画面を描画(レンダリング)している。

AIコーディングとの関係

AIにプログラムを書いてもらう際、データの解析(スクリプト)は頻出のタスクである。例えば、「CSVファイルを読み込んで配列にする」「HTMLから特定のリンクだけを抽出する(スクレイピング)」などの指示に対して、AIは最適なパーサライブラリ(PythonBeautifulSoupNode.jscheerio など)を使ったコードを出力してくれる。

また、AIにソースコードを見せて「このコードのAST(抽象構文木)を可視化して」と頼むと、AIはコードが裏でどのように解析されているかをテキストやツリー図で表現してくれるため、プログラミング言語の深い仕組みを学習するのに役立つ。

AIコーディング時のポイント
- 「JavaScriptで、不規則なテキストデータから日付と数値だけを抽出してオブジェクトにするための、正規表現と独自の簡易パーサ関数を書いてください」と指示することで、標準機能にはない複雑なデータ解析ロジックを効率的に作らせることができる。

よくある勘違い

パーサはコードを実行するプログラム?

パーサ自身は、コードを実行(実行結果を出力)するものではない。

パーサの役割は、あくまで「テキストを解析してツリー構造(AST)に整理すること」までである。整理されたASTを受け取って、実際に計算を行ったり画面を動かしたりするのは「評価器(Evaluator)」や「仮想マシン」「コンパイラ」の仕事である。

パーサとコンパイラは同じもの?

パーサはコンパイラという「大きなプログラムの一部(部品)」である。

コンパイラは、コードの読み込み(パーサ) ──> コードの最適化 ──> 別言語(機械語など)への書き出し、という複数の処理を順番に行う。パーサはその中の「最初の読み込み・解析ステージ」を担当している。

パース(Parse)とフォーマット(Format)の違いは?

これらは真逆の処理である。

  • パース(Parse): 「文字列(テキスト)」を読み込んで、プログラムが扱える「データ構造」へ取り込むこと。
  • フォーマット(Format / Stringify): プログラム内の「データ構造」を、人間が読める「文字列(テキスト)」へ書き出すこと(例:JSON.stringify(object))。

まとめ

  • パーサ(構文解析器)は、テキスト形式のコードやデータを解析し、構造化されたデータ(抽象構文木など)に変換するプログラム。
  • 字句解析で単語(トークン)に切り分けた後、文法チェックを行いながら構文ツリーを組み立てる。
  • 代表的な例として、ブラウザがHTMLをDOMに変換する処理や、JSON.parse() によるJSONデータの読み込みがある。
  • 文法エラー(括弧の閉じ忘れ等)を検出してシンタックスエラーを出すのもパーサの重要な役割。
  • AIに複雑なテキストデータの抽出や変換ルールを指示することで、独自のパーサ処理を簡単に構築できる。

情報ソース

より詳しくAIに聞いてみよう

  • プログラミング言語がテキストからAST(抽象構文木)を組み立てるまでの「字句解析」と「構文解析」の処理を、サンプルコードを用いて具体的に説明してください。
  • JavaScriptの JSON.parse() でパースエラー(SyntaxError)が出た場合、どのように原因を特定し、AIを使ってエラーを修正すべきか手順を教えてください。
  • Pythonを使って、特定のWebサイトからニュースのタイトル一覧をスクレイピング(HTMLパース)する具体的なコード例を教えてください。
  • AIに「数式のテキスト(例: 3 + 5 * 2)を読み込んで計算結果を返す、簡単な自作電卓パーサプログラム」を書いてもらうためのプロンプトを教えてください。
  • CSSのパーサが、記述ミスのあったCSSコードを無視して処理を続ける「ブラウザ独自の寛容なパース仕様」について解説してください。