Tại sao phân tách từ vựng và phân tích cú pháp?


15

Có thể phân tích tài liệu bằng một lần chuyển từ máy trạng thái. Lợi ích của việc có hai đường chuyền là gì, tức là. có một lexer để chuyển đổi văn bản thành mã thông báo và có trình phân tích cú pháp để kiểm tra quy tắc sản xuất trên các mã thông báo đó không? Tại sao không có một lượt duy nhất áp dụng quy tắc sản xuất trực tiếp vào văn bản?



2
Điều này đã được thảo luận trên CS, stackexchange, với nhiều ý kiến ​​rất kỹ thuật trong câu trả lời cho sức mạnh biểu cảm của lexer + trình phân tích cú pháp . Nhưng có thể có chỗ ở đó để trả lời thêm.
babou

Tôi tự hỏi nếu song song kiểu đường ống (mặc dù các giai đoạn mất cân bằng cao) có thể là một lợi thế phụ. Cả hướng dẫn và hành vi bộ đệm dữ liệu cũng có thể thú vị. Bao nhiêu (nếu có) như vậy sẽ giảm thời gian biên dịch sẽ phụ thuộc vào phần cứng cụ thể.
Paul A. Clayton

Một lý do khá rõ ràng (ít nhất là với tôi) là bạn có thể sử dụng công cụ quét riêng biệt. Trong thực tế, tôi thường xuyên sử dụng flex để quét đầu vào, nhưng hiếm khi cần toàn bộ sức mạnh của yacc.
jamesqf

Câu trả lời:


13

Bạn không cần phải tách chúng ra. Mọi người kết hợp chúng thành các trình phân tích cú pháp không quét .

Nhược điểm chính của các trình phân tích cú pháp không quét dường như là các ngữ pháp kết quả khá phức tạp - phức tạp hơn so với sự kết hợp tương ứng của một biểu thức thông thường thực hiện từ vựng và ngữ pháp không ngữ cảnh khi phân tích cú pháp trên luồng mã thông báo. Cụ thể, ngữ pháp cho phân tích cú pháp không quét có xu hướng mơ hồ. Dễ dàng hơn để loại bỏ sự mơ hồ đối với các ngữ pháp hoạt động trên luồng mã thông báo.

Một lợi ích thiết thực của việc sử dụng giai đoạn từ vựng trả trước chuyên dụng là bạn không ghép nối trình phân tích cú pháp tiếp theo với chi tiết từ vựng. Điều này rất hữu ích trong quá trình phát triển ngôn ngữ lập trình sớm, khi các chi tiết từ vựng và cú pháp vẫn thay đổi thường xuyên.


1
TPPPT

@babou Đúng vậy. Tôi không biết bất kỳ kết quả chính thức nào của biểu thức chính quy được biểu thị bằng LL (k) đi ra khỏi LL (k) hoặc tương tự. Hơn nữa, từ vựng thường không được thực hiện với các ngôn ngữ thông thường, nhưng với thứ gì đó mạnh mẽ hơn, cụ thể là các ngôn ngữ thông thường được mở rộng với các ưu tiên dài nhất và phù hợp với từ khóa. Tôi không chắc lớp ngôn ngữ chính xác đó là gì và thuộc tính đóng của nó là gì.
Martin Berger

2
Nếu nhìn về phía trước của bạn liên quan đến việc đọc một mã định danh, thì chế phẩm sẽ yêu cầu nhìn về phía trước không bị ràng buộc, vì về nguyên tắc (không có nguyên tắc) không bị ràng buộc về độ dài của các mã định danh.
babou

@babou Tôi không chắc. Nếu từ khóa dài nhất dài 17 ký tự, thì bất kỳ chuỗi nào dài hơn phải là mã định danh hoặc không hợp lệ về mặt từ vựng.
Martin Berger

Nhưng số nhận dạng của bạn, hoặc có thể là một chuỗi, số hoặc nghĩa đen khác, là một chuỗi hơn 17 ký hiệu riêng lẻ, có thể đứng trước mã thông báo bạn thực sự cần. Đó là một cái nhìn lớn về phía trước, không bị ràng buộc. Bạn có thể kết thúc với một ngôn ngữ không xác định.
babou
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.