Что должен делать парсер для языка программирования? - PullRequest
1 голос
/ 18 сентября 2011

Я уже написал лексер, который возвращает токены, и сейчас я работаю над парсером.У меня есть одна проблема.

Представьте себе этот пример кода:

print("Hello, world!")

Лексер возвращает четыре токена (print, (, "Hello, world!" и )).Последняя программа должна вывести строку «Hello, world!».

Но что должен делать парсер?Если парсер уже выполняет код, должен ли он возвращать что-то (и что), которое обрабатывается другим объектом?

Ответы [ 5 ]

5 голосов
/ 18 сентября 2011

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

1 голос
/ 18 сентября 2011

Обычно парсер не выполняет ничего. Парсеры обычно принимают ввод (текстовый или двоичный) и создают представление в памяти, не более того ... но это уже много!

Если у вас уже есть Lexer, то на втором этапе обычно выполняется семантический анализ для создания абстрактного синтаксического дерева .

Это значит производить что-то в форме:

(FunctionCall "print" [
    (StringLiteral "Hello, World!")
    ]
)
1 голос
/ 18 сентября 2011

Что должен делать парсер?

Типичная роль синтаксического анализатора заключается в чтении потока токенов и, следовательно, построении дерева разбора или дерева абстрактного синтаксиса .

Если синтаксический анализатор уже выполняет код

Нет.Это не разбор.

0 голосов
/ 18 сентября 2011

Парсер должен в основном делать две вещи:

  1. Создание формы промежуточного текста, обычно в древовидной или обратной польской форме, которую может использовать генератор кода.
  2. Четко и точно сообщать о любых возникших ошибках, идентифицируя номер строки с ошибкой, точную причину ошибки (в разумных нетехнологических выражениях) и, насколько это возможно, положение в строке или идентификатор элемента, который заставил парсер "задохнуться".
0 голосов
/ 18 сентября 2011
...