Я думаю, что важно понимать, что такое сканер, что такое парсер и как он участвует в процессе компиляции.
(я постараюсь изо всех сил на объяснение высокого уровня)
Сканер берет последовательность символов (исходный файл) и преобразует ее в последовательность токенов. например, видит текст if 234 )
и преобразует его в токены IF
INTEGER
RPAREN
(это еще не все, но этого достаточно для примера).
Еще один способ понять, как работает сканер, заключается в том, что он берет текст и следит за тем, чтобы вы использовали правильные ключевые слова, а не составлял их. Он должен иметь возможность преобразовывать весь исходный файл в распознаваемые токены связанного языка, и это зависит от языка к языку. Другими словами, «Соответствует ли каждый фрагмент текста конструкции, которую понимает язык». Или лучше привести пример: «Все ли слова, найденные в книге, относятся к английскому языку?»
Парсер берет последовательность токенов (обычно со сканера) и (среди прочего) проверяет, правильно ли он сформирован. например, объявление переменной C имеет вид Type Identifier SEMICOLON
.
Парсер проверяет: "Имеет ли эта последовательность токенов в этом порядке смысл для меня?" И аналогично аналогия: «Эта последовательность английских слов (с пунктуацией) образует законченные предложения?»
C запрашивает ошибки, которые могут быть обнаружены при компиляции программы. D запрашивает ошибки, которые вы видите при запуске программы после ее успешной компиляции. Надеюсь, вы уже сможете различить эти два.
Надеюсь, это поможет вам лучше понять и облегчить ответ.