2004-gre-cs-practice-book.pdf/Q35 — различия между версиями

Материал из DISCOPAL
Перейти к: навигация, поиск
(Новая страница: « == Вопрос: Q35-4c9f66 == <i>Тут вставьте перевод вопроса. Используйте [https://wiki.4intra.net/Help:%D0%A4%D0%BE%D1%80…»)
 
 
(не показана одна промежуточная версия этого же участника)
Строка 1: Строка 1:
 
 
== Вопрос: Q35-4c9f66 ==
 
== Вопрос: Q35-4c9f66 ==
  
<i>Тут вставьте перевод вопроса.
+
Рассмотрим следующую грамматику
Используйте [https://wiki.4intra.net/Help:%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5 возможности разметки],
+
 
включая формулы и т.п, если будут графы — посмотрите как задать их текстом https://wiki.4intra.net/Graphviz .
+
* <m>S \rightarrow (S)</m>
Потом конечно сотрите инструкции, которые тут курсивом.</i>
+
* <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 восходящего анализа]
  
 
=== Ответы ===
 
=== Ответы ===
<i>Если ответы простые, однострочные, используйте простой способ задания ответов списком, типа так
+
* Только 1
(префикс «Правильный ответ:» — это дословно, для правильного ответа)</i>
+
* Только 2
 +
* Только 3
 +
* Правильный ответ: 2 и 3
 +
* 1, 2, 3
  
* Правильный ответ: тут реально правильный ответ
+
=== Объяснение ===
* неправильный ответ
+
{{cstest-source|2004-gre-cs-practice-book.pdf|27|35}}
* еще какой-то неправильный ответ
+
* еще какой-то неправильный ответ
+
* еще какой-то неправильный ответ
+
  
<i>Если ответы длинные, многострочные, или там графы, используйте
+
* Ну первое невозможно — язык понятный и однозначный по выводу, терминал «x» окруженный парным количеством скобок.
[https://wiki.4intra.net/MediawikiQuizzer/ru#.D0.9E.D1.82.D0.B2.D0.B5.D1.82.D1.8B способ задания ответов разделами],  
+
* Для однозначной грамматики легко написать как нисходящий… (его удобно писать на любых, сколь угодно жалких языках)
Но такое очень редко встречается. </i>
+
  
 +
<code-python>
 +
def нисходящий_разбор(слово):
 +
    длина = len(слово)
 +
    индекс = 0 
  
=== Объяснение ===
+
    def S():
<i>Сначала заполните номер страницы с этим вопросом
+
        nonlocal индекс
{{cstest-source|2004-gre-cs-practice-book.pdf|тут-номер-страницы-с-вопросом-35|35}}
+
        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-парсеров).
  
Ну и наконец, вики-разметкой напишите ваше понимание, почему правильный ответ — правильный.</i>
+
{{question-ok|[[Участник:StasFomin|StasFomin]] 21:25, 14 декабря 2024 (UTC)}}
  
{{question-ok|}}
+
[[Категория:Формальные языки]]

Текущая версия на 21:25, 14 декабря 2024

Вопрос: Q35-4c9f66

Рассмотрим следующую грамматику

Какое из следующих утверждений является верным?

  1. Грамматика неоднозначна
  2. Грамматика подходит для нисходящего анализа
  3. Грамматика подходит для восходящего анализа

Ответы

  • Только 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-парсеров).