【こうぶんかいせき】

構文解析 とは?

最終更新:
💡 単語の並びが「文法どおり」かチェックして設計図を作る工程

トークンの並びを文法規則に照らして解析する処理。コンパイラなどでは構文木や抽象構文木(AST)を作り、後続の処理へ渡す。構文が正しいことだけでは、変数や型などの意味の正しさは保証されない。

📌 このページのポイント
構文解析:並びから構造を読み取る トークン列 x = 3 + 5 ; 構文解析器 文法規則に 照らして解析 簡略化したAST = x + 3 5 LL:上から展開 左端導出 LR:下から還元 右端導出の逆順
代入を許す言語の例。木の線は親子の構造、矢印は解析の流れ。セミコロンなどを省いたASTであり、文法の全規則を展開した構文木ではない。
ひよこ ひよこ
構文解析って字句解析の次にやる処理なの?
ペンギン先生 ペンギン先生
一般的なコンパイラの説明ではそうだよ。字句解析が識別子や数値、記号などのトークンを切り出し、構文解析がその並びを文法に照らして読み取る。入力から式や文の構造を見つける役割なんだ。
ひよこ ひよこ
具体的にはどんなことをするの?
ペンギン先生 ペンギン先生
代入を許す言語の例として「x = 3 + 5;」を考えよう。左側のxに、右側の3と5を足した式を代入する構造だね。「代入」の下にxと「加算」、加算の下に3と5を置いた木で表せるよ。図はその構造を簡略化したASTなんだ。
ひよこ ひよこ
構文木とASTは同じもの?
ペンギン先生 ペンギン先生
構文木は文法による組み立てを表す木で、ASTは後の処理に必要な構造を中心に表す木だよ。図のASTではセミコロンなどの記号を省いている。実際のノード名や省く情報は言語や実装による。LLVMの入門例でも、式の種類ごとのノードを後のコード生成に使っているよ。
ひよこ ひよこ
LL法とLR法は、どちらも左から読むの?
ペンギン先生 ペンギン先生
どちらも入力を左から読むよ。LLは左端導出で、開始記号から展開し、木を上から下へたどる方法。LRは右端導出を逆順にたどり、読んだトークンを規則に従って還元する下からの方法だよ。右端導出という名前でも、入力を右から読むわけではない。BisonはLR系などのパーサーを生成できるんだ。
ひよこ ひよこ
解析が通れば、プログラムは正しく動く?
ペンギン先生 ペンギン先生
構文が正しくても、変数が見つからないなど、別の確認でエラーになることがあるよ。構文エラーから回復して次の誤りを調べる仕組みもあるけれど、対応はパーサー次第。Tree-sitterは編集のたびに木を更新し、構文エラーがあっても有用な結果を得ることを目指すツールだね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「構文解析」って出てきたら「トークンの並びを文法に照らし、構造を読み取る処理」と思えばだいたいOK!
📖 おまけ:英語の意味
「Syntax Analysis / Parsing」 = 構文の解析
💬 Syntaxは構文、Analysisは解析。言葉やプログラムが、どのように組み立てられているかを読み取る処理だよ。

参考資料

← 用語集にもどる