2017-04-12 7 views
0

현재 텍스트 스프레드 시트를 입력으로 사용하는 Antlr v4 문법 (각 '셀'은 탭으로 구분됨)을 구현하려고합니다. 문법은 산술 표현식에 사용 된 참조를 포함하여 다른 셀에 대한 참조를 지원합니다. 출력은 입력과 동일하지만 모든 표현식이 완료되고 각 참조는 참조되는 셀의 정수 값으로 대체됩니다.Antlr : 아직 파싱되지 않은 데이터에 대한 참조

예 입력 :

1 9 5 
    4 3 A3 
    =A2+C3 6 

및 출력 :

1 9 5 
    4 3 5 
    15 

내 자바 응용 프로그램에서 파서를 구현하는 방법에 확신입니다. 셀은 아직 파싱되지 않은 셀에 대한 참조를 포함 할 수 있으므로 문법은 표현식을 평가하기 전에 셀을 파싱해야합니다. 내 이해에서, 문법 방문자는 구문 분석 동안 값을 반환 할 수 있지만 아직 구문 분석되지 않은 셀에 대한 참조를 포함하는 표현식은 평가할 수 없습니다.

가장 좋은 방법은 무엇입니까? 내가 결정할 수 있었던 유일한 해결책은 문법을 두 개의 더 작은 문법으로 나누는 것이 었습니다. 하나는 셀을 구문 분석하고 다른 문법은 셀 내부의 표현을 구문 분석하는 것입니다. 그러나, 나는 단지 하나의 구문 분석 프로세스로 간단하게 유지하려고합니다.

한 문장으로, Antlr4에서 아직 구문 분석되지 않은 데이터에 대한 참조를 처리하는 가장 좋은 방법은 무엇입니까?

답변

3

구문 분석 중에 식을 평가할 필요가 없습니다. 전체 프로세스를 2 단계로 수행하십시오. 먼저 입력을 구문 분석하여 구문 분석 트리를 얻은 다음 방문자를 사용하여이를 평가합니다. 1 단계 후에 모든 셀이 구문 분석 트리로 구문 분석되므로 평가 단계에서 확인할 수 있습니다.

+0

+1 IMHO 자신의 모델을 사용하여 평가하는 것이 좋습니다. antlr에 의해 생성 된 * Context 객체가 아닙니다. – Yevgeniy

+0

내가 처음으로이 대답을 읽은 것을 잘못 읽었습니다. Antlr과 정확히 어떻게 평가 단계를 구현합니까? 내 이해에서, 방문자 깊이 우선 탐색을 않습니다. 내가 필요로하는 것은 셀을위한 폭이 먼저 있고, 셀 안의 표현을위한 깊이가 먼저 있습니다. – bgregor

+0

다른 산책 전략이 필요한 경우 방문자 클래스를 만듭니다. AbstractParseTreeVisitor의 모든 내용을 재정의 할 수 있습니다. 자신의 변형 인'visitChildren()'메소드를 구현하십시오. –