Я пытаюсь понять компиляцию и интерпретацию, шаг за шагом выясняя общее изображение. Поэтому я поднялся на вопрос, читая http://www.cs.man.ac.uk/~pjj/farrell/comp3.html эту статью.
Это говорит:
Следующий этап компилятора называется Parser. Эта часть компилятора имеет понимание грамматики языка. Он отвечает за выявление синтаксических ошибок и за перевод безошибочной программы во внутренние структуры данных, которые могут быть интерпретированы или записаны на другом языке.
Но я не мог понять, как токенизатор может правильно токенизировать данный поток с синтаксической ошибкой.
Он должен застрять там или дать неверную информацию парсеру. Я имею в виду, что токенизация не своего рода переводчик?
Так как же просто преодолеть лексические искаженные строки кода при токенизации.
Пример токена внутри ссылки выше под заголовком The Tokenizer .
Как я понимаю, форма токена выглядит так: если в коде что-то не так, токен тоже будет поврежден.
Не могли бы вы прояснить мое недоразумение?
and
или как-&&
то еще. Это (в основном) отдельно и отличается от анализа. Оптимизация (если есть) является почти случайным побочным эффектом.Вы бы обычно ожидать , что большинство ошибок синтаксиса исходить от синтаксического анализатора, а не лексер.
Лексер выдаст ошибку, если (и в основном только если) во входных данных будет что-то, что не может быть разбито на токены. Однако во многих языках практически любая последовательность символов может быть превращена в токены какого-либо рода, поэтому ошибки здесь довольно необычны.
Синтаксический анализатор выдаст ошибку, если входные данные содержат допустимые токены, но эти токены не расположены, поэтому они формируют допустимые выражения / выражения на целевом языке. Это гораздо чаще встречается, как правило.
источник
Tokenizer просто разбивает поток символов на токены. От токенизатора POV это полностью действует:
и переводит что-то вроде:
["1", MULTIPLY, MULTIPLY, "1"]
Только парсер может отклонить такие выражения - он знает, что оператор умножения не может следовать за другим оператором умножения. Например, в JavaScript это производит:Есть ошибки, которые могут быть обнаружены токенизатором. Например незавершенные строковые литералы:
"abc
или недействительные номера:0x0abcdefg
. Хотя они все еще могут быть представлены как синтаксические ошибки:Обратите внимание, что токен не был распознан и сообщается как
ILLEGAL
.источник