Lệnh bison trong linux với các ví dụ dễ hiểu

Lệnh bison trong Linux là một công cụ mạnh mẽ để tạo ra các trình phân tích cú pháp từ một ngữ pháp cho trước. Nó giúp bạn dễ dàng xử lý các ngôn ngữ lập trình hoặc định dạng dữ liệu phức tạp một cách hiệu quả. Bison đọc mô tả ngữ pháp và tự động tạo ra mã C để phân tích cú pháp, tiết kiệm thời gian và công sức.

Lệnh bison trong linux là gì?

Trong Linux, command bison in linux là một công cụ mạnh mẽ giúp tạo ra các trình phân tích cú pháp (parser) từ một ngữ pháp cho trước. Nó đọc một mô tả ngữ pháp và chuyển đổi nó thành một chương trình C có thể nhận đầu vào và kiểm tra xem nó có tuân theo ngữ pháp đó hay không. Bison thường được sử dụng để xây dựng các trình biên dịch, trình thông dịch và các ứng dụng khác cần phân tích cấu trúc của dữ liệu đầu vào. Với bison, việc tạo ra một trình phân tích cú pháp trở nên dễ dàng và hiệu quả hơn rất nhiều so với việc viết thủ công. Nó giúp giảm thiểu lỗi và tăng tốc quá trình phát triển phần mềm.

Giới thiệu về lệnh bison

Trong bước này, chúng ta sẽ khám phá lệnh bison, một công cụ tạo trình phân tích cú pháp.

Bison được dùng trong phát triển trình biên dịch và trình thông dịch, rất hữu ích cho lập trình viên.

Bison là một phần mềm miễn phí, triển khai của YACC (Yet Another Compiler-Compiler) mạnh mẽ.

YACC là công cụ tạo trình phân tích cú pháp từ đặc tả ngữ pháp phi ngữ cảnh.

Đầu tiên, hãy cài đặt gói bison trong môi trường Ubuntu 22.04 của chúng ta:

sudo apt-get update
sudo apt-get install -y bison

Ví dụ về đầu ra:

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  m4
Suggested packages:
  bison-doc
The following NEW packages will be installed:
  bison m4
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 1,141 kB of archives.
After this operation, 4,470 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
...

Sau khi cài đặt bison, hãy tạo một file grammar đơn giản để tạo trình phân tích cú pháp.

Tạo một file mới tên example.y trong thư mục ~/project với nội dung sau:

%{
#include <stdio.h>
%}

%token NUM
%%

input:
    | input line
;

line:
    NUM '\n' { printf("Received number: %d\n", $1); }
;

%%

int main() {
    yyparse();
    return 0;
}

File grammar này định nghĩa một ngôn ngữ giống máy tính đơn giản, nhận diện và xử lý số.

Dòng %token NUM khai báo một kiểu token cho số, rất quan trọng trong việc phân tích.

Quy tắc line chỉ định rằng một dòng hợp lệ bao gồm một số theo sau bởi một ký tự xuống dòng.

Tạo Trình Phân Tích Cú Pháp với bison

Trong bước này, chúng ta sẽ tạo trình phân tích cú pháp bằng lệnh bison dựa trên file grammar đã tạo.

Đầu tiên, hãy tạo mã nguồn trình phân tích cú pháp từ file example.y bằng lệnh sau:

bison -d example.y

Lệnh này sẽ tạo ra hai file: example.tab.cexample.tab.h, rất quan trọng cho quá trình biên dịch.

File example.tab.c chứa phần triển khai trình phân tích cú pháp, còn example.tab.h chứa định nghĩa token.

Tiếp theo, ta cần biên dịch mã nguồn trình phân tích cú pháp và liên kết nó với lexer để tạo file thực thi.

Chúng ta sẽ sử dụng công cụ flex để tạo lexer, giúp phân tích cú pháp hiệu quả hơn:

sudo apt update
sudo apt-get install -y flex
flex -o example.lex.c example.l
gcc -o example example.tab.c example.lex.c

Lệnh flex tạo file example.lex.c, chứa phần triển khai lexer để nhận diện các token.

Lệnh gcc biên dịch mã nguồn trình phân tích cú pháp và lexer, liên kết chúng để tạo file thực thi example.

Bây giờ, hãy kiểm tra trình phân tích cú pháp bằng cách chạy chương trình example vừa tạo:

./example
123
Received number: 123
456
Received number: 456

Như bạn thấy, trình phân tích cú pháp nhận diện và xử lý các số đầu vào một cách chính xác.

Xử lý lỗi cú pháp trong Bison

Trong bước này, chúng ta sẽ tìm hiểu cách xử lý các lỗi cú pháp trong trình phân tích cú pháp do Bison tạo ra.

Hãy sửa đổi tệp example.y để bao gồm việc xử lý lỗi, giúp chương trình hoạt động ổn định hơn.

%{
#include <stdio.h>
%}

%token NUM
%error-verbose

%%

input:
    | input line
    | input error '\n' { yyerrok; }
;

line:
    NUM '\n' { printf("Received number: %d\n", $1); }
    | error '\n' { yyerror("Invalid input"); }
;

%%

void yyerror(const char *s) {
    fprintf(stderr, "%s\n", s);
}

int main() {
    yyparse();
    return 0;
}

Các thay đổi quan trọng bao gồm:

  1. Thêm %error-verbose để cung cấp thông báo lỗi chi tiết hơn cho người dùng.
  2. Thêm quy tắc error trong các production inputline để xử lý lỗi cú pháp.
  3. Triển khai hàm yyerror để in thông báo lỗi ra màn hình, giúp gỡ lỗi dễ dàng hơn.

Bây giờ, hãy tạo lại trình phân tích cú pháp và kiểm tra nó để đảm bảo hoạt động tốt.

bison -d example.y
flex -o example.lex.c example.l
gcc -o example example.tab.c example.lex.c

Hãy thử chạy chương trình example và nhập một số đầu vào không hợp lệ để kiểm tra.

./example
abc
example.y:12: syntax error, unexpected error, expecting NUM
Invalid input
123
Received number: 123

Như bạn có thể thấy, trình phân tích cú pháp xác định và báo cáo chính xác lỗi cú pháp khi chúng ta nhập "abc" thay vì một số.

Kết luận cho linux bison command

Tóm lại, linux bison command là một công cụ mạnh mẽ giúp bạn tạo ra các trình biên dịch và trình thông dịch một cách dễ dàng hơn. Với khả năng định nghĩa cú pháp ngôn ngữ một cách rõ ràng, bison giúp giảm thiểu lỗi và tăng tốc quá trình phát triển phần mềm. Bạn có thể sử dụng bison để xử lý các định dạng dữ liệu phức tạp hoặc tạo ra các ngôn ngữ lập trình riêng. Hãy thử nghiệm với các ví dụ đơn giản trước, sau đó dần dần khám phá các tính năng nâng cao của nó. Đừng ngại tìm kiếm tài liệu và cộng đồng hỗ trợ trực tuyến khi gặp khó khăn, vì có rất nhiều nguồn tài nguyên hữu ích đang chờ bạn khám phá. Chúc bạn thành công trên con đường chinh phục linux bison command và tạo ra những ứng dụng tuyệt vời!

Last Updated : 17/10/2025