2016-11-24 12 views
0

Java 소스 코드 표절 탐지기 용 렉서를 작성해야합니다. 다음은 내가 달성하고자하는 예입니다."Class brackets"과 "Method bracket"을 구별하는 JFlex Lexer

//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가 렉서를 생성하는 데 적합한 도구라고 생각합니다. 그러나 몇 가지 예를 살펴 보았습니다. 클래스 대괄호와 메서드 대괄호를 구별 할 수있는 방법을 찾을 수 없습니다. 대부분의 토큰 화가들은 동일한 토큰으로 인식합니다. 또한 변수 식별자에서 메소드 적용을 구별하는 방법은 무엇입니까?

답변

4

대괄호와 대괄호를 구별 할 수있는 방법을 찾을 수 없습니다.

어휘 적으로 다른 점은 없습니다. "{".equals("{"). 구별하는 방법은 문맥에 따라 의 파서입니다. 렉서는 그 구별을 할 수 없으며 그래야합니다.

이 또한 내가하는 방법을 구별 할 방법 렉서에서 변수 식별자

에서 적용, 당신은하지 않습니다. 식별자는 식별자입니다. "f (x)"에서 생성 된 토큰 스트림은 Identifier, OpeningParenthesis, Identifier, ClosingParenthesis이어야합니다.

파서에서 함수 이름은 여는 괄호 뒤에 나오지만 렉서의 작업이 아니라 파서의 이름이된다는 사실을 알게 될 것입니다.

+0

설명해 주셔서 감사합니다. 기존 방식의 코드 또는 도구가 내 방식으로 코드를 구문 분석하기위한 수식어가 될 수 있습니까? –

+0

@ Y.Zhao 다양한 파서 연결자에 대한 예제 Java 문법이 있지만 JFlex와 함께 사용할 수있는 현재 문법을 찾을 수 없습니다. 나는 JFlex + Cup이나 JFlex + BYaccJ 또는 대중적인 조합을 더 이상 생각하지 않는다. JFlex와 결혼하지 않았다면 Antlr의 현재 Java 문법을 쉽게 찾을 수 있습니다. – sepp2k