ANTLR C++ grammar file을 사용하여 C++ 소스 코드를 파싱 할 때 ANTLR을 사용하려고합니다.ANTLR 파서 예제 (C++ 문법 포함)
는 C에서이 방법 ++ 파일을 실행하려고, 렉서, 파서와 청취자 (CPP14BaseListener.java, CPP14Lexer.java, CPP14Listener.java, CPP14Parser.java)를 생성 한 후 :
private void parseCppFile(String file) throws IOException {
String p1 = readFile(new File(file), Charset.forName("UTF-8"));
System.out.println(p1);
// Get our lexer
CPP14Lexer lexer = new CPP14Lexer(new ANTLRInputStream(p1));
// Get a list of matched tokens
CommonTokenStream tokens = new CommonTokenStream(lexer);
// Pass the tokens to the parser
CPP14Parser parser = new CPP14Parser(tokens);
// Walk it and attach our listener
ParseTreeWalker walker = new ParseTreeWalker();
// Specify our entry point
ParseTree entryPoint = null;//TODO: what is the entry point?
walker.walk(new CPP14BaseListener(), entryPoint);
}
내 질문은 - CPP14Parser가 파일 구문 분석의 진입 점을 가져 오는 데 사용할 메소드를 생성 했습니까? (TODO 코멘트 참조).
또는 C++ 소스 파일을 구문 분석하는 방법을 보여주는 작업 예제에 대한 포인터가 있으면 좋을 것입니다.
감사합니다.
C++의 문법은 모호합니다. 순수 문법으로 구문 분석하려고하면 (모호성 제거를위한 특별한 도움없이) 실패 할 것입니다. 여기서 사용되는 문법에는 외부 도움이없는 것 같습니다. 그것을 패치 할 수 있습니다 (GCC가 CCC를 단지 재귀 적으로 파싱하는 것을 관리하는 모든 Clang 이후). 그렇게하기위한 노력은 여러분이 생각하는 것보다 훨씬 더 클 것 같습니다. 그러면 전 처리기 코드가 실행됩니다. 자세한 내용은 https://stackoverflow.com/questions/243383/why-cant-c-be-parsed-with-a-lr1-parser/1004737#1004737 –
을 참조하십시오. 안녕하세요, 비슷한 것을 시도합니다. lib가 무엇을 사용하는지, 어떻게 포함시켜야하는지 알려주세요. – sab