Как реализовать автозаполнение для языка программирования - PullRequest
2 голосов
/ 09 февраля 2012

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

var a = {
b: { first: "goofy",second: 5},
c: "minnie"};

if (a.b.second > 0)
   a.s = 0;
else
   a.t = "honey";

когда я цифру. автозаполнение должно показать мне b, c, s, t. Я провел последний месяц, чтобы научиться разбирать вещи, используя материал, предоставленный курсом компилятора в Стэнфордском университете http://www.stanford.edu/class/cs143/. Теперь я немного запутался. Очевидно, что если бы мне пришлось создавать компилятор, я бы использовал грамматику LALR и такие инструменты, как flex & bison. Но автозаполнение это разные вещи. Это интерактивно. Пока вы печатаете, у вас нет полного кода, и строка, которую вы набираете в одном моменте, не является допустимым предложением на языке программирования. Если я наберу. синтаксический анализатор LALR скажет, что не может сократить предложение до начала производства. Это означает, что я не могу полностью проанализировать то, что я написал до этого момента. Но в любом случае я должен разобрать предложение, чтобы показать, какие члены находятся внутри «а». Если я хорошо понял, LALR-разбор ленивее, чем LL. LALR пытается собрать как можно больше лексем, прежде чем применять сокращение. У меня сложилось впечатление, что LALR - правильный выбор для компилятора, но LL лучше для автозаполнения (если язык программирования, который вы собираетесь анализировать, имеет грамматику LL, очевидно). Это правильно? Извините, я знаю, что мой пост сбивает с толку, но в этот момент у меня возникло такое же замешательство, и я надеюсь, что кто-то может помочь мне разобраться с беспорядком в моем мозгу. Я ищу человека с некоторым опытом написания автозаполнения, который мог бы дать мне несколько полезных советов.

1 Ответ

3 голосов
/ 19 февраля 2012

Я бы сказал, что это не будет иметь значения, если бы вы использовали LALR или LL-анализатор для достижения этой цели. Независимо от выбора генератора, ключевая проблема заключается в том, что синтаксический анализатор достаточно устойчив, чтобы эффективно обрабатывать ошибки.

Поскольку вы будете непрерывно вводить неполный ввод вашего парсера, он должен иметь возможность стабильно восстанавливаться после ошибок, не сдаваясь. Как правило, простое решение заключается в том, что при обнаружении ошибки вы игнорируете токены, пока не достигнете понятного состояния снова. Я полагаю, что в JS лучше всего есть токены, пока вы не получите ; или }. Из которого вы продолжаете синтаксический анализ снова, как если бы ошибка не произошла. Бизон на самом деле хорошо справляется с этой ситуацией, взгляните на документацию по обработке ошибок.

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

...