Bạn đã trở nên bối rối vì nhiều giải thích về ngữ pháp và ưu tiên đưa các phím tắt để nói rằng các nhà khai thác có được ưu tiên. Họ không. Đó là sản phẩm trong ngữ pháp được ưu tiên, và chúng được ưu tiên so với các sản phẩm khác. Nó chỉ có ý nghĩa đối với hai sản phẩm có ưu tiên tương đối với nhau nếu ngữ pháp không rõ ràng (nghĩa là nó có thể tạo ra hai cây phân tích khác nhau cho cùng một đầu vào), và nếu sự mơ hồ được giải quyết bằng cách xác định ưu tiên của một sản xuất so với .
Hãy để tôi giải thích bằng ví dụ.
Dưới đây là một ngữ pháp đồ chơi:
expression =
| IDENTIFIER
| NUMBER
| expression '+' expression
| expression '*' expression
| expression '(' expression ')' // function call
| '(' expression ')' // grouping
| expression '[' expression ']' // array subscript
| '[' expression IDENTIFIER ':' expression ']' // message send
;
Bây giờ, hãy xem xét phân tích 1 + 2 * 3
với ngữ pháp này. Có hai cây phân tích cú pháp hợp lệ:
+ *
/\ /\
1 * + 3
/\ /\
2 3 1 2
Bằng cách xác định rằng việc sản xuất *
có độ ưu tiên cao hơn so với sản xuất +
, chúng tôi yêu cầu phân tích cú pháp để sản xuất cây trái thay vì cây ngay. Do đó, ý tưởng về mối quan hệ ưu tiên giữa sản xuất +
và sản xuất *
có ý nghĩa: nó có ảnh hưởng đến đầu ra của trình phân tích cú pháp.
Tương tự, 1 + foo(3)
có hai cây phân tích cú pháp:
+ ()
/\ /\
1 () + 3
/\ /\
foo 3 1 foo
Vì vậy, một lần nữa ý tưởng về một mối quan hệ ưu tiên giữa '+' sản xuất và gọi hàm sản xuất có ý nghĩa. Trường hợp của 1 + foo[3]
(trong đó sử dụng sản xuất subscript thay cho sản xuất cuộc gọi chức năng) là tương tự, do đó, nó làm cho tinh thần để xác định một mối quan hệ ưu tiên giữa sản xuất '+' và sản xuất subscript.
Bây giờ, hãy xem xét 1 + (2 * 3)
. Ngữ pháp chỉ có thể sản xuất một cây phân tích cú pháp có thể:
+
/\
1 ()
|
*
/\
2 3
Không cần cho một mối quan hệ ưu tiên giữa +
sản xuất và sản xuất nhóm, bởi vì chỉ có một cách để phân tích đầu vào này.Nó sẽ là vô nghĩa để xác định rằng sản xuất nhóm có ưu tiên cao hơn sản xuất +
, bởi vì không có cây phân tích cú pháp khác mà bạn có thể sản xuất bằng cách làm như vậy.
Cuối cùng, hãy xem xét 1 + [2 add:3]
. Điều này tương tự với ví dụ nhóm. Chỉ có một cây phân tích cú pháp có thể:
+
/\
/ \
1 [ ]
/| \
/| \
2 add 3
Không thể phân tích cú pháp cây khác. Không cần phải xác định mối quan hệ ưu tiên giữa sản xuất +
và thông báo gửi sản xuất. Việc chỉ định một mối quan hệ ưu tiên giữa chúng sẽ không có hiệu lực, bởi vì ngữ pháp đơn giản là không cho phép đầu vào này được phân tích cú pháp theo bất kỳ cách nào khác.
Không có thông số ngôn ngữ ObjC (công khai, dù sao), vì vậy sẽ không có bất kỳ tài liệu nào bằng văn bản cho việc này; câu trả lời là bất kỳ trình biên dịch nào. –
Có lý do cụ thể nào bạn muốn biết điều này không? –
Cú pháp gửi tin nhắn không phải là toán tử để bắt đầu, vì vậy cố gắng đặt nó trên bảng các toán tử là vô nghĩa. –