Как я могу отслеживать исходные позиции символов в строке при преобразованиях? - PullRequest
1 голос
/ 25 января 2010

Я работаю над проектом по борьбе с плагиатом для моего класса CS. Это включает в себя обнаружение плагиата на курсах по информатике (задания по программированию) с помощью описанной методики «Зависание: локальные алгоритмы снятия отпечатков пальцев».

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

public class MyClass
{
    public static void main(String[] args)
    {
        // declare a variable called someVar
        int someVar = 0;
    }
}

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

Для этого мы будем использовать ANTLR и существующие грамматики для различных языков для генерации соответствующих лексеров.

Конечный результат таков:

public class V
{
    public static void V(String[] V)
    {
        int V = 0;
    }
}

Затем мы удаляем все пробелы, чтобы получить:

publicclassV{publicstaticvoidV(String[]V){intV=0;}}

Затем эта строка разбивается на килограммы заданного размера. Например, скажите k = 5 (в действительности это было бы больше):

publi ublic blicc liccl iccla ... =0;}}

Вот проблема:

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

Как я могу отслеживать исходное положение в граммах в исходном тексте по всему внешнему интерфейсу идентификаторов, комментариев и пробелов?

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

Ответы [ 2 ]

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

Лексеры ANTLR отслеживают позиции токенов в исходном потоке.

  • Переместить комментарии и пробелы в скрытый канал
  • Установите для свойства Text токенов идентификатора значение "V"
  • Запустите свой скользящий хеш против CommonTokenStream, просматривая свойство Text каждого токена.

Если токены не повреждены от начала и до конца, отображение также будет сохранено.

0 голосов
/ 27 февраля 2010

Эй, почему вы используете этот шаг:

Эта строка затем разбивается на килограммы заданного размера. Например, скажите k = 5 (в действительности это было бы больше): public ublic blicc liccl iccla ... = 0;}}

Я имею в виду, почему это требуется для обнаружения плагиата?

...