構文エラーとは?
構文エラー(シンタックスエラー)とは、コロンや括弧、引用符の書き忘れなど、コードの構造がプログラミング言語の文法規則に違反している誤りのことです。コンパイラやインタプリタはプログラムを1行も実行する前に拒否します。
更新日: 2026年9月24日
Pythonはプログラムを1行でも実行する前に、ファイル全体を読み込んで言語の文法に従っているかをチェックします。1行でも文法に違反していれば、何も実行されません。次のプログラムを実行して、何が起こらないかを見てください。最初の print は何も表示しません。
File "main.py", line 4
if temperature > 30
^
SyntaxError: expected ':'
1行目はまったく正しいのに、出力に「Checking the temperature」がありません。if の行はコロンで終わらなければならないため、Pythonはファイル全体を拒否したのです。30 の後に : を付けてもう一度実行すると、両方の行が表示されます。
構文エラーはどのように検出されるのか
どのプログラミング言語にも文法があります。どんな単語を使えるか、括弧がどこで開いてどこで閉じるか、if の後に何が続くべきか、といった規則です。これをチェックするプログラムをパーサと呼び、ソースコードを機械が実行できる形に変換する最初の段階で動きます。
- トークナイザがテキストをトークンに分割します。
if、temperature、>、30といった単位です。 - パーサがトークンを順番に読み、文法に当てはめていきます。
if temperature > 30の後には:が来るはずですが、見つかるのは行の終わりです。 - パーサは処理を止め、あきらめた場所を報告します。ファイル名、行番号、そしてその位置の下にキャレット(
^)が表示されます。 - 解析に失敗したのでコードは生成されず、プログラムの行は1つも実行されません。
CPythonでは、スクリプトを起動するたびにパーサが動きます。ビルドの段階が別にある言語では、このチェックをコンパイラが行います。gcc、clang、javac は、構文エラーが1つでも残っているとプログラムを生成しません。構文エラーがコンパイル時エラーに分類されるのはこのためで、プログラムの実行中に起きる実行時エラーとは区別されます。
Pythonでよくある構文エラー
初心者が目にする構文エラーのほとんどは、次のような誤りが原因です。メッセージはPython 3.12が実際に表示するものです。
| コード | メッセージ | 直し方 |
|---|---|---|
if x > 3 | SyntaxError: expected ':' | if、for、while、def、class の行は : で終える |
print("Hi" | SyntaxError: '(' was never closed | 開いた括弧はすべて閉じる |
name = "Ada | SyntaxError: unterminated string literal (detected at line 1) | 引用符を閉じる |
if x = 5: | SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='? | 比較には == を使う |
print "Hi" | SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)? | Python 3では print(...) が必要 |
if a > 0 && b > 0: | SyntaxError: invalid syntax | Pythonでは and、or、not を使う |
下にインデントされた行がない if | IndentationError: expected an indented block after 'if' statement on line 1 | 本体をスペース4つ分インデントする |
IndentationError は SyntaxError の一種です。Pythonでは、インデントも文法の一部だからです。
タイプミスがすべて構文エラーになるわけではありません。pritn("hello") は文法的には完全に正しく、名前の後に括弧が続けば関数呼び出しになります。pritn という関数が存在しないことにPythonが気付くのは、その行に到達したときです。そこで NameError: name 'pritn' is not defined. Did you mean: 'print'? が発生します。これは実行時エラーであり、それより上の行はすでに実行されています。
報告される行が間違っていることがある理由
パーサが報告するのは、それ以上先に進めなくなった地点であり、誤りがある場所とは限りません。典型的なのが閉じていない括弧です。本来閉じるべき場所を読み過ぎるまで、パーサには括弧が閉じられていないことが分かりません。
File "main.py", line 1
prices = [4.50, 3.20, 7.80
^
SyntaxError: '[' was never closed
Python 3.10以降は、1行目の開き括弧 [ を指し示します。Python 3.9以前は、本当の誤りの次の行である2行目に invalid syntax と表示するだけでした。報告された行が正しく見えるときは、その1つ上の行の末尾を確認してください。
ほかのパーサも同じように振る舞います。FROM を書き間違えた SELECT name FORM users; を与えると、SQLiteは FORM を name 列のエイリアス(別名)として読み、その1語後でようやく失敗します。
Parse error near line 1: near "users": syntax error
SELECT name FORM users;
^--- error here
C、Java、JavaScriptの構文エラー
コンパイル型の言語は、実行時ではなくビルド時に構文エラーを報告します。次はセミコロンのない宣言を、Clang(macOSで gcc コマンドを実行すると動くコンパイラ)でコンパイルした例です。
#include <stdio.h>
int main(void) {
int count = 3
printf("%d\n", count);
return 0;
}
main.c:4:18: error: expected ';' at end of declaration
Javaでは javac が同じ誤りを error: ';' expected と報告し、.class ファイルは作られません。Cでは、波括弧が1つ足りないだけで、ファイルの後ろのほうに十数個のエラーが出ることがあります。最初のエラーを直してからもう一度コンパイルしてください。ほかのエラーはその結果として出ているだけのことがよくあります。
V8などのJavaScriptエンジンも、Pythonと同じように実行前にスクリプト全体を解析します。Node.jsは「start」を表示する前に、このファイルを拒否します。
console.log("start");
if (x > 1 {
console.log("big");
}
SyntaxError: Unexpected token '{'
ブラウザでは、構文エラーはそのスクリプトファイル1つの実行を止めるだけで、ページ上のほかのスクリプトは実行されます。
構文エラーの直し方
- まずメッセージの最後の行を読みます。そこに問題の内容が書かれています。
:がない、(が閉じていない、予期しないトークンがある、などです。 - 報告された行に行き、キャレットを確認します。その行が正しく見えるなら、1つ上の行を確認します。
- ペアを確認します。
(、[、{、引用符には、必ず対になる相手が必要です。ほとんどのエディタは、カーソルが括弧の隣にあると対応する括弧を強調表示します。 - 言語が求める記号を確認します。Pythonならコロンとインデント、C、Java、JavaScriptならセミコロンと波括弧です。
- 最初のエラーだけを直して、もう一度実行します。後のメッセージは最初のエラーが原因であることがよくあります。
- シンタックスハイライトに注目します。引用符を閉じ忘れると、たいていファイルの残りが文字列の色になるので、どこから始まったのかが分かります。
うれしいことに、構文エラーはもっとも直しやすい種類のエラーです。何かが間違っていること、そしてそのおおよその場所をツールが教えてくれます。より手ごわい種類のエラーは、コードが実行されてから現れます。
次に読むページ
パーサを通過したプログラムでも、実行中にクラッシュすることがあります。それが実行時エラーです。最後まで実行されるのに間違った答えを出力するプログラムには論理エラーがあり、そのページでは3種類のエラーを1つの表で比較しています。文法の規則そのものについてはPythonの構文やCの構文を読み、Pythonコースで練習してみてください。
よくある質問
構文エラーの具体例は?
print("Hello" のように閉じ括弧を書き忘れるのは構文エラーです。Pythonでコロンのない if の行(if x > 3)も同じです。CやJavaでは、文末のセミコロンの書き忘れがもっとも多い例です。どの場合もコードが文法に従っていないので、実行できません。構文エラーと意味エラー(セマンティックエラー)の違いは?
int に文字列を代入するような、コンパイラが拒否する型の誤りをこう呼ぶ本もあれば、論理エラーの別名として使う本もあります。C言語の構文エラーとは?
gcc や clang はファイル名、行、列を表示し(例: main.c:4:18: error: expected ';' at end of declaration)、すべてのエラーを直すまで実行ファイルを作りません。Pythonはなぜ構文エラーを自動で直してくれないのですか?
Did you mean print(...)? のように修正候補を示しますが、判断はあなたに任せています。電卓に出る「Syntax Error」はどういう意味ですか?
ERR:SYNTAX と表示されます。