giảm giảm và thay đổi giảm lỗi trong ngữ pháp LALR


7

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):

  1. Hậu tố^ .
  2. Tiền tố^ .
  3. [ ]., (cùng mức độ ưu tiên và liên kết trái).
  4. 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à:

  1. Bất kỳ id.
  2. Bất kỳ biểu thức với toán tử Postfix^ .
  3. Bất kỳ biểu thức với toán tử Tiền tố^ .
  4. Bất kỳ biểu hiện với .theo sau id.
  5. 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.


Tôi không nhớ tiền tố ^ chút nào từ những ngày Pascal của tôi. Và xây dựng với ^^ chắc chắn không. Pascal được thiết kế cẩn thận để có thể phân tích cú pháp theo dòng đệ quy và LL (1) là tập con nghiêm ngặt của LR (0).
vonbrand

Câu trả lời:


4

Tôi không thấy bất kỳ vấn đề nào với ngữ pháp đầu tiên của bạn và bison không phàn nàn về kết xuất mà tôi đã thực hiện.

Tôi (và bò rừng) thấy một xung đột trong ngữ pháp thứ hai của bạn (không mô tả cùng ngôn ngữ với BTW đầu tiên). Sau khi xem id id idvới một bản đang chờ xử lý ^, bạn không biết liệu cuối cùng của bạn id^có phải là F hay không, nếu bạn nên giữ ba id tạo thành một A sẽ được tập hợp với '^'.


Chỉnh sửa sau bình luận của bạn:

Kết xuất trực tiếp các quy tắc của bạn:

EXP ::= id | EXP ^ | ^ EXP | EXP . id | EXP [ EXP ]

sẽ mơ hồ - và do đó có (các) xung đột - bởi vì bạn không nêu nếu phiên bản tiền tố được ^ưu tiên hơn các toán tử (postfix) khác. Tôi không nhớ nó đã hoạt động như thế nào trong Pascal, nhưng bạn có thể nhận được cả hai hiệu ứng với

EXP ::= POST | ^ EXP
POST ::= id | POST ^ | POST . id | POST [ EXP ]

EXP ::= PRE | EXP ^ | EXP . id | EXP [ EXP ]
PRE ::= id | ^ PRE

Chỉnh sửa lại: một phiên bản hỗn hợp tương ứng với sự hiểu biết của tôi về những gì bạn hỏi trong nhận xét (Tôi tiếp tục thấy điều này khó hiểu và tôi xem xét sự phức tạp của ngữ pháp - với các toán tử đăng được đưa ra hai lần - như một gợi ý là như vậy :-))

EXP ::= PRE | POST2
POST2 ::= PRE '^' | POST2 '^' | POST2 '.' id | POST2 '[' EXP ']'
PRE ::= POST | '^' PRE
POST ::= id | POST '.' id | POST '[' EXP ']'

Ngữ pháp đầu tiên không có bất kỳ xung đột nào, nhưng nó sai vì nó không tạo ra a.b^.c. Tôi chỉ cần thêm nó để hiển thị nơi tôi bắt đầu.
zidarsk8

Có hai điều sai với giải pháp của bạn. Đầu tiên là nó không tạo ra tất cả các ví dụ hay mà tôi đã liệt kê trong câu hỏi của mình, như ab ^ .c nghĩ thứ hai là nó không xem xét các ưu tiên, và do đó nó sẽ tạo ra một cây biểu hiện sai.
zidarsk8

@ zidarsk8, xuất phát a.b^.ctừ ngữ pháp đầu tiên : EXP -> POST -> POST . id -> POST ^ . id -> POST . id ^ . id -> id . id ^ . id. Bạn có thể đưa ra một ví dụ về biểu hiện có vấn đề cho thấy vấn đề ưu tiên?
AProgrammer

Phiên bản đầu tiên của bạn: postfix ^ có mức độ ưu tiên cao hơn toán tử ^ tiền tố (điều đó không tốt). phiên bản thứ hai: tiền tố ^ có mức độ ưu tiên cao hơn toán tử dấu chấm (cũng không tốt). các câu kết hợp là một câu không thể tạo ra ab ^ .c. Vấn đề được ưu tiên là làm thế nào nó sẽ được phân tích cú pháp ab ^ .c phải là ((ab) ^). C ... và không (a. (B ^)). C ... và ^ b ^ nên được phân tích cú pháp (^ b) ^. Cảm ơn bạn đã cố gắng và xin lỗi tôi tiếp tục từ chối các giải pháp của bạn, nhưng chúng không hoạt động.
zidarsk8
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.