Какой подходящий генератор лексеров я могу использовать для удаления идентификаторов из многих языковых исходных файлов? - PullRequest
3 голосов
/ 22 января 2010

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

Моя группа в основном отказывается от методов хеширования / дактилоскопии, описанных в этой журнальной статье: Заведение: локальные алгоритмы дактилоскопии документов . Это очень похоже на работу системы обнаружения плагиата MOSS .

В основном мы берем k-граммы хэшей исходного кода сокурсников и ищем их в базе данных для соответствующих совпадений (наряду с большим количеством оптимизации в том, как мы определяем, какие хэши выбрать в качестве отпечатков пальцев документа).

Первым аспектом нашего проекта является его часть "Front-End", которая содержит некоторые семантические знания о каждом формате файлов, который может обрабатывать наша система обнаружения. Это позволит нам убрать некоторые детали из документа, который нам больше не нужен с целью обнаружения плагиата. По сути, мы хотим иметь возможность переименовывать все переменные в разных языках программирования в постоянную строку или букву.

Что такое облегченное решение (генератор лексеров или что-то подобное), которое мы можем использовать, чтобы помочь переименовать все переменные в файлах исходного кода на разных языках в константы?

Наш проект написан на Java.

В идеале я просто хотел бы иметь возможность определить грамматику для каждого языка, и тогда наш интерфейс сможет переименовать все идентификаторы в исходном файле этих языков в некоторую константу. Затем мы сделаем это для каждого формата файла, который мы хотим поддерживать (java, c ++, python и т. Д.).

Ответы [ 4 ]

3 голосов
/ 22 января 2010

Для генератора лексера / парсера вы должны посмотреть на ANTLR. TXL, который является интерпретатором текстового преобразования, также стоит посмотреть. Готовые грамматики должны быть доступны для обоих.

1 голос
/ 22 января 2010

Помимо ANTLR, который уже был предложен, вы также можете взглянуть на JFlex .

0 голосов
/ 12 ноября 2012

acacia-lex у лексера есть метод замены.

В токене Lexer определите, что выглядит как идентификаторы, например, "identif1" -> "[a..d]", "ident2" -> "[e..h]".

В методе замены карты ввода укажите информацию, какой тип идентификатора заменить какой константой (объектом), например, "identif1" -> "ident1", "идент2" -> "идент2".

0 голосов
/ 22 января 2010

Имейте в виду, что в некоторых языках действительно невозможно сделать то, что вы пытаетесь сделать. В частности, те, где невозможно определить, что является или не является переменной на основе грамматики. Tcl является примером такого, но есть ряд динамических языков, которые имеют ту же проблему (Lisp?).

...