Вопрос по parsing, javascript – Как работает парсер JavaScript?

3

Я пытаюсь понять, как на самом деле анализируется JS. Но мои поиски либо возвращают некоторые весьма смутно документированные проекты "парсера / генератора" (я даже не знаю, что это значит) или как анализировать JS с помощью JS Engine, используя магический "parse" метод. Я не хочу сканировать кучу кода и пытаться понять всю жизнь (хотя я могу, это заняло бы слишком много времени).

я хочу знать, как произвольная строка кода JS на самом деле превращается в объекты, функции, переменные и т. д. Я также хочу знать процедуры и методы, которые превращают эту строку в вещи, хранятся, ссылаются, выполняются.

Есть ли документация / ссылки для этого?

JavaScript анализируется так же, как любой другой язык;en.wikipedia.org/wiki/Parsing, Файл сопоставляется с определенным грамматиком и разбивается на токены. Затем он интерпретируется, чтобы его можно было выполнить.en.wikipedia.org/wiki/Interpreter_(computing) Matt

Ваш Ответ

2   ответа
1

как работают настоящие движки JS, вам может быть интересно прочитать статью Дугласа Крокфорда оПриоритет оператора сверху вниз, который включает в себя код для небольшого рабочего лексера и анализатор, написанный в подмножестве Javascript, которое он анализирует. Это очень читаемый и лаконичный код (с хорошими сопроводительными пояснениями), который, по крайней мере, дает представление о том, как может работать реальная реализация.

Более распространенный метод, чем у Крокфорда "Приоритет оператора сверху вниз". являетсярекурсивный спуск разбор, который используется внарцисс, полная реализация JS в JS.

3

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

function foo(a) {
  alert(a);
}

синтаксический анализатор удалит все начальные пробелы с первого символа, буквы "f". Он будет собирать символы до тех пор, пока не получит что-то, что не принадлежит, пробел, указывающий конец токена. Это начинается снова с & quot; f & quot; из "foo" пока он не дойдет до "("), поэтому теперь у него есть токены "function" и "foo". Он знает "(" является токеном сам по себе, так что 3 токена. Затем он получает "a", а затем ")", то есть еще два токена, чтобы получить 5, и так далее.

Единственное, что нужно для пробела - это между токенами, которые в противном случае являются неоднозначными (например, между «function» и «foo» должен быть либо пробел, либо другой токен).

Когда токенизация завершена, она переходит к компилятору, который видит & quot; функцию & quot; в качестве идентификатора и интерпретирует его как ключевое слово «функция». Затем он получает «foo», идентификатор, который грамматика языка говорит, что это имя функции. Затем «& quot;» указывает на открывающий оператор группировки и, следовательно, на начало списка формальных параметров и т. Д.

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

Вы также можете прочитатьКак работают парсеры C / C ++?, что дает еще несколько подсказок. Или просто используйте Google.

Похожие вопросы