CC1 編譯器的符號表

CC1 編譯器

簡介

C1 語言

詞彙取得

語法規則

語法剖析

符號表

語意分析

中間碼

組合語言產生

訊息

相關網站

參考文獻

最新修改

簡體版

English

#ifndef SYMTABLE_H
#define SYMTABLE_H

#include "lib.h"
#include "HashTable.h"
#include "Tree.h"

// 型態 Type 有:函數、結構與指標與基本型態
//   基本 : int x;
//   指標  : int *px;
//   函數  : int total(int a[]) {...};  
//   結構  : struct Person { ... };

typedef struct _Method {
    char *name;
    char *returnType;
    Array *params;
} Method;

typedef struct _Struct {
    char *name;
    Array *fields;
} Struct;

typedef union _Type {
    Method *pmethod;
    Struct *pstruct;
    char   *pbtype;
} Type;

// 符號的值可能是 byte, int, float 或 pointer (包含 struct, method, type*)
typedef union _Value {
    BYTE  bvalue;
    int   ivalue;
    float fvalue;
    void  *pvalue;
} Value;

// 變數符號: int x; Symbol(name=x, tag=VAR, type=int)
// 函數符號: int total(int a[]) {...};  Symbol(name=total, tag=METHOD, type=int)
// 結構符號: struct Person { ... }; Symbol(name=x, tag=ETYPE, type=int)
typedef struct _Symbol { // 符號記錄
    void  *scope; // 所屬領域 
    char  *name;  // 符號名稱 (x, px, Person, total) 
    char  *tag;   // 符號標記 (變數定義 VAR 函數定義 METHOD、結構定義 STRUCT)
    Type  type;   // 符號的形態 
    Value value;  // 符號的值 
} Symbol;

typedef HashTable SymTable;

Symbol *SymNew(void *scope, char *name, char *tag);
void SymFree(Symbol *s);
void TypeFree(Type *type);

SymTable *SymTableNew();
Symbol *SymTablePut(SymTable *table, Symbol *sym);
Symbol* SymTableGet(SymTable *table, void *scope, char *name);
void SymTableFree(SymTable *table);
void SymTableDebug(SymTable *table);

#endif

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License