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