2010-04-04 37 views
22

Tôi muốn đưa ra một cú pháp ngôn ngữ. Tôi đã đọc một chút về ba điều này, và thực sự không thể thấy bất cứ điều gì mà người ta có thể làm mà người khác không thể. Có lý do gì để sử dụng cái khác không? Hay nó chỉ là vấn đề ưu tiên?BNF vs EBNF so với ABNF: lựa chọn nào?

Trả lời

25

Bạn phải suy nghĩ về EBNFABNF như phần mở rộng đó giúp bạn chỉ súc tích và biểu cảm hơn trong khi phát triển các ngữ pháp của bạn.

Ví dụ suy nghĩ về một biểu tượng phi terminal tùy chọn, trong một BNF ngữ pháp bạn sẽ xác định nó bằng cách sử dụng những biểu tượng trung gian như:

A  ::= OPTIONAL OTHER 
OPTIONAL ::= opt_part | epsilon 

trong khi với EBNF bạn có thể làm điều đó trực tiếp sử dụng tùy chọn cú pháp:

A ::= [opt_part] OTHER 

Sau đó, vì không có cách để thể hiện ưu tiên trong một BNF bạn có cho chúng tôi e luôn những biểu tượng trung gian cũng cho lựa chọn lồng nhau:

BNF 
A ::= B C 
B ::= a | b | c 

EBNF 
A ::= (a | b | c) C 

Điều này đúng cho nhiều vấn đề cú pháp được phép trong EBNF hoặc ABNF ngữ pháp, nhờ vào đường cú pháp nhưng không phải với một bình thường BNF. ABNF kéo dài EBNF, cho phép bạn làm những điều phức tạp hơn, như việc xác định có bao nhiêu lần xuất hiện của một biểu tượng có thể được tìm thấy với nhau (tức là 4*DIGIT)

Vì vậy, lựa chọn một ABNF hoặc một EBNF như ngôn ngữ của lựa chọn cho ngữ pháp của bạn sẽ làm cho công việc của bạn dễ dàng hơn, vì bạn sẽ biểu cảm hơn mà không làm bạn ngữ pháp với các biểu tượng vô dụng mà trình tạo phân tích cú pháp của bạn sẽ tạo ra, nhưng bạn sẽ không quan tâm đến chúng!

+2

So với 4 * DIGIT: tương tự có thể được thực hiện trong EBNF sử dụng cú pháp tương tự. – Kamarey

+4

Ngoài ra: IETF sử dụng ABNF. ABNF là cách tiện dụng hơn EBNF. –

0

Bạn có thể đạt được những gì bạn muốn bằng cách sử dụng bất kỳ thứ gì trong số đó, nhưng mỗi cái là ngắn gọn và hiệu quả để thể hiện ngôn ngữ của bạn tùy thuộc vào các tính năng mà ngôn ngữ của bạn bao gồm.

Tôi đã đọc BNF, EBNFABNF từ wikipedia và nó đã được mô tả một số khác biệt và tại sao EBNF và ABNF đi vào bức tranh dựa trên BNF

1

EBNF là phiên bản BNF mở rộng/mới hơn, do đó, vấn đề trở nên đơn giản hơn: EBNF so với ABNF. Tôi không phải là một chuyên gia, nhưng nghĩ rằng nó sẽ phụ thuộc vào một ngôn ngữ, có cú pháp bạn muốn xác định. Ngoài ra còn có một số trình hiển thị cho EBNF (http://www.google.co.il/search?sourceid=chrome&ie=UTF-8&q=Ebnf-Visualizer), nhưng không thấy gì cho ABNF,

4

Theo Wikipedia, các chuỗi ký tự được trích dẫn kép của ABNF phân biệt chữ hoa chữ thường và các đối sánh chữ hoa chữ thường phải được định nghĩa là các giá trị ASCII dạng số. Tôi cho rằng đó là một bất lợi.

Văn bản văn bản được chỉ định thông qua việc sử dụng chuỗi được đính kèm trong dấu ngoặc kép ("). Các chuỗi này không phân biệt dạng chữ và tập ký tự được sử dụng là ASCII (US-). Do đó, chuỗi “abc” sẽ khớp với “abc”, “Abc”, “aBc”, “abC”, “ABc”, “AbC”, “aBC” và “ABC”. Đối với trường hợp trùng khớp chữ, các ký tự rõ ràng phải được xác định: để khớp với “aBc”, định nghĩa sẽ là %d97.66.99.

https://en.wikipedia.org/wiki/Augmented_Backus%E2%80%93Naur_Form#Terminal_values

Tuy nhiên, RFC 7405 dường như thêm case-sensitive literals chuỗi ABNF.

https://tools.ietf.org/html/rfc7405

Các vấn đề liên quan