Làm rõ về Grammars, Lexers và Parsers


8

Thông tin cơ bản ( Bỏ qua tháng 5 ): Tôi đang thực hiện một nhiệm vụ mà chúng tôi đã đặt ra tại uni trong đó chúng tôi phải thiết kế một ngữ pháp cho DSL mà chúng tôi đã được cung cấp. Ngữ pháp phải bằng BNF hoặc EBNF. Cũng như những điều khác, chúng tôi đang được đánh giá dựa trên các quy tắc từ vựng trong ngữ pháp và quy tắc Phân tích cú pháp - chẳng hạn như nếu các quy tắc phù hợp với tập hợp ngôn ngữ, các quy tắc này toàn diện như thế nào, các quy tắc rõ ràng như thế nào.

Điều tôi không hiểu là nếu các quy tắc này được trình bày trong một ngữ pháp được xác định trong BNF (đó là một chủ đề mới đối với chúng tôi).

Câu hỏi : Liệu một ngữ pháp cho một ngôn ngữ nhất định đã được xác định trong BNF hoặc EBNF có chứa / cung cấp các quy tắc cho Phân tích từ điển và / hoặc Phân tích cú pháp không? ( hoặc những điều này phải được chỉ định khác - ở đâu? )

Ngoài ra những gì sẽ được coi là một quy tắc từ vựng? Và những gì sẽ được coi là một quy tắc phân tích cú pháp?


1
BNF chỉ là một cú pháp mô tả đầy đủ ngữ pháp giống như regex mô tả đầy đủ một ngôn ngữ thông thường
ratchet freak

4
Có, bạn có thể xác định cả từ vựng và phân tích cú pháp trong một mô tả giống như BNF - ví dụ, xem PEG. Sự khác biệt giữa lexing và phân tích cú pháp là khá tùy tiện và lỗi thời.
SK-logic

Câu trả lời:


8

Có, một ngữ pháp BNF chứa tất cả các quy tắc bạn cần để phân tích từ vựng và phân tích cú pháp. Sự khác biệt giữa hai là một chút mờ. Một ví dụ điển hình về quy tắc từ vựng trong EBNF sẽ là:

number = [ "-" ], digit, { digit } ;
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;

Thông thường lexers có thể được thực hiện bằng cách sử dụng mã tương đối đơn giản. Bạn có thể tìm kiếm một chuỗi cho không gian tiếp theo, sau đó xem kết quả của bạn có bắt đầu bằng "-" tùy chọn không, chứa ít nhất một chữ số sau đó và chỉ chứa các chữ số sau đó. Các trình phân tích được sử dụng gần như luôn luôn là một bước riêng biệt, nhưng thường được gộp chung với trình phân tích cú pháp ngày nay. Do đó sự mờ nhạt.

Một quy tắc phân tích cú pháp sẽ sử dụng numberphi đầu cuối để làm cho một cái gì đó lớn hơn, như biểu thức bổ sung sau đây.

add = number, "+", number

Mặc dù chúng được trộn lẫn trong cùng một tệp, giáo sư của bạn vẫn muốn thấy sự khác biệt rõ ràng giữa quy tắc "lexer" và quy tắc "trình phân tích cú pháp". Ví dụ: không làm điều này:

add = {"0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" }, "+",
      {"0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" }

Không chỉ dễ bị lỗi, nó khó đọc và khó thực hiện.


Cảm ơn, phần phân biệt rõ ràng giữa quy tắc "lexer" và quy tắc "trình phân tích cú pháp" thực sự giúp tôi hiểu những gì chúng ta đang được đánh giá!
The_Neo

4

Ngữ pháp cho phân tích từ vựng thường được chỉ định thông qua các biểu thức chính quy (đặc biệt đối với các dự án loại trường đại học). Nó chấp nhận một ngôn ngữ thông thường.

Trình phân tích cú pháp thường chấp nhận một ngôn ngữ không ngữ cảnh, có thể được chỉ định thông qua BNF.

Sự khác biệt giữa trình phân tích cú pháp và trình quét (hoặc máy phân tích từ vựng) có phần giả tạo, nhưng nó giúp việc viết trình phân tích cú pháp dễ dàng hơn.

Xem http://en.wikipedia.org/wiki/Chomsky_hierarchy


Bạn đưa ra một điểm tốt về các dự án đại học thường là khác nhau. Nó cư xử với anh ta để làm rõ các yêu cầu chính xác với giáo sư của mình.
Karl Bielefeldt

2

Câu trả lời cho câu hỏi của bạn chắc chắn là Có, cả hai quy tắc phân tích cú pháp và từ vựng đều có thể và được chỉ định bằng cách sử dụng EBNF (đây thực sự chỉ là một dạng BNF nhỏ gọn hơn). Tuy nhiên, trong trình biên dịch chất lượng sản xuất, phần tiếp theo của câu trả lời là khác nhau.

Hầu hết các ngôn ngữ đều có ngữ pháp không có ngữ cảnh và tuân thủ một bộ quy tắc cần thực hiện với giao diện và quay lại. Các ngữ pháp phổ biến nhất là LL (1) và LR (1). LL (1) ngữ pháp cho phép một ngữ pháp gốc đệ quy đơn giản, thường được mã hóa bằng tay, trong khi LR (1) thường có nghĩa là một trình tạo trình phân tích cú pháp như YACC. Phần ngữ pháp này đi xuống mã thông báo (thiết bị đầu cuối) nhưng không thấp hơn.

Các ký hiệu thường được định nghĩa riêng bằng cách sử dụng một ngữ pháp thậm chí đơn giản hơn, chẳng hạn như ngữ pháp toán tử. [Bạn có thể tra cứu các thuật ngữ này để có định nghĩa tốt hơn những gì tôi có thể đưa ra ở đây.] Từ vựng đọc các ký hiệu này thường chịu trách nhiệm cho hầu hết hiệu suất của trình biên dịch, vì vậy, theo kinh nghiệm của tôi, nó luôn được mã hóa bằng tay. LEX là clunky (và chỉ C) và regex quá chậm.

Vấn đề là phải hiểu rằng các quy tắc phân tích cú pháp thúc đẩy công nghệ cần thiết cho trình phân tích cú pháp của bạn và các quy tắc từ vựng ditto cho từ vựng của bạn. Sự khác biệt rõ ràng giữa chúng là liệu chúng có áp dụng cho việc sử dụng mã thông báo (thiết bị đầu cuối) hay việc xây dựng chúng hay không.

Điều này có thể không giúp tiến bộ học tập của bạn, nhưng nó quan trọng nếu bạn vượt ra ngoài các dự án đồ chơi.

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.