2017-09-19 1 views
1

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++ 소스 파일을 구문 분석하는 방법을 보여주는 작업 예제에 대한 포인터가 있으면 좋을 것입니다.

감사합니다.

+0

C++의 문법은 모호합니다. 순수 문법으로 구문 분석하려고하면 (모호성 제거를위한 특별한 도움없이) 실패 할 것입니다. 여기서 사용되는 문법에는 외부 도움이없는 것 같습니다. 그것을 패치 할 수 있습니다 (GCC가 CCC를 단지 재귀 적으로 파싱하는 것을 관리하는 모든 Clang 이후). 그렇게하기위한 노력은 여러분이 생각하는 것보다 훨씬 더 클 것 같습니다. 그러면 전 처리기 코드가 실행됩니다. 자세한 내용은 https://stackoverflow.com/questions/243383/why-cant-c-be-parsed-with-a-lr1-parser/1004737#1004737 –

+0

을 참조하십시오. 안녕하세요, 비슷한 것을 시도합니다. lib가 무엇을 사용하는지, 어떻게 포함시켜야하는지 알려주세요. – sab

답변

1

일반적으로 문법의 진입 점은 EOF으로 끝나는 규칙입니다. 이 경우

을 ... 그리고 : 당신이 경우, translationunit 규칙 시도 : 경우 사람에

ParseTree entryPoint = parser.translationunit(); 

는 의견을 읽지 않는를, 나는 내 대답에 마이크의 주목할만한 코멘트를 추가 할 것 (end n EOF) 기회는 문법의 첫 번째 파서 규칙이 진입 점 (특히 어디에서나 호출되지 않는 경우)입니다. 반면에 내 문법 중 하나에서 EOF로 끝나는 여섯 가지 다른 규칙을 정의했습니다 (주로 내 언어의 하위 요소를 구문 분석). 때때로 까다 롭습니다 :-)

+1

... 그런 경우가 아니라면 (끝 EOF) 기회는 문법의 첫 번째 파서 규칙입니다 (특히 어디에서나 호출되지 않는 경우). 반면에 내 문법 중 하나에서 EOF로 끝나는 여섯 가지 다른 규칙을 정의했습니다 (주로 내 언어의 하위 요소를 구문 분석). 때로는 까다 롭습니다. :-) –