Распознаватель синтаксиса в python
Мне нужен модуль или стратегия для обнаружения того, что часть данных написана на языке программирования, а не подсветка синтаксиса, когда пользователь специально выбирает синтаксис для выделения. Мой вопрос имеет два уровня, я был бы очень признателен за любую помощь, поэтому:
- Есть ли в Python пакет, который получает строку (часть данных) и возвращает, если он принадлежит к любому синтаксису языка программирования?
- Мне не обязательно распознавать синтаксис, но я знаю, является ли строка исходным кодом или нет.
Любые подсказки высоко ценятся.
3 ответа
Может быть, вы можете использовать существующие многоязычные подсветки синтаксиса. Многие из них могут определять язык, на котором записан файл.
Мой ответ в некоторой степени зависит от количества кода, который вы собираетесь дать. Если вам будет дано более 30 строк кода, должно быть довольно легко определить некоторые уникальные особенности каждого языка, которые довольно распространены. Например, скажите программе, что если что-либо соответствует выражению from * import *
тогда это Python (я не уверен на 100%, что формулировка уникальна для Python, но вы понимаете суть). Другие вещи, на которые вы могли бы взглянуть, которые обычно немного отличаются, это определение класса (т.е. Python всегда начинается с 'class', C будет начинаться с определения возврата, поэтому вы можете проверить, есть ли строка, начинающаяся с данных тип и имеет формат объявления метода), условные обозначения обычно форматируются немного по-разному и т. д. и т. д. Если вы хотите сделать его более точным, вы можете ввести некую систему весов, функции, которые являются более уникальными и менее вероятными результат несоответствующего регулярного выражения получает больший вес, вещи, которые обычно не соответствуют друг другу, получают меньший вес для языка и просто вычисляют, какой язык имеет наивысшую сложную оценку в конце. Вы также можете определить функции, которые, по вашему мнению, являются на 100% уникальными, и сказать ему, что, как только он попадет в один из них, прекратить синтаксический анализ, потому что он знает ответ (такие как линия Шебанга).
Это, конечно, потребует от вас достаточного знания языков, которые вы хотите идентифицировать, чтобы найти уникальные функции для поиска, или умения находить людей, которые знают уникальные структуры, которые могут помочь.
Если вам дано менее 30 или около того строк кода, ваши ответы от такого разбора будут гораздо менее точными, в таком случае самый простой и лучший способ сделать это, вероятно, - взять устройство, подобное Travis, и просто запустите код на каждом языке (конечно, на виртуальной машине). Если код успешно работает на языке, у вас есть ответ. Если нет, вам понадобится список ошибок, которые являются "допустимыми" (так как они являются ошибками в способе написания кода, а не в интерпретаторе). Это не очень хорошее решение, но в какой-то момент ваш пример кода будет слишком коротким, чтобы дать точный ответ.