Где я могу найти библиотеку, которая анализирует исходный код и может извлечь область, в которой курсор находится в коде в данный момент? - PullRequest
2 голосов
/ 28 марта 2012

В SublimeText (2), когда вы нажимаете [ ctrl + shift + p ] (mac osx), вы видите область, где ваша курсор / курсор находится в исходном коде в данный момент, например : entity.name.tag.inline.any.html meta.tag.inline.any.html text.html.basic

Мне любопытно, какая библиотека или скрипт используется для анализа документа / файла и создания этой строки области действия.

Заметка: ввод view.syntax_name(view.sel()[0].b) в консоли Sublime также выведет область видимости.

1 Ответ

4 голосов
/ 30 марта 2012

хорошо, «библиотеки», на которые вы ссылаетесь, это просто грамматики языка .

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

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

w / r / t фактический синтаксический анализ , для TextMate и Sublime Text это делается с помощью регулярных выражений .

Например, рассмотрим грамматику языка Python;Как вы знаете, когда я помещаю курсор в начало , а и выполняю ctrl-shift-P (показать область видимости), область видимости появится в строке состояния:

source.python.keyword.control.flow.python

Опять же, эта область определена в грамматике языка Python, поэтому мы можем найти конкретное правило:

{ 
  match = '\b(elif|else|except|finally|for|if|try|while|with|break|continue|pass|raise|return|yield)\b';

  name = 'keyword.control.flow.python';
}

Первый элемент, match - это просто шаблон , который передается в синтаксический анализатор.

Второй элемент, name - это просто имя, данное этомуопределенный синтаксический элемент (т. е. scope ).

Sublime Text 2 хранит языковые грамматики в каталоге Packages с расширением tmLanguage как XML, а не JSON, поэтому приведенное выше правило из грамматики языка Python выглядит следующим образом в ST2:

<dict>
    <key>
        match
    </key>
    <string>
        \b(elif|else|except|finally|for|if|try|while|with|break|....[truncated]
    </string>

    <key>
        name
    </key>
    <string>
        keyword.control.flow.python
    </string>
</dict>

Таким образом, каждое правило в грамматике заключено в пара тегов dict и шаблон regexp каждого правила заключены в строковые теги ;То же самое для соответствующего имени области.

Все грамматики языка полностью состоят из этих правил - именно с этим match / name (или pattern / scope )структура.

...