0에서 컴파일러 (VII)을 작성 : 심볼 테이블의 데이터 구조를 의미 론적 분석

에서 프로젝트에 대한 전체 코드 C2j - 컴파일러

머리말

symboltable 가방에 심볼 테이블에 관한 문서

A (1)과 유한 상태 자동 장치는 C 언어의 형식적 완성을 구문 분석하는 LALR 파싱 테이블을 구축하는 정보를 줄이기 완료하여 우리의 앞. 다음 단계는 의미 론적 분석 부를 입력하고, 한 초, 메인 태스크는 변수와 변수의 종류를 기록 심볼 테이블의 의미 론적 분석을 생성 할 수 있으며, 문장의 의미에 적합하지 않은 것으로 판명

설명 변수

선언에 규정 된 C 언어 변수 두 안내 거기

  • 지정자 (지정자)

    통근 또한 다수의 소스 파일을 포함 할 수 있기 때문에 지정자 컴파일러의 실현에 사용되지 않는 키워드를 통근자 같은 (C 언어 등 정적 통근 키워드에 설명 된 종류에 대응하는 변수의 개수 ) 컴파일 및 링크
  • 수정 자 (선언자)

    개질제는 개질제로 결합 될 수도 있기 때문에, 수정이 복합체의 부분 일 수 속하는 괄호 배열 변수 또는 포인터 형 별표 나타낸다. 그래서 수정 조합에 대해 당신은 연결하기 위해, 여러 선언자를 만들 수 있습니다

이 두 클래스는 상대적으로 간단한 논리이다, 두 개의 클래스를 수행 할 수 있습니다 :

선언자 클래스

  • declareType :이 함수에 현재 선언자 배열 또는 포인터를 표시하기 위해 사용되거나
  • numberOfElements 요소 : 현재 입력 단어의 배열 인 경우, 요소의 수와 배열의 배열 요소를 나타낸다
public class Declarator {
    public static int POINTER = 0;
    public static int ARRAY = 1;
    public static int FUNCTION = 2;

    private int declareType;
    private int numberOfElements = 0;

    HashMap<Integer, Object> elements = null;

    public Declarator(int type) {
        this.declareType = type;
    }
    ...
}

지정자 클래스

좀 더 속성을 지정하지만, 컴파일러 후 수도에만 INT, 문자, 무효, 구조체 네 가지 유형을 지원합니다

  • basicType : 현재 변수의 유형을 표시하는 데 사용

  • storageClass는 : 타입 정의 충족하는 경우, 다음 storageClass는 타입 정의로 설정됩니다, 여기 또한 우리는 타입 정의에 대한 정보를 넣어 변수 (고정, 자동)의 저장을 나타냅니다

  • constantValue 및 vStruct : 모두는 열거 형과 구조를 나타내는 두 개의 특별한 속성으로 인해 그 후 특별한 치료를 위해 특별 속한다. 열거 타입 값이 constantValue 대응 즉 basicType 지정자 상수에 대응되는 구성을 충족하면

public class Specifier {
    /**
     * Variable types
     */
    public static int NONE = -1;
    public static int INT = 0;
    public static int CHAR = 1;
    public static int VOID = 2;
    public static int STRUCTURE = 3;
    public static int LABEL = 4;

    /**
     * storage
     */
    public static int FIXED = 0;
    public static int REGISTER = 1;
    public static int AUTO = 2;
    public static int TYPEDEF = 3;
    public static int CONSTANT = 4;

    public static int NO_OCLASS = 0;
    public static int PUBLIC = 1;
    public static int PRIVATE = 2;
    public static int EXTERN = 3;
    public static int COMMON = 4;

    private int basicType;
    private int storageClass;
    private int outputClass = NO_OCLASS;
    private boolean isLong = false;
    private boolean isSigned = false;
    private boolean isStatic = false;
    private boolean isExternal = false;
    private int constantValue = 0;
    private StructDefine vStruct = null;
}

디스크립터 테이블

정의 변수는 앞의 두 클래스에서 설명하지만이 두 클래스가 아직 정확하게 기호를 표현할 수없는, 그래서 우리는 더 표현하고,이 두 종류의 포장을 볼 필요가

프로그래밍 특성에만 데이터 구조의 변수만을 설명하는 데 사용되는 컴퓨터의 심볼 테이블의 특정 요구에 따라 많은 시간을 특정 데이터 구조를 수행

심볼 테이블과 같은 데이터 구조는 여러 염기성 조건이있다 :

  1. 속도
    때문에 심볼 테이블의 빈번한 삽입 및 쿼리 및 삽입 속도가 충분히 빠르지해야하므로, 볼의
  2. 유연한
    변수의 정의는 복잡 할 수 있기 때문에, 예를 들어, 하나 이상의 수정 플러스 포인터 ((long int와 긴 doube의 *에 대한 ) 가 디자인에 충분히 유연해야

컴파일러를 학습 첸의 클래스를 따라, 그래서 심볼 테이블의 디자인은 또한 교사의 디자인에 따라 되었기 때문에

위의 두 조건을 보장하기 위해, 우리는 체인을 달성하기 위해 해시 테이블을 사용

이 사진은 온라인 I 찾으십시오 실제로 복잡하지 않습니다

모든 변수들이 해시 테이블에 저장되고, 해시 같은 장소 것 같은 이름 변수 물론, 그들 범위 다른 구별 다른 범위에 속할 상기도이 부분은, 그와 같은 효과를 생성한다는 것이다 연결된 가변 도메인

symboltable.Symbol

이 클래스는 테이블의 기호 중 하나를 설명하는 데 사용되는

당신은 GitHub의에서 소스 파일을 다운로드하면, 지금 무시 될 수 있습니다 만 코드 생성을 사용할 필요가 뒤에 많은있다

주요 특성은 다음과 같습니다 :

  • 수준 : 변수의 수준을 나타내는 데 사용
  • 중복 : 그것은 같은 이름의 변수인지
  • 인수 : 심볼에 대응하는 함수의 이름은 입력 인수 포인트 부호 함수 목록 매개하면
  • 다음 : 변수 기호 다음 단계로 포인트
public class Symbol {
    String name;
    String rname;
    int level; 
    boolean duplicate; 
    Symbol args; 
    Symbol next;  
}

심벌 플러스 지정자 및 선언자이 시간 이전에 우리가 TypeLink에, 최초의 증가를 다음 세 가지 범주를 연결해야 기호를 설명하기 위해 충분한 표현력을 가지고

TypeLink이 지정자 또는 선언자를 나타내고, 여기에 달성하기 위해 상속이 보이는 것처럼 보일 수 있습니다 조금 더 나은

public class TypeLink {
    public boolean isDeclarator;
    /**
     * typedef int
     */
    public boolean isTypeDef;
    /**
     * Specifier or Declarator
     */
    public Object typeObject;

    private TypeLink next = null;

    public TypeLink(boolean isDeclarator, boolean typeDef, Object typeObj) {
        this.isDeclarator = isDeclarator;
        this.isTypeDef = typeDef;
        this.typeObject = typeObj;
    }

    public Object getTypeObject() {
        return typeObject;
    }

    public TypeLink toNext() {
        return next;
    }

    public void setNextLink(TypeLink obj) {
        this.next = obj;
    }

}

그래야 기호는 두 가지 이상의 속성을 추가 할 필요가 있었다

이러한 개질제 또는 지정자 순차 접속 전에 typeLinkBegin 및 typeLinkEnd 변수 지정자와 수식의 전체 목록을 설명하기 위해 사용되는, 즉 상기

public class Symbol {
    String name;
    String rname;
    int level;  
    boolean implicit;  
    boolean duplicate; 
    Symbol args;  
    Symbol next;

    TypeLink typeLinkBegin;
    TypeLink typeLinkEnd;
}

이것이 완료되면, 예를 들어

long int (*e)[10];

나는 이렇게 말할 수 있습니다

상징 그의 선언 그의 선언 specifer
이름 : declareType = PONITER declareType = 배열 basicType = INT isLong = TRUE
-> -> -> ->

심볼의 구조의 정의

여전히 수,이 문서는이 파일이 때문에 구조 자체의 복잡성, 구조를 설명하는 데 사용되는, StructDefine을 이야기하지 않은, 그래서 특별한 취급하지만, 여전히 구조 변수 더미 자연의 조합이 필요합니다 상기에 설명 된 절차를 사용하여

  • 태그 : 구조의 이름
  • 중첩 된 계층 구조 : 수준
  • 기호 : 변수에 대응하는 구조
public class StructDefine {
    private String tag;
    private int level;
    private Symbol fields;

    public StructDefine(String tag, int level, Symbol fields) {
        this.tag = tag;
        this.level = level;
        this.fields = fields;
    }
}

구조 정의의 예를 참조하십시오

struct dejavidwh {
    int array1[5];
    struct dejavudwh *pointer1;
} one;

개요

그래서 결국에만

private HashMap<String, ArrayList<Symbol>> symbolTable = new HashMap<>();
    private HashMap<String, StructDefine> structTable = new HashMap<>();

당신은 심볼 테이블을 기술 할 수있다

키 동등한 변수 이름에 symbolTable 반면, 이러한 구조는 해시 테이블의 시작 부분에서 설명한 것과 동일하다 각 기호는 다른 기호와 동일한 수준을 가리 키도록 다음 포인터를 가지고 있으므로 때문에 동일한 이름 ArrayList를 변수로 가게의 뒷면

이 섹션은 두 개의 요점 심볼 테이블의 데이터 구조이다 설명

  1. 설명 변수

    따라서, 수식 및 설명 변수 정의를 설명하는 데

  2. 관련 변수

    기호 목록은 일련의 변수를 정의하는

또한 내 GitHub의 블로그 : https://dejavudwh.cn/

추천

출처www.cnblogs.com/secoding/p/11373929.html