С практической точки зрения существует ли какой-либо популярный интерпретирующий язык, который сначала генерирует синтаксическое дерево при разборе? - PullRequest
2 голосов
/ 24 июля 2011

Кажется, что все языки сценариев, такие как PHP, Perl не создает никакого синтаксического дерева, но интерпретирует его напрямую (без отдельного синтаксического анализа и генерации кода):

https://svn.php.net/repository/php/php-src/trunk/Zend/zend_language_parser.y

Есть ли какой-нибудь популярный интерпретирующий язык, который сначала генерирует синтаксическое дерево при синтаксическом анализе вообще?

Ответы [ 2 ]

1 голос
/ 24 июля 2011

Информация о Perl неверна:

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

(Источник: perl страница википедии.)

Вы найдете информацию о модуляхможно использовать для визуализации этого синтаксического дерева в документации Core modules .

0 голосов
/ 24 июля 2011

Почти все из них. Интерпретация из потока токенов сложная (а интерпретация без даже токенизатора еще сложнее ), так как вам все равно придется выполнять большую часть работы по синтаксическому анализу (только на этот раз специально , без помощи генераторов парсера, смешивая логику парсера с логикой интерпретатора). Для начала, правильное определение приоритета оператора, по-видимому, требует потенциально бесконечной ретрансляции / обратного отслеживания, если вы попробуете это без построения промежуточных структур данных (AST).

Единственным исключением могут быть языки сценариев оболочки из-за их невероятно простого синтаксиса (в основном, это просто вызовы внешних программ, назначения переменных, которые в любом случае работают со строками, и простые структуры цикла), хотя я бы не стал на это ставить. Редактировать: Нет, bash имеет грамматику yacc , и zsh, похоже, также имеет полноценный анализатор .

Многие из этих языков также не останавливаются на AST, а продолжают компилировать их в байт-код (даже если они не сохраняют его для последующих запусков по умолчанию - например, PHP) и интерпретируют , что .

...