2004-gre-cs-practice-book.pdf/Q35 — различия между версиями
Материал из DISCOPAL
StasFomin (обсуждение | вклад) (Новая страница: « == Вопрос: Q35-4c9f66 == <i>Тут вставьте перевод вопроса. Используйте [https://wiki.4intra.net/Help:%D0%A4%D0%BE%D1%80…») |
StasFomin (обсуждение | вклад) |
||
(не показана одна промежуточная версия этого же участника) | |||
Строка 1: | Строка 1: | ||
− | |||
== Вопрос: Q35-4c9f66 == | == Вопрос: Q35-4c9f66 == | ||
− | < | + | Рассмотрим следующую грамматику |
− | + | ||
− | + | * <m>S \rightarrow (S)</m> | |
− | + | * <m>S \rightarrow x</m> | |
+ | |||
+ | Какое из следующих утверждений является '''верным'''? | ||
+ | # Грамматика неоднозначна | ||
+ | # Грамматика подходит для [https://ru.wikipedia.org/wiki/%D0%9D%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D1%8F%D1%89%D0%B8%D0%B9_%D1%81%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7 нисходящего анализа] | ||
+ | # Грамматика подходит для [https://en.wikipedia.org/wiki/Bottom-up_parsing восходящего анализа] | ||
=== Ответы === | === Ответы === | ||
− | + | * Только 1 | |
− | + | * Только 2 | |
+ | * Только 3 | ||
+ | * Правильный ответ: 2 и 3 | ||
+ | * 1, 2, 3 | ||
− | + | === Объяснение === | |
− | + | {{cstest-source|2004-gre-cs-practice-book.pdf|27|35}} | |
− | + | ||
− | + | ||
− | + | ||
− | + | * Ну первое невозможно — язык понятный и однозначный по выводу, терминал «x» окруженный парным количеством скобок. | |
− | + | * Для однозначной грамматики легко написать как нисходящий… (его удобно писать на любых, сколь угодно жалких языках) | |
− | + | ||
+ | <code-python> | ||
+ | def нисходящий_разбор(слово): | ||
+ | длина = len(слово) | ||
+ | индекс = 0 | ||
− | === | + | def S(): |
− | + | nonlocal индекс | |
− | + | if индекс < длина: | |
+ | символ = слово[индекс] | ||
+ | if символ == 'x': | ||
+ | индекс += 1 # S -> x | ||
+ | elif символ == '(': | ||
+ | # S -> (S) | ||
+ | индекс += 1 # сьедаем '(' | ||
+ | S() # Рекурсивно разбираем S сверху вниз | ||
+ | if индекс < длина and слово[индекс] == ')': | ||
+ | индекс += 1 # сьедаем ')' | ||
+ | else: | ||
+ | return False | ||
+ | else: | ||
+ | return False | ||
+ | return True | ||
+ | |||
+ | рез = S() | ||
+ | if not рез or индекс < длина: | ||
+ | return False | ||
+ | return True | ||
+ | |||
+ | assert(нисходящий_разбор("(x)")) | ||
+ | assert(нисходящий_разбор("((x))")) | ||
+ | assert(not нисходящий_разбор("((x)")) | ||
+ | assert(not нисходящий_разбор("(x))")) | ||
+ | </code-python> | ||
+ | |||
+ | … так и восходящий разбор (но тут лучше использовать какой-нибудь генератор LR-парсеров). | ||
− | + | {{question-ok|[[Участник:StasFomin|StasFomin]] 21:25, 14 декабря 2024 (UTC)}} | |
− | + | [[Категория:Формальные языки]] |
Текущая версия на 21:25, 14 декабря 2024
Вопрос: Q35-4c9f66
Рассмотрим следующую грамматику
Какое из следующих утверждений является верным?
- Грамматика неоднозначна
- Грамматика подходит для нисходящего анализа
- Грамматика подходит для восходящего анализа
Ответы
- Только 1
- Только 2
- Только 3
- Правильный ответ: 2 и 3
- 1, 2, 3
Объяснение
Исходники — вопрос 35 на 27 странице книги «2004-gre-cs-practice-book.pdf»
- Ну первое невозможно — язык понятный и однозначный по выводу, терминал «x» окруженный парным количеством скобок.
- Для однозначной грамматики легко написать как нисходящий… (его удобно писать на любых, сколь угодно жалких языках)
def нисходящий_разбор(слово): длина = len(слово) индекс = 0 def S(): nonlocal индекс if индекс < длина: символ = слово[индекс] if символ == 'x': индекс += 1 # S -> x elif символ == '(': # S -> (S) индекс += 1 # сьедаем '(' S() # Рекурсивно разбираем S сверху вниз if индекс < длина and слово[индекс] == ')': индекс += 1 # сьедаем ')' else: return False else: return False return True рез = S() if not рез or индекс < длина: return False return True assert(нисходящий_разбор("(x)")) assert(нисходящий_разбор("((x))")) assert(not нисходящий_разбор("((x)")) assert(not нисходящий_разбор("(x))"))
… так и восходящий разбор (но тут лучше использовать какой-нибудь генератор LR-парсеров).