Подтвердить что ты не робот

Есть ли библиотека, которая будет определять язык исходного кода блока кода?

Написание питона script, и ему нужно выяснить, на каком языке написан блок кода. Я мог бы легко написать это сам, но я хотел бы знать, существует ли решение.

Пигменты недостаточны и ненадежны.

4b9b3361

Ответ 1

Pygments может угадать. Вот пример из документации:

>>> from pygments.lexers import guess_lexer, guess_lexer_for_filename

>>> guess_lexer('#!/usr/bin/python\nprint "Hello World!"')
<pygments.lexers.PythonLexer>

>>> guess_lexer_for_filename('test.py', 'print "Hello World!"')
<pygments.lexers.PythonLexer>

Ответ 3

Это может быть немного трудно сделать надежно. Например, какой язык является следующим:

print("blah");

Самый надежный способ (за исключением того, что пользователь выбирает правильный язык, конечно), - это проверить, начинается ли первая строка с #! ( "hashbang" ) - независимо от того, что после этого является интерпретатором сценариев язык.

Это будет надежно работать для многих языков сценариев (включая скрипты python, shell, perl, ruby ​​и т.д. и т.д.), но не для компилированных языков.

Вы можете искать уникальные синтаксические стили, или конкретные ключевые слова, и вес каждого из них на определенный язык. Например, $#somevar, вероятно, Perl. somevar.each do |another| ..... end, вероятно, рубин.. но это в конечном итоге будет большой работой и не всегда будет работать (особенно с короткими блоками кода)

Другой очевидный способ - использовать расширение файла. Если это *.pl, это, вероятно, код Perl..

Чего вы пытаетесь достичь? Если вы хотите выделить синтаксис, посмотрите, что google-code-prettify делает - в основном разумный, общий синтаксический синтаксис.

В вышеприведенном двусмысленном примере print, вероятно, является выражением оператора или функции, "blah", вероятно, является строкой. Если вы выделите эти два по-разному, вы успешно выделили много разных языков, не обнаружив, что это на самом деле... но это может не всегда работать в зависимости от задачи.

Ответ 4

Ohcount разработан для этого точно: http://labs.ohloh.net/ohcount

Они используют его на www.ohloh.net, чтобы подсчитать вклад людей в языки.

Плохая новость в том, что она закодирована в ruby, но я уверен, что вы можете интегрировать ее так или иначе в python.

Ответ 5

Vim использует кучу интересных тестов и регулярных выражений для поиска определенных форматов файлов. Вы можете посмотреть файл инструкции vim в vim/vim71/filetype.vim или здесь онлайн.

Ответ 6

какой язык блок кода написан в

Каковы ваши альтернативы, среди каких языков? Невозможно определить это универсально. Но если вы сузите фокус, возможно, где-то есть инструмент

Ответ 7

Вы можете проверить highlight.js, который автоматически выделяет блок кода, они говорят, что используют какие-то эвристические методы для выполнения этого http://softwaremaniacs.org/soft/highlight/en/

Ответ 8

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

Определение языка

Linguist определяет список всех языков, известных GitHub в файле yaml. Чтобы выделить файл, необходимо указать язык и лексер.

Большинство языков определяется их расширением. Это самая быстрая и наиболее распространенная ситуация.

Для устранения неоднозначности между файлами с общими расширениями мы используем байесовский классификатор. Например, это помогает нам определить разницу между файлами .h, которые могут быть либо C, С++, либо Obj-C.

Ruby gem: http://rubygems.org/gems/github-linguist

Если вы не можете использовать Ruby по какой-либо причине, логика достаточно проста для порта https://github.com/github/linguist/blob/master/lib/linguist/language.rb

Ответ 9

Как утверждают другие, Pyigs будет вашим лучшим выбором.