Phân tích từ vựng mà không có biểu thức chính quy


9

Tôi đã xem xét một vài từ vựng trong các ngôn ngữ cấp cao khác nhau ( Python , PHP , Javascript trong số những người khác) và tất cả họ dường như sử dụng các biểu thức thông thường ở dạng này hay dạng khác. Mặc dù tôi chắc chắn rằng regex có lẽ là cách tốt nhất để làm điều này, tôi đã tự hỏi liệu có cách nào để đạt được từ vựng cơ bản mà không có biểu thức chính quy, có thể là một số cách phân tích chuỗi trực tiếp hoặc một cái gì đó.

Vì vậy, yeah, có thể thực hiện một số loại từ vựng cơ bản trong ngôn ngữ cấp cao hơn * mà không cần sử dụng các biểu thức thông thường dưới bất kỳ hình thức nào không?

* Các ngôn ngữ cấp cao hơn là những thứ như Perl / PHP / Python / Javascript, v.v ... Tôi chắc chắn có một cách để làm điều đó trong C


2
Có vẻ như "có một cuốn sách về phép tính không sử dụng tất cả những chữ cái Hy Lạp và những thứ nguệch ngoạc kỳ lạ?"
kevin cline

@kevincline Tại sao mọi người chèo thuyền qua Đại Tây Dương khi có những chiếc máy bay hoàn toàn tốt trên bầu trời?
Smudge

1
chèo và cưỡi có tác dụng phụ khác nhau.
kevin cline

Câu trả lời:


3

Trước hết, đã có các thư viện biểu thức chính quy cho C từ trước khi các ngôn ngữ "cấp cao hơn" của bạn được phát minh. Chỉ cần nói rằng, các chương trình C không quá phức tạp như một số người nghĩ.

Đối với hầu hết các ngữ pháp, từ vựng là vấn đề tìm kiếm khoảng trắng và một vài ký tự khác như () [] {}; để phân chia các từ và sau đó khớp với danh sách các từ khóa để xem có kết quả khớp nào không.


1
Tôi không có nghĩa là C không thể làm regex, ý tôi là nó có nhiều tính năng mạnh hơn để làm những thứ này. Tôi tưởng tượng việc xây dựng một từ vựng tiên tiến và hiệu suất trong C dễ dàng hơn so với ngôn ngữ cấp cao hơn.
Smudge

1
@sam độ phức tạp và hiệu suất của trình phân tích cú pháp hoặc trình phân tích cú pháp là một chức năng của độ phức tạp của ngôn ngữ được phân tích cú pháp so với langugae mà trình phân tích cú pháp được triển khai, vì vậy không.
jk.

+1. Một lexer cực kỳ đơn giản; bạn chỉ cần một chuỗi, một loại dữ liệu cho mã thông báo của bạn và một bảng các từ khóa được xác định trước. Phần khó nhất là xử lý khoảng trắng và bình luận: P
Mason Wheeler

2

Bạn có thể quan tâm đến "trình phân tích cú pháp không quét", không có bước mã hóa riêng biệt. Một lời giải thích về lợi ích của trình phân tích cú pháp không quét được đưa ra ở phần đầu của bài viết này: Bộ lọc định hướng cho Trình phân tích cú pháp tổng quát không quét . (Tuy nhiên, cũng có nhược điểm.)

(PEG, đã được đề cập trong các câu trả lời khác, cũng có thể được sử dụng để xây dựng các trình phân tích cú pháp không quét.)


1

Không có gì cụ thể về các biểu thức thông thường. Chúng đơn giản là tốc ký cho phép bạn tạo mã dễ dàng hơn nhiều và việc triển khai thường được chuyển đi. Tuy nhiên, về cơ bản, từ vựng là các FSM và các biểu thức chính quy chỉ là một cách để đạt được mục tiêu đó.


0

Tất nhiên bạn có thể sử dụng các trình phân tích cú pháp khác, vì mọi ngôn ngữ thông thường cũng không có ngữ cảnh. Câu hỏi thực sự đi vào lý do tại sao bạn muốn.

Không thực sự có gì đơn giản hơn các biểu thức thông thường (làm thế nào bạn có thể cải thiện O (N)?) Và cố gắng đơn giản hóa sẽ không giúp đỡ. Bạn luôn có thể sử dụng quay lui đơn giản như Jetti đã chỉ ra, mặc dù tôi khuyên bạn nên tránh nó nếu có thể.

Nếu bạn sẽ sử dụng một trình phân tích cú pháp nâng cao hơn cho từ vựng thì có khả năng bạn không cần một giai đoạn từ vựng nào cả. Trên thực tế, lý do tại sao chúng ta có một giai đoạn từ vựng là vì việc phân tích các mã thông báo nhanh hơn so với phân tích các ký tự, cùng với đó là đơn giản hóa mạnh mẽ bước phân tích cú pháp của chúng ta. Vì vậy, bằng cách sử dụng một trình phân tích cú pháp nâng cao hơn, bạn chỉ cần mất tất cả lợi ích của việc lexing ngay từ đầu.


Vậy làm thế nào để regex làm điều đó? Nó sẽ không phải đi theo từng ký tự (đối với hầu hết các mẫu được sử dụng trong từ vựng ít nhất)?
Jetti

@Jetti Vâng, tất nhiên rồi.
Pubby

Sẽ thật dễ dàng để đọc từng ký tự và sau đó quay lại nếu cần để lấy mã thông báo. Nó sẽ là nhiều mã hơn nhưng không khó hơn.
Jetti

@Jetti Tôi không thấy cách quay lại ngây thơ là tốt hơn.
Pubby

Tôi không bao giờ nói tốt hơn. Nhưng OP đã hỏi nếu có những cách khác và đó là một cách khác không phải là trình phân tích cú pháp nâng cao.
Jetti

0

Thật hợp lý khi thực hiện phân tích từ vựng với các biểu thức thông thường hoặc bỏ qua bước này và thực hiện phân tích cú pháp từ vựng linh hoạt và mạnh mẽ hơn nhiều với PEG hoặc GLR.

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.