- Stack lưu một chuỗi s0X1s1X 2s2 X msm trong đó sm nằm trên đỉnh Stack
6. THỨ TỰ ĐÁNH GIÁ THUỘC TÍNH
6.3 Phƣơng pháp quên lãng (oblivious method)
Một thứ tự duyệt được lựa chọn mà không cần xét đến các luật ngữ nghĩa. Thí dụ nếu quá trình dịch xảy ra trong khi phân tích cú pháp thì thứ tự duyệt phải phù hợp với phương pháp phân tích cú pháp, độc lập với luật ngữ nghĩa.
Tuy nhiên phương pháp này chỉ thực hiện trên một lớp các cú pháp điều khiển nhất định.
Trong thực tế, các ngôn ngữ lập trình thông thường có yêu cầu quá trình phân tích là tuyến tính, quá trình phân tích ngữ nghĩa phải kết hợp được với các phương pháp phân tích cú pháp tuyến tính như LL, LR. Để thực hiện được điều này, các thuộc tính ngữ nghĩa cũng cần thoả mãn điều kiện: một thuộc tính ngữ nghĩa sẽ được sinh ra chỉ phụ thuộc vào các thông tin trước nó. Chính vì vậy chúng ta sẽ xét một lớp cú pháp điều khiển rất thông dụng và được sử dụng hiệu quả gọi là cú pháp điều khiển thuần tính L.
Cú pháp điều khiển thuần tính L
Một cú pháp điều khiển gọi là thuần tính L nếu mỗi thuộc tính kế thừa của Xi ở vế phải của luật sinh A -> X1 X2 . . . Xn với 1<=j<=n chỉ phụ thuộc vào:
1. Các thuộc tính của các ký hiệu X1, X2, . . .,Xj-1 ở bên trái của Xj
trong sản xuất và
2. Các thuộc tính kế thừa của A
Luật sinh Luật ngữ nghĩa
A L M
L.i := l(A.i) M.i := m(L.s)
A Q R A.s := f(M.s) R.i := r(A.i) Q.i := q(R.s) A.s := f(Q.r) Ví dụ: Cho định nghĩa trực tiếp cú pháp
Luật sinh Luật ngữ nghĩa
A L M A Q R L.i := l(A.i) M.i := m(L.s) A.s := f(M.s) R.i := r(A.i) Q.i := q(R.s) A.s := f(Q.r)
Ðây không phải là một định nghĩa L_thuộc tính vì thuộc tính kế thừa Q.i phụ thuộc vào thuộc tính R.s của ký hiệu bên phải nó trong luật sinh.
Chú ý rằng mỗi cú pháp điều khiển thuần tính S đều thuần tính L vì các điều kiện trên chỉ áp dụng cho các thuộc tính kế thừa.
Phương pháp dựa trên qui tắc và phương pháp quên lãng không nhất thiết phải xây dựng một đồ thị phụ thuộc, vì vậy nó rất là hiệu quả về mặt thời gian cũng như không gian tính toán.