Типы ошибок во время компиляции и во время выполнения - PullRequest
3 голосов
/ 09 сентября 2010

У меня есть этот вопрос в домашнем задании для моего класса Computer Languages. Я пытаюсь понять, что означает каждый из них, но я застреваю.

Ошибки в компьютерной программе могут быть классифицируется в зависимости от того, когда они обнаружены и, если они обнаружены в время компиляции, какая часть Компилятор обнаруживает их. Используя ваш любимый язык программирования, дать пример:

(a) Лексическая ошибка, обнаруженная сканер.

(b) Синтаксическая ошибка, обнаруженная синтаксический анализатор.

(c) Обнаружена статическая семантическая ошибка (во время компиляции) семантическим Анализ.

(d) Обнаружена динамическая семантическая ошибка (во время выполнения) кодом, сгенерированным компилятор.

Для (а), я думаю, это было бы правильно: int char foo;

Для (b), int foo (без точки с запятой)

Для (c) и (d) я не уверен, о чем спрашивают.

Спасибо за помощь.

Ответы [ 2 ]

4 голосов
/ 09 сентября 2010

Я думаю, что важно понимать, что такое сканер, что такое парсер и как он участвует в процессе компиляции.

(я постараюсь изо всех сил на объяснение высокого уровня)

Сканер берет последовательность символов (исходный файл) и преобразует ее в последовательность токенов. например, видит текст if 234 ) и преобразует его в токены IF INTEGER RPAREN (это еще не все, но этого достаточно для примера).

Еще один способ понять, как работает сканер, заключается в том, что он берет текст и следит за тем, чтобы вы использовали правильные ключевые слова, а не составлял их. Он должен иметь возможность преобразовывать весь исходный файл в распознаваемые токены связанного языка, и это зависит от языка к языку. Другими словами, «Соответствует ли каждый фрагмент текста конструкции, которую понимает язык». Или лучше привести пример: «Все ли слова, найденные в книге, относятся к английскому языку?»


Парсер берет последовательность токенов (обычно со сканера) и (среди прочего) проверяет, правильно ли он сформирован. например, объявление переменной C имеет вид Type Identifier SEMICOLON.

Парсер проверяет: "Имеет ли эта последовательность токенов в этом порядке смысл для меня?" И аналогично аналогия: «Эта последовательность английских слов (с пунктуацией) образует законченные предложения?»


C запрашивает ошибки, которые могут быть обнаружены при компиляции программы. D запрашивает ошибки, которые вы видите при запуске программы после ее успешной компиляции. Надеюсь, вы уже сможете различить эти два.

Надеюсь, это поможет вам лучше понять и облегчить ответ.

4 голосов
/ 09 сентября 2010

Я попробую.Вот что я думаю:

a. int foo +;(foo + является недействительным идентификатором, поскольку + не является допустимым символом в идентификаторах)

b. foo int;(Синтаксическая ошибка - это любая ошибка, в которой синтаксис неверен - либо из-за неправильного размещения слов, неправильного написания, пропущенных точек с запятой и т. Д.)

c. Статическая семантическая ошибка - это логические ошибки.например, передавая float как индекс массива - arr [1.5] должен быть SSE.

d. Я думаю, что исключения, такие как NullReferenceException, могут быть примером DME.Не совсем уверен, но в ковариантных возвратах, которые вызывают исключение во время компиляции (в некоторых языках), также могут относиться к этой категории.Кроме того, передача неправильного типа объекта в другой объект (например, передача объекта Cat в объекте Person во время выполнения может соответствовать требованиям DME.) Простейшим примером будет попытка получить доступ к индексу, выходящему за пределы массива.

Надеюсь, это поможет.

...