Рубрики

ВОРОТА | GATE-CS-2002 | Вопрос 43

Язык C это:
(A) язык без контекста
(B) контекстно-зависимый язык
(С) обычный язык
(D) Притча полностью только машиной Тьюринга

Ответ: (Б)
Объяснение: C и C ++ являются контекстно-зависимыми языками.

Есть несколько причин:

  1. Для разбора C и C ++ вы начинаете с использования очень мощного. Эти препроцессоры неизбежно пишутся от руки (они не основаны на теоретической основе, такой как регулярные выражения или грамматики без контекста).
  2. Грамматика неоднозначна: в ней есть конфликты LR, такие как конфликт if-then-else. Парсеры обычно разрешают это с помощью контекста («else» соответствует ближайшему «if»).
  3. Лексерам C и C ++ требуется лексическая обратная связь, чтобы различать имена и идентификаторы typedef. То есть, контекстно-зависимый лексер нуждается в помощи от «контекстно-свободного» парсера, чтобы различать идентификатор «foo» и имя определения типа «foo». В этом фрагменте
    int foo;
    typedef int foo;
    foo x;

    первый «foo» является идентификатором, в то время как второй и третий являются именами typedef. Вам нужно разобрать объявления typedef, чтобы понять это (и поскольку у типов есть вложенные скобки, это определенно так же сложно, как анализировать контекстно-свободный язык).
    Это означает, что синтаксический анализатор и лексер являются взаимно рекурсивными, поэтому нет смысла говорить, что синтаксический анализатор является контекстно-свободным, а лексер — контекстно-зависимым.

Ссылка: C и C ++ не являются контекстно-свободными

Рекомендуемые посты:

ВОРОТА | GATE-CS-2002 | Вопрос 43

0.00 (0%) 0 votes