Lỗi cú pháp là gì?
Lỗi cú pháp (syntax error) là sai sót trong cấu trúc của code, như thiếu dấu hai chấm, dấu ngoặc hay dấu ngoặc kép, khiến code vi phạm quy tắc ngữ pháp của ngôn ngữ lập trình. Trình biên dịch hoặc trình thông dịch từ chối chương trình trước khi bất kỳ phần nào của nó được chạy.
Cập nhật 24 tháng 9, 2026
Trước khi Python chạy dù chỉ một dòng trong chương trình của bạn, nó đọc toàn bộ tệp và kiểm tra xem tệp có tuân theo ngữ pháp của ngôn ngữ không. Nếu một dòng vi phạm ngữ pháp đó, không có gì được chạy cả. Chạy chương trình này và để ý điều không xảy ra: lệnh print đầu tiên không bao giờ in ra.
File "main.py", line 4
if temperature > 30
^
SyntaxError: expected ':'
Dòng 1 hoàn toàn hợp lệ, vậy mà "Checking the temperature" không có trong đầu ra. Python từ chối toàn bộ tệp vì một dòng if phải kết thúc bằng dấu hai chấm. Thêm : sau 30, chạy lại, và cả hai dòng đều được in ra.
Lỗi cú pháp được phát hiện thế nào
Mọi ngôn ngữ lập trình đều có ngữ pháp: từ nào được phép, dấu ngoặc mở và đóng ở đâu, sau if phải có gì. Chương trình kiểm tra điều đó gọi là bộ phân tích cú pháp (parser), và nó làm việc ở giai đoạn đầu tiên của quá trình biến mã nguồn thành thứ máy có thể thực thi.
- Bộ tách từ (tokenizer) chia văn bản thành các token:
if,temperature,>,30, v.v. - Parser đọc lần lượt các token và khớp chúng vào ngữ pháp. Sau
if temperature > 30, nó chờ một dấu:, nhưng lại gặp cuối dòng. - Nó dừng lại và báo vị trí mà nó bỏ cuộc: tên tệp, số dòng và một dấu mũ (
^) bên dưới vị trí đó. - Vì phân tích thất bại, không có code nào được sinh ra, nên không dòng nào của chương trình được chạy.
Trong CPython, parser chạy mỗi lần bạn khởi động một script. Ở các ngôn ngữ có bước build riêng, trình biên dịch đảm nhận việc kiểm tra này: gcc, clang và javac từ chối tạo ra chương trình khi vẫn còn dù chỉ một lỗi cú pháp. Đó là lý do lỗi cú pháp được xếp vào nhóm lỗi lúc biên dịch, khác với lỗi runtime, loại lỗi xảy ra khi chương trình đã đang chạy.
Các lỗi cú pháp thường gặp trong Python
Đây là những sai sót đứng sau phần lớn lỗi cú pháp mà người mới gặp, kèm thông báo chính xác mà Python 3.12 in ra.
| Code | Thông báo | Cách sửa |
|---|---|---|
if x > 3 | SyntaxError: expected ':' | Kết thúc các dòng if, for, while, def và class bằng : |
print("Hi" | SyntaxError: '(' was never closed | Đóng mọi dấu ngoặc bạn đã mở |
name = "Ada | SyntaxError: unterminated string literal (detected at line 1) | Đóng dấu ngoặc kép |
if x = 5: | SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='? | So sánh bằng == |
print "Hi" | SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)? | Python 3 cần print(...) |
if a > 0 && b > 0: | SyntaxError: invalid syntax | Python dùng and, or và not |
Một câu lệnh if không có dòng thụt lề nào bên dưới | IndentationError: expected an indented block after 'if' statement on line 1 | Thụt lề phần thân bốn dấu cách |
IndentationError là một dạng SyntaxError: trong Python, thụt lề là một phần của ngữ pháp.
Không phải lỗi gõ nào cũng là lỗi cú pháp. pritn("hello") hoàn toàn đúng ngữ pháp, vì một tên theo sau là dấu ngoặc là một lời gọi hàm. Python chỉ phát hiện không có hàm nào tên pritn khi chạy tới dòng đó, và lúc ấy nó báo NameError: name 'pritn' is not defined. Did you mean: 'print'?. Đó là lỗi runtime, và mọi dòng phía trên đều đã chạy.
Vì sao dòng được báo có thể sai
Parser báo vị trí mà nó không thể đi tiếp, và đó không phải lúc nào cũng là vị trí có sai sót. Dấu ngoặc chưa đóng là trường hợp kinh điển: parser không thể biết dấu ngoặc chưa được đóng cho đến khi đã đọc qua chỗ lẽ ra nó phải được đóng.
File "main.py", line 1
prices = [4.50, 3.20, 7.80
^
SyntaxError: '[' was never closed
Python 3.10 trở lên chỉ vào dấu [ mở ở dòng 1. Python 3.9 trở về trước chỉ báo invalid syntax ở dòng 2, dòng ngay sau sai sót thật. Vì vậy khi dòng được báo trông có vẻ đúng, hãy kiểm tra cuối dòng phía trên nó.
Các parser khác cũng hoạt động như vậy. Với SELECT name FORM users;, trong đó FROM bị gõ sai, SQLite đọc FORM như một bí danh (tên thứ hai) cho cột name và chỉ báo lỗi ở từ tiếp theo:
Parse error near line 1: near "users": syntax error
SELECT name FORM users;
^--- error here
Lỗi cú pháp trong C, Java và JavaScript
Các ngôn ngữ biên dịch báo lỗi cú pháp khi bạn build, không phải khi chạy. Đây là một khai báo thiếu dấu chấm phẩy, được biên dịch bằng Clang (trình biên dịch mà lệnh gcc chạy trên macOS):
#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
Dán nó vào trình biên dịch C online để xem GCC diễn đạt cùng lỗi này thế nào.
javac báo cùng sai sót đó trong Java là error: ';' expected, và không tệp .class nào được ghi ra. Trong C, thiếu một dấu ngoặc nhọn có thể sinh ra cả chục lỗi ở phía dưới tệp. Hãy sửa lỗi đầu tiên rồi biên dịch lại, vì các lỗi còn lại thường là hệ quả của nó.
Các engine JavaScript như V8 phân tích toàn bộ script trước khi chạy, giống như Python. Node.js từ chối tệp này trước khi in ra "start":
console.log("start");
if (x > 1 {
console.log("big");
}
SyntaxError: Unexpected token '{'
Trong trình duyệt, lỗi cú pháp chỉ khiến tệp script đó không chạy, còn các script khác trên trang vẫn chạy.
Cách sửa lỗi cú pháp
- Đọc dòng cuối của thông báo trước. Nó nêu tên vấn đề: thiếu
:, dấu(chưa đóng, một token không mong đợi. - Đến dòng được báo và nhìn vào dấu mũ. Nếu dòng đó trông ổn, hãy kiểm tra dòng phía trên.
- Kiểm tra các cặp. Mỗi dấu
(,[,{và dấu ngoặc kép đều cần một dấu đi cặp. Phần lớn trình soạn thảo tô sáng dấu ngoặc tương ứng khi con trỏ nằm cạnh một dấu ngoặc. - Kiểm tra các dấu câu mà ngôn ngữ yêu cầu: dấu hai chấm và thụt lề trong Python, dấu chấm phẩy và dấu ngoặc nhọn trong C, Java và JavaScript.
- Chỉ sửa lỗi đầu tiên, rồi chạy lại. Các thông báo sau thường do lỗi đầu tiên gây ra.
- Để ý phần tô màu cú pháp. Sau một dấu ngoặc kép chưa đóng, phần còn lại của tệp thường chuyển sang màu của chuỗi, cho bạn thấy nó bắt đầu từ đâu.
Tin tốt là lỗi cú pháp là loại lỗi dễ sửa nhất: công cụ cho bạn biết có gì đó sai và sai ở khoảng nào. Các loại lỗi khó hơn đến sau, khi code chạy.
Đọc tiếp
Một chương trình qua được parser vẫn có thể bị dừng đột ngột khi chạy, đó là lỗi runtime. Một chương trình chạy đến cuối nhưng in ra đáp án sai thì có lỗi logic, và trang đó so sánh cả ba loại lỗi trong một bảng. Để xem chính các quy tắc ngữ pháp, hãy đọc cú pháp Python hoặc cú pháp C, rồi luyện tập trong khóa học Python.
Câu hỏi thường gặp
Ví dụ về lỗi cú pháp là gì?
print("Hello" là một lỗi cú pháp, và một dòng if thiếu dấu hai chấm trong Python cũng vậy: if x > 3. Trong C và Java, thiếu dấu chấm phẩy ở cuối câu lệnh là lỗi thường gặp nhất. Trong mọi trường hợp, code không tuân theo ngữ pháp nên không thể chạy.Lỗi cú pháp và lỗi ngữ nghĩa khác nhau thế nào?
int trong Java; số khác dùng nó như tên gọi khác của lỗi logic.Lỗi cú pháp trong C là gì?
gcc và clang in ra tên tệp, dòng và cột, ví dụ main.c:4:18: error: expected ';' at end of declaration, và không tạo ra tệp thực thi cho đến khi mọi lỗi được sửa.Vì sao Python không tự sửa lỗi cú pháp?
Did you mean print(...)?, nhưng để bạn quyết định.Syntax error trên máy tính cầm tay nghĩa là gì?
ERR:SYNTAX.