JFlex Lexer, который различает "скобки класса" и "скобку метода"

Мне нужно написать лексер для детектора плагиата исходного кода Java. Вот пример того, чего я хочу достичь.

//Java code                                   Tokens:
public class Count {                          Begin Class
    public static void main(String[] args)    Var Def, Begin Method
        throws java.io.IOException {
      int count = 0;                          Var Def, Assign
      while (System.in.read() != -1)          Apply, Begin While
        count++;                              Assign, End While
      System.out.println(count+" chars.");    Apply

    }                                         End Method
}                                             End Class

Я думаю, что Jflex - правильный инструмент для создания лексера. Однако после просмотра некоторых примеров. Я не могу найти способ различить скобки класса и скобки метода. Большинство токенизаторов, которые я нахожу, распознают их как один и тот же токен. Также, как мне отличить метод применить от идентификатора переменной?

1 ответ

Решение

Я не могу найти способ различить скобки класса и скобки метода.

В них нет ничего лексически отличного. "{".equals("{"), То, как вы их различаете, зависит от контекста парсера. Лексер не может сделать это различие, и не должен.

Также, как мне отличить метод применить от идентификатора переменной

В лексере вы этого не сделаете. Идентификатор является идентификатором. Поток токенов, сгенерированный из "f(x)", должен быть Identifier, OpeningParenthesis, Identifier, ClosingParenthesis,

Теперь в синтаксическом анализаторе вы узнаете имя функции по тому факту, что за ним следуют открывающие скобки, но опять-таки это работа синтаксического анализатора, а не лексера.

Другие вопросы по тегам