2012-03-07 2 views
5

저는 학습 경험을 위해 처음부터 C# 인터프리터를 작성하고 있으며, 지금까지 모든 것이 원활하게 진행되었습니다. 모든 종류의 토큰을 파서에 출력하는 완전한 기능을 갖춘 C# 렉서가 있습니다. 토큰을 파싱 할 방법을 알고 있지만 AST (추상 구문 트리)를 어떻게 구성해야할지 모르겠습니다.추상 구문 트리의 일부를 설계하는 방법은 무엇입니까?

예를 들어, 나는 간단한 코드 조각이있는 경우 :

using System.Xml; 

나무가 구문 분석 할 때처럼 무엇을 보일 것입니까?

좋아요?

UsingDirective 
    Identifier(System) 
     Identifier(Xml) 

또는 이와 유사합니까?

UsingDirective 
    Identifier(System) 
    Identifier(Xml) 

I은 ​​/ 다른/다른 문이, 하나 개의 문장으로 결합 변수 선언/할당 (I를 int로하면 만약 내가 그들에 점으로 식별자 등을 구조화 수있는 방법에 대한 몇 가지 제안 및/또는 예를 얻을 수 있다면 = 0;), 함수 정의 등이 도움이 될 것입니다. 나는 나무를 어떻게 구성하는지 더 잘 이해할 필요가 있고, 나머지는 직접 알아낼 수 있습니다. 감사.

+0

C#을 모두 구현하려는 경우 오랜 학습 경험이 될 것입니다. – svick

+0

클래스 라이브러리의 대부분을 제외하고 있습니다. 기본적으로 기본 클래스/함수 정의, 변수 생성/사용 및 함수 호출을 위해 구현해야 할 것을 구현하는 것입니다. –

답변

2

나는 과거에 파서의 몇 가지를 작성했습니다, 나는 일반적으로 같은 뭔가를 갈 것입니다 : 내가 선호하는

UsingDirective 
    IdentifierList 
    Identifier (LeftNode) (System) 
    Identifier (RightNode) (Xml) 

로슬린 달리이 using System.Collections.Generic

UsingDirective 
    IdentifierList 
     IdentifierList (LeftNode) 
      Identifier (LeftNode) (System) 
      Identifier (RightNode) (Collections) 
     Identifier (RightNode) (Generic) 

의 경우 컴파일러는 그들을 필요로하지 않기 때문에 세미콜론 같은 토큰을 포함하지 않음으로써 내 AST를 밝게 유지합니다. using 키워드 등.

내가 특별히 IDE 용으로 작성한 파서는 다르게 보입니다. 라인과 열 번호와 같은 더 많은 정보와 함께이 모든 여분의 것들을 가지고 있습니다.

+0

왜 당신은'IdentifierList'에 두 명의 자식 만 만들었습니까? 왜 필요한만큼의 자식으로 하나의'IdentifierList'를 가지지 않겠습니까? – svick

+0

네, 무제한의 아이를 가진 하나의 IdentifierList가 더 좋을 것이라고 생각합니다. 어쨌든 당신의 대답 xbonez에 감사드립니다. –

+0

나는 그것이 잘 작동 할 것이라고 확신한다. 개인적으로 idents 목록 일 때보 다이 방식 (재귀 적으로)을 순회하는 것이 더 쉽습니다. 나는 traverIdentList 함수를 설정했다. if (identlist.leftnode is identlistnode) {traverseIdentList (leftnode); } else {traverseident (leftnode); } traverseident (오른쪽 노드); ' – xbonez

2

당신은 Microsoft가 Roslyn과 함께 이것을 어떻게하는지 볼 수 있습니다. 거기에서 C# (및 VB.NET)의 구문 트리를 어떻게 선언했는지를 알 수 있었을 것입니다. 작성하기 전에 인터프리터의 일부 대신 사용할 수도 있습니다.

특히, 당신의 using 지침에 대한 로슬린 구문 나무는 다음과 같습니다 : 두 번째 버전과 유사하지만, 더 자세한 그래서

UsingDirective 
    UsingKeyword 
    QualifiedName 
     IdentifierName (System) 
     DotToken 
     IdentifierName (Xml) 
    SemicolonToken 

.

나는 첫 번째 버전이별로 의미가 없다고 생각합니다. Xml은 문법적 수준에서 System의 하위 항목이 아닙니다 (나중에 의미 론적 수준에서 "부모 네임 스페이스"개념을 가질 수도 있음).

+0

하지만 이것은 추상 구문 트리가 아니며 구체적인 구문 트리입니다. 점과 세미콜론과 같은 소스 코드의 일부가 포함되어 있습니다. –

+0

네 말이 맞아. 하지만 당신이 당신의 AST를이 기초로 할 수 있다고 생각합니다. – svick

+0

네, 답변 해 주셔서 감사합니다! 도움이되었습니다. –

관련 문제