Термин "контекст" в языках программирования и как контекст влияет на загрузку и обновление?

Что означает термин контекст в контекстно-свободных и контекстно-зависимых языках? Может ли переменная иметь несколько контекстов? Если мне нужно сохранить определенное значение в определенном адресе памяти, как это влияет на контекст адреса памяти? И если я хочу обновить переменную, как меняется контекст переменной?

2 ответа

Решение

Контекстно-зависимая грамматика, произведения имеют общую форму

aBc -> ab'c

где символы в верхнем регистре не являются терминалами, а символы в нижнем регистре являются последовательностями терминалов и нетерминалов.

В приведенном выше примере a а также b будет контекст нетерминала B и указать, что B может "расшириться" до b' только в окружении a а также c,

В контекстно-свободной грамматике производство может выглядеть так:

B -> b'

т.е. B "расширяется" до b' другими словами, независимо от контекста.

Рассмотрим следующую программу на C:

#include <stdio.h>

unsigned int my_value = 0;

void print_value(void)
{
    printf("My value: %d\n", my_value);
}

int main(void)
{
    int my_value = 5;
    printf("My main value: %d\n", my_value);
    print_value();
    return 0;
}

Эта программа напечатает:

My main value: 5
My Value: 0

Причина в том, что переменная my_value связан с определенным в main функция в контексте main и к тому, который определен как глобальная переменная в контексте print_value функция. Большинство языков, таких как C, имеют контекст для определения переменных, что позволяет hiding переменных: переменная, определенная внутри блока (область между { а также } признаки) не отменяет предыдущие определения имени переменной, а скорее "скрывает" их для контекста блока.

Есть языки, которые не зависят от контекста, где имя существует с момента определения и до выхода из программы. Обновление переменной на этих языках обновит ее значение для всей программы.

Другие вопросы по тегам