Tôi phải viết một ngữ pháp cho Pascal, và chỉ có một điều gây ra vấn đề.
Hãy nói rằng chúng tôi có các toán tử (được sắp xếp theo mức độ ưu tiên từ thấp đến cao):
- Hậu tố
^
. - Tiền tố
^
. [ ]
và.
, (cùng mức độ ưu tiên và liên kết trái).- Thiết bị đầu cuối duy nhất là
id
, bất kỳ chữ thường.
Bây giờ hãy nói rằng một biểu thức là:
- Bất kỳ id.
- Bất kỳ biểu thức với toán tử Postfix
^
. - Bất kỳ biểu thức với toán tử Tiền tố
^
. - Bất kỳ biểu hiện với
.
theo sauid
. - Bất kỳ biểu thức với
[
và một biểu thức khác và]
.
Bây giờ tôi muốn biết làm thế nào tôi có thể tạo ra một ngữ pháp LALR mà không cần thay đổi giảm và giảm xung đột, HOẶC nếu điều đó không thể được thực hiện, làm thế nào tôi có thể chứng minh rằng nó không thể được thực hiện.
Vài ví dụ:
good:
a.b.c.d
a.b^.c
^a.b^
a.b^^[c]^^.d.e
^^a.b^.d.e^[]
bad:
a.^b.c
Không có tiền tố ^
, vấn đề này rất dễ giải quyết, nhưng dấu hiệu tiền tố tiếp tục khiến tôi gặp phải. Có ai giúp được không? Giải pháp của tôi cho đến nay:
// this works without the prefix but it does not produce a.b^.c which is wrong.
A ::= B | A ^ ;
B ::= C | ^ B ;
C ::= id | C [ A ] | C . id;
Vì vậy, tôi nghĩ rằng tiền tố chỉ có thể xảy ra trước dấu chấm đầu tiên và giữa các dấu chấm, chỉ có thể có một hậu tố ^
và dấu ngoặc. Vì vậy, tôi đã đưa ra điều này:
A ::= B | A ^ ;
B ::= C | ^ B ;
C ::= id | C [ A ] |id D;
D ::= id E;
F ::= E | F ^;
E ::= id | F . id;
Nhưng điều này gây ra 3 mâu thuẫn.