Thử thách dưới đây đòi hỏi bạn phải làm quen với lý thuyết trình phân tích cú pháp chính thức. Nếu bạn không biết câu hỏi đang hỏi là gì vì bạn không biết các thuật ngữ này có nghĩa gì, ngữ pháp không ngữ cảnh và các bộ đầu tiên / theo dõi được đề cập trong rất nhiều khóa học đại học.
Tôi có thể giới thiệu khóa học Stanford này , đặc biệt là các tài liệu hướng dẫn 08 và 09 (từ trang 7). Tôi đã trích xuất cũng trích xuất một bảng cheat từ các tài liệu này - Tôi khuyên mọi người nên thử thách này để đọc nó .
Viết một chương trình hoặc hàm đưa ra một ngữ pháp không ngữ cảnh tìm thấy tập hợp theo sau của mọi nonterminal. Một cách không chính thức, tập hợp theo sau của nonterminal là một tập hợp các thiết bị đầu cuối và $
(có nghĩa là đầu cuối) mà bạn có thể tìm thấy sau thiết bị đầu cuối đó trong một câu hợp lệ.
Đầu vào được đưa ra dưới dạng một chuỗi ASCII có thể in hoặc một dòng các dòng ASCII có thể in được. Bạn có thể xuất các bộ theo bất kỳ định dạng hợp lý nào, sử dụng $
(dưới dạng đầu ra bằng chữ hoặc chuỗi bên trong một bộ, v.v.) để chỉ ra kết thúc của đầu vào. Bạn có thể cho rằng đầu vào luôn hợp lệ theo định dạng bên dưới.
Ngữ pháp miễn phí ngữ cảnh được đưa ra một cách rất đơn giản. Mỗi dòng chứa một sản xuất duy nhất. Mỗi sản xuất là một danh sách các biểu tượng phân tách không gian. Một thiết bị đầu cuối là một chuỗi các ký tự được bao quanh bởi dấu nháy đơn (ví dụ '**'
). Để đơn giản, bạn có thể cho rằng các thiết bị đầu cuối không chứa khoảng trắng, nhưng sẽ rất tuyệt nếu chương trình của bạn cho phép. Một nonterminal có thể là bất kỳ chuỗi không chứa khoảng trắng hoặc $
. Sản phẩm trống (thường được biểu thị bằng) chỉ đơn giản là một dòng chỉ chứa bên trái phía bên trái. Dòng đầu tiên là sản xuất xác định biểu tượng bắt đầu.
Ví dụ, ngữ pháp sau:
S → aSa | bSb | ε
Sẽ được đưa ra như:
S 'a' S 'a'
S 'b' S 'b'
S
Ví dụ đầu vào / đầu ra:
In:
S 'a' S 'a'
S 'b' S 'b'
S
Out:
S {'a', 'b', $}
In:
S A B C
A 'a'
A C 'b'
A
B C
B 'd' A
B
C 'e'
C 'f'
Out:
S {$}
A {'d', 'e', 'f'}
B {'e', 'f'}
C {'b', 'e', 'f', $}
In:
Start Alice Bob
Alice Charlie 'a'
Alice
Bob Bob 'a' Alice Charlie
Bob '!!!'
Charlie 'b'
Charlie
Out:
Start {$}
Alice {'a', '!!!', 'b', $}
Bob {'a', $}
Charlie {'a', $}
Mã ngắn nhất trong byte thắng.