2014-10-20 4 views
1

ANTLR4를 사용하여 LaTeX의 하위 집합으로 수학 공식을 파싱하려고합니다. 예를 들어 (a+4)/(b*10)에서 \frac{a+4}{b\cdot 10}까지 구문 분석해야합니다.ANTLR4를 사용하여 수식을 분석하십시오.

내 간단한 문법은 나무 같이 작성

antlr tree

가 지금은 나무가 통과하는 동안 어떻게 든 LaTeX의 문자열을 구성 파스 트리 리스너를 구현하기 위해 노력하고 있습니다. 여기서, \frac{}{}과 같은 문자열을 구성하기 때문에 재귀 적으로 작성해야합니다. 그러나 파스 트리 워커 (parse tree walker)는 한 트리 노드를 다른 트리 노드를 방문합니다 (내가 말할 수있는 한 폭 넓은 방법으로).

내가 원하는 바를 (으)로 파싱 트리 에 대해 읽었습니다. 그러나 나는이 방문자들이 어떻게 적용되는지 예제를 찾을 수 없었다.

구문 분석 트리 리스너/방문자가이 특별한 경우에 어떻게 사용될 수 있는지 예제를 제공 할 수 있습니까? ANTLR을 파서에 사용하는 나의 접근법이 처음부터 의미가 있다고 생각합니까?

답변

3

ParseTreeVisitor 인터페이스를 구현하여 구문 분석 트리 워커를 만들 수 있습니다. 사용 편의성을 위해 Antlr을 지정하여 문법을 컴파일 할 때 기본 방문자를 생성 할 수 있습니다 (Antlrworks, Run->Generate Recognizer->Next->Generate Visitor->Next->Finish). 기본 방문객은 MyGrammarBaseVisitor입니다. 방문객은 모든 방문 메소드가 반환해야하는 제네릭 유형 T가 있음에 유의하십시오. 수동 조작에는 Void을 사용하고 코드 생성 중에는 사용하기 쉽도록 String을 사용하는 것이 좋습니다.

기본 방문객을 확장 한 후에는 (여기서는 String을 다루 겠지만) 방문 방법을 재정의해야합니다. 이 메서드는 여러분이 가지고있는 문법 규칙에 따라 명명됩니다. 이 메소드들 각각은 ParserContext ctx 매개 변수를받습니다.이 매개 변수는 하위 규칙을 방문하거나 터미널 값을 가져 오는 데 사용됩니다. 예를 들어, 당신이 할 수 있습니다 : 나는 당신의 multiplicative 규칙 당신은 The Definitive Antlr 4 Reference에서 자세한 정보를 찾을 수 multiplicative: expr opMult expr; opMult: '*' | '/';과 같은 있으리라 믿고있어

class MyVisitor extends MyGrammarBaseVisitor<String> { 
    @Override 
    public String visitMultiplicative(MyGrammarParser.MultiplicativeContext ctx) { 
     if (ctx.opMult().getText().equals("/")) return "\\frac{" + visit(ctx.expr(0)) + "}{" + visit(ctx.expr(1)) + "}"; 
     else return visit(ctx.expr(0)) + "\\cdot " + visit(ctx.expr(1)); 
    } 
    // visit methods for other rules... 
} 

. Antlr documentation에서 자세한 정보와 예를 확인할 수도 있습니다.

+0

위대한 작품입니다. 감사합니다! 나는 지금 Antlrworks를 사용하고 있는데 (이전에 명령 행에서 문법을 컴파일했다.) 이제는'* Visitor' 클래스가 제대로 생성되었다. – Mouagip

+0

@Mouagip 당신은 여전히 ​​명령 행에서 그것을 할 수 있습니다. 그냥'-visitor' 인자를 사용하십시오! 참조 : https://theantlrguy.atlassian.net/wiki/display/ANTLR4/ANTLR+Tool+Command+Line+Options – Mephy

+0

지적 해 주셔서 감사합니다. 하지만 Antlrworks를 NetBeans 플러그인으로 직접 사용하는 것이 더 편리합니다 .-) 그래도 명령 행은 가능한 빌드 스크립트의 옵션이 될 것입니다. – Mouagip

관련 문제