LVV>А он и не порождается! В том то и дело, что грамматика используется только для распознавания синтаксически правильных конструкций. А контекстные зависимости, о которых тут все время говорили (единственность объявления, "сначала объяви — потом используй), обрабатываются НЕФОРМАЛЬНЫМИ способами (таблица имен).
У вас какая-то каша в голове.
В приведенном мною выше примере на языке Си, как раз и есть синтаксическая контекстная зависимость!
вы не можете написать:
while(free(ptr));
Если перед этим был typedef int free;
Возникнет СИНТАКСИЧЕСКАЯ ошибка.
А то что вы говорите про "сначала объяви — потом используй" — это уже семантическая ошибка, которая обнаруживается не во время синтаксического анализа, а уже после того как дерево разбора будет построено.
Здравствуйте, Nick_, Вы писали:
LVV>>А он и не порождается! В том то и дело, что грамматика используется только для распознавания синтаксически правильных конструкций. А контекстные зависимости, о которых тут все время говорили (единственность объявления, "сначала объяви — потом используй), обрабатываются НЕФОРМАЛЬНЫМИ способами (таблица имен).
N_>У вас какая-то каша в голове. N_>В приведенном мною выше примере на языке Си, как раз и есть синтаксическая контекстная зависимость! N_>вы не можете написать:
N_>
N_>while(free(ptr));
N_>
N_>Если перед этим был typedef int free;
N_>Возникнет СИНТАКСИЧЕСКАЯ ошибка.
N_>А то что вы говорите про "сначала объяви — потом используй" — это уже семантическая ошибка, которая обнаруживается не во время синтаксического анализа, а уже после того как дерево разбора будет построено.
Подобные сорта деления на синтаксические (лучше было бы сказать -- грамматические, поскольку они возникают из-за несоответствия грамматике) и семантические ошибки имеют смысл только в контексте какого-то определённого способа компиляции языка. К самому языку это прямого отношения не имеет.
Здравствуйте, Шахтер, Вы писали:
Ш>Здравствуйте, Nick_, Вы писали:
LVV>>>А он и не порождается! В том то и дело, что грамматика используется только для распознавания синтаксически правильных конструкций. А контекстные зависимости, о которых тут все время говорили (единственность объявления, "сначала объяви — потом используй), обрабатываются НЕФОРМАЛЬНЫМИ способами (таблица имен).
N_>>У вас какая-то каша в голове. N_>>В приведенном мною выше примере на языке Си, как раз и есть синтаксическая контекстная зависимость! N_>>вы не можете написать:
N_>>
N_>>while(free(ptr));
N_>>
N_>>Если перед этим был typedef int free;
N_>>Возникнет СИНТАКСИЧЕСКАЯ ошибка.
N_>>А то что вы говорите про "сначала объяви — потом используй" — это уже семантическая ошибка, которая обнаруживается не во время синтаксического анализа, а уже после того как дерево разбора будет построено.
Ш>Подобные сорта деления на синтаксические (лучше было бы сказать -- грамматические, поскольку они возникают из-за несоответствия грамматике) и семантические ошибки имеют смысл только в контексте какого-то определённого способа компиляции языка. К самому языку это прямого отношения не имеет.
Совершенно верно указано. Это характеристика метода компиляции, а не языка.
Ш>>Подобные сорта деления на синтаксические (лучше было бы сказать -- грамматические, поскольку они возникают из-за несоответствия грамматике) и семантические ошибки имеют смысл только в контексте какого-то определённого способа компиляции языка. К самому языку это прямого отношения не имеет.
M>Совершенно верно указано. Это характеристика метода компиляции, а не языка.
Ошибаетесь.
Приведу другой пример: синтаксически неверная программа с точки зрения языка
int main()
{
int x;
free(ptr);
int y;
return 0;
}
Тем не менее это может быть верно, если в начале есть typedef int free;
Ш>>>Подобные сорта деления на синтаксические (лучше было бы сказать -- грамматические, поскольку они возникают из-за несоответствия грамматике) и семантические ошибки имеют смысл только в контексте какого-то определённого способа компиляции языка. К самому языку это прямого отношения не имеет.
M>>Совершенно верно указано. Это характеристика метода компиляции, а не языка.
N_>Ошибаетесь. N_>Приведу другой пример: синтаксически неверная программа с точки зрения языка
N_>
N_>int main()
N_>{
N_> int x;
N_> free(ptr);
N_> int y;
N_> return 0;
N_>}
N_>
N_>Тем не менее это может быть верно, если в начале есть typedef int free;
Ну, если впереди, в тексте программы, есть typedef int free;, то программа будет синтаксически верной. В чем проблема?
M>Ну, если впереди, в тексте программы, есть typedef int free;, то программа будет синтаксически верной. В чем проблема?
Это я к тому, что метод компиляции тут не при чем.
Кусок программы является либо синтаксически верным, либо нет, в зависимости от контекста. А это и есть контекстная зависимость.
Здравствуйте, Nick_, Вы писали:
M>>Ну, если впереди, в тексте программы, есть typedef int free;, то программа будет синтаксически верной. В чем проблема?
N_>Это я к тому, что метод компиляции тут не при чем. N_>Кусок программы является либо синтаксически верным, либо нет, в зависимости от контекста. А это и есть контекстная зависимость.
Ну что еще за "кусок программы"? И что за "контекст" такой? Определение контекстной зависимости языка было дано выше, поищи.
Здравствуйте, mefrill, Вы писали:
M>Здравствуйте, Nick_, Вы писали:
M>>>Ну, если впереди, в тексте программы, есть typedef int free;, то программа будет синтаксически верной. В чем проблема?
N_>>Это я к тому, что метод компиляции тут не при чем. N_>>Кусок программы является либо синтаксически верным, либо нет, в зависимости от контекста. А это и есть контекстная зависимость.
M>Ну что еще за "кусок программы"? И что за "контекст" такой? Определение контекстной зависимости языка было дано выше, поищи.
Кусок:
int main()
{
int x;
free(ptr);
int y;
return 0;
}
Контекст — это то что выше и то что ниже.
Определение контекстной зависимости дано выше, подумай головой.
Здравствуйте, Nick_, Вы писали:
N_>Здравствуйте, mefrill, Вы писали:
M>>Здравствуйте, Nick_, Вы писали:
M>>>>Ну, если впереди, в тексте программы, есть typedef int free;, то программа будет синтаксически верной. В чем проблема?
N_>>>Это я к тому, что метод компиляции тут не при чем. N_>>>Кусок программы является либо синтаксически верным, либо нет, в зависимости от контекста. А это и есть контекстная зависимость.
M>>Ну что еще за "кусок программы"? И что за "контекст" такой? Определение контекстной зависимости языка было дано выше, поищи.
N_>Кусок:
N_>
N_>int main()
N_>{
N_> int x;
N_> free(ptr);
N_> int y;
N_> return 0;
N_>}
N_>
N_>Контекст — это то что выше и то что ниже.
N_>Определение контекстной зависимости дано выше, подумай головой.
вот этот самый кусок не является синтаксически верным. Что такое free? С таким же успехом я пишу:
a + b = c
Является этот кусок синтаксически верным? Высказывание типа Контекст — это то что выше и то что ниже это цитата? Где такое определение можно прочитать, не мог бы подсказать?
Здравствуйте, mefrill, Вы писали:
M>Здравствуйте, Nick_, Вы писали:
N_>>Я не понимаю, что ты хочешь мне доказать? N_>>То что я не прав? Или то что грамматика Си — контекстно свободна?
M>Да ничего не хочу... Только показал, что пример немного некорректен и понятие контекста неверно определено.
Зачем разводить бессмысленную дискуссию?
Если ты понял о чем я, но заметил неточность — привел бы более точный пример.