2017-05-08 9 views
1

Boost.Spirit의 노드 사이의 양방향 관계가 잘 작동합니다 : I 형 namespace_declaration의 객체를 얻을, 그것은 변형의 목록을 가지고 포함 된 내용 (예 : class_declaration)내가</p> <pre><code>namespace Foo { class Bar { ... } } </code></pre> <p>이 유사한 구조를 구문 분석 Boost.Spirit을 사용하고

내 질문은 : 어떻게 구문 분석 단계에서 class_declaration이 포함 된 것을 참조 할 수 있는지 확인하려면 namespace_declaration? 즉, 내가 방금 파싱 한 것의 컨텍스트 인 객체를 어떻게 참조 할 수 있습니까?

답변

3

수 없습니다. 적어도 안락하게.

실제로이 작업을 원하는 것은 구문 분석 및 처리 코드가 충돌하는 것일 수 있습니다.

의미 론적 검사 만 있으면 필요한 세부 정보를 상황에 맞는 하위 규칙에 삽입 할 수 있습니다. 상속 된 속성을 사용합니다.

뿐만 아니라 심지어 완전한 아직 바깥 구조는 (분명히)이라는 사실을 경우 합리적 "양방향 관계를"할 수 없습니다

  • namespace X { class Y { }; }의 경우 논리적으로는 기대할 수 "X" 이름을 구문 분석 된 것으로 -하지만 이미 do { statement; } while (condition);을 고려하고 특급 수없는 이유를 당신이 볼 수 while (condition) { statement; }
  • 그러나,의 경우 조건 표현을위한 노출 된 속성 값
  • 뎀에 할당 된 것이라는 보장은 없다 제어 흐름 명령문에 대해 알고 싶으면 statement을 참조하십시오.

그래서, 모두 모두, 나는 문제의

  1. 분리 제안 : 먼저 의미 검사, 변환, 구문 분석을 처리 이후
  2. 당신이 즉석에서 의미 정보를 사용해야하는 경우 (예를 들어 있기 때문에) 문맥을 명시 적으로 전달합니다.