1

이전에 생성 된 AST 트리에서 심볼 테이블을 작성하는 방법과 관련하여 javacc 인터프리터를 만드는 방법에 대해 상당히 혼란스러워졌습니다. 이 AST에서이 같은JavaCC 인터프리터 (AST to Symbol Table)

뭔가 :

> Program 
> Id 
> Id 
> Id 
> VarDecl 
> Type 
> Id 
> Stl 
> Id 
> NewInt 
> IntLit 
> Sta 
> Id 
> IntLit 
> ParseArgs 
> Id 
> IntLit 
> Sta 
> Id 
> IntLit 
> ParseArgs 
> Id 
> IntLit 
(…) 

이 테이블

=== Symbol table === 
Name Type Init Values 
---- ---- ---- ------ 
args args[] true 2 12 8 
x  int[] true 2 4 0 

이 입력으로 예를 들어 내가 지금 무엇을 가지고 만 AST를 생성

class gcd { 
    public static void main(String[] args) { 
    int[] x; 
    x = new int[2]; 

    x[0] = Integer.parseInt(args[0]); 
    x[1] = Integer.parseInt(args[1]); 
    if (x[0] == 0) 
     System.out.println(x[1]); 
    else 
     while (x[1] > 0) { 
     if (x[0] > x[1]) 
      x[0] = x[0] - x[1]; 
     else 
      x[1] = x[1] - x[0]; 
     } 
    System.out.println(x[0]); 
    } 
} 

.

내 큰 문제는 트리에서 유형을 정의하고 하나씩 비교하는 방법입니다.

이론을 포함하여 도움이 될 것입니다.

감사합니다.

답변

1

간단한 대답은 "나무를 걷고 기호 표를 만든다"입니다.

되풀이 아래로으로 범위가 지정됩니다. 마주 치게되는 그런 각 마디의 범위를 형성하고, 범위 스택의 꼭대기를 민다. 당신이 노드의 선언 자식을 방문하면 그 범위를 도입, 범위 스택의 상단에있는 범위에 선언의 정의를 삽입합니다. 스코프를 도입 한 노드에서 돌아 오면 스코프 스택을 팝하십시오. Voila : 어휘 범위 언어의 기호 표. 이 모든 것은 JavaCC와는 별개이며 컴파일러 서적에서 잘 설명되어 있습니다. 당신이 그것을 얻고 그것을주의 깊게 읽으라고 제안하십시오.

네임 스페이스가있는 언어는 쉽지 않지만이 구조에 구부러 질 수 있습니다. 이 방법이 쉽지 않은 범위에는 더 복잡한 관계가있는 언어가 있습니다.

이제 Java에서 이렇게하려면 ... 형식 시스템의 세부 사항은 복잡하고 모호하며 유형에 대한 구문이 무엇을 의미 하는지를 아는 것은 매우 복잡합니다. 템플릿이있는 유형이 있습니다. 컴파일러 서적으로 도움을받을 수 없습니다. 자체 기호 테이블을 작성하는 경우 Java 참조 매뉴얼을 해석해야합니다. 이것이 매우 어렵다고 생각하십시오; 그것은 다른 모든 사람들을위한 것입니다.

패키지 참조가 발생할 때 "쉽게 중첩되지 않는"범위 지정 문제 중 하나를 발견하게됩니다. 패키지 참조를 포함하는 모듈의 이름을 확인하려면 먼저 참조 된 패키지의 소스 또는 클래스 파일을 찾고 에 대한 심볼 테이블을 구축해야합니다.. 즉, 한 파일에 대한 심볼 테이블을 작성하는 도중에 파일 시스템에 접근하거나 [텍스트 또는 클래스로] 파일을 구문 분석하고 진행하기 전에 심볼 테이블을 작성해야 할 수 있습니다.

결론 : Java는 기호 테이블 빌더에 대해 불편한 놀라움으로 가득합니다.

(저는 프로그램 분석 도구를 작성합니다. 다양한 Java 언어가 작동하려면 며칠이 걸렸지 만 Java 1.7을 통해 적절한 기호 테이블을 작성하는 데 몇 개월이 걸렸으며 Java 1.8).

실제로 AST와 기호 테이블을 사용하려는 경우 다른 사람의 파서/이름 유형 분석기를 가져 오는 것이 훨씬 낫습니다. JDT AST 기계가 떠오른다. 우리 회사도이 공간에서 도구를 제공합니다.