Связь между разбором, выделением и завершением - PullRequest
6 голосов
/ 20 апреля 2011

В течение некоторого времени я думал о разработке маленького игрушечного языка с нуля, ничего, что могло бы «Править миром», но в основном как упражнение.Я понимаю, что для этого нужно многому научиться.

Этот вопрос касается трех различных концепций (синтаксический анализ, выделение кода и завершение), которые кажутся мне чрезвычайно похожими.Конечно, синтаксический анализ и ASTgen - это часть компиляции, в то время как выделение и завершение кода - это скорее функция IDE, но мне интересно, в чем сходства и различия.

Мне нужны советы от кого-то более опытногов этой теме.Какой код можно разделить между этими концепциями и какие соображения архитектуры могут помочь в этом смысле?

1 Ответ

2 голосов
/ 24 апреля 2011

Что вам нужно, так это синтаксически направленный редактор структуры . Это тот, который объединяет синтаксический анализ со сборкой AST и использует синтаксический анализатор, чтобы предсказать, что вы можете ввести следующим (либо завершение синтаксиса), либо имеет привязку к последнему запуску компилятора, так что он может интерпретировать точку редактирования, чтобы увидеть, какие допустимые идентификаторы могут затем перейдем к проверке таблицы символов компилятора, которая была последней в этой точке кода.

Самая сложная часть - предложить пользователю беспроблемный опыт; она в значительной степени должна верить, что она редактирует текст или (опыт работы со структурными редакторами показывает) она отклонит это как неловкое.

Это много машин для координации и довольно большие усилия. Хорошей новостью является то, что вам все равно нужен парсер для компилятора; если редактирование также анализирует, AST, необходимый компилятору, по существу доступен. (Конечно, вам нужно беспокоиться и о пакетной компиляции). Компилятор должен построить таблицу символов; так что вы можете использовать это в процессе редактирования редактирования. Более сложная новость заключается в том, что парсеры построить намного сложнее; они не могут просто объявить видимую пользователю синтаксическую ошибку и выйти; скорее они должны быть терпимы к нескольким ошибкам, существующим в одно и то же время, содержать частичные AST для частей и соединять их вместе, когда ошибки удаляются пользователем.

Беркли Гармония люди делают хорошую работу в этой области. Вам стоит потрудиться прочитать некоторые из их статей, чтобы получить подробное представление о проблемах и одном подходе к их решению.

Другие ведущие специалисты (в частности, Преднамеренное программирование и XText ), похоже, пытаются это объектно-ориентированные редакторы, в которых вы присоединяете действия редактирования к каждому узлу AST и связываете каждый указать на экране с узлом AST. Затем действия редактирования вызывают специфические действия узла AST (вставка символа, движение вправо, повышение, ...), и он может решить, как действовать и как изменять экран. Возможно, вы можете заставить этих редакторов делать что угодно; это немного сложнее на практике. Я использовал эти редакторы; они не похожи на текстовые редакторы. Есть некоторые восторженные пользователи, но YMMV.

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

...