編譯原理語義分析 編譯原理 語義分析和符號表

2021-10-12 04:37:38 字數 2493 閱讀 6009

本文使用 zhihu on vscode 創作並發布經過詞法分析、語法分析之後,源程式形式上和結構上的正確性基本得到了保證。然而,僅有形式上的正確性,並不能保證源程式就是完全正確的,還要檢查源程式的含義是否正確。

諸如符號的使用是否得當,表示式的型別是否相容等,完成這些功能的編譯階段稱為語義分析

語義

一般來說,語言的定義包括: 詞法,語法,語義和語用。

語義是單詞,句子和語言的含義,語用說明了語言的用途。

編譯階段即可確定的語義稱為靜態語義,目標**執行時才能確定的叫動態語義。

符號表的資料結構

符號表的每個條目中包含了乙個識別符號相關的資訊,符號表的一般結構如下

識別符號的內部表示

常量識別符號的內部表示:

name 	常量的名字

kind 識別符號型別,值為constkind,表明是乙個常量識別符號。

type 資料型別,值為指向具體常量的型別的內部表示的指標,比如intptr,realptr。

value 值為指向具體常量值的內部表示的指標。

⬆(3.14)表示實數值3.14的內部表示指標

變數識別符號的內部表示:

name 	變數的名字

kind 識別符號型別,值為varkind,表明是乙個變數識別符號。

type 資料型別,值為指向具體變數的型別的內部表示的指標,比如intptr,realptr。

access 表示這個變數是直接變數還是間接變數,直接是變數,間接是指標,直接(dir),間接(indir)。

level 表示該變數的宣告在哪一層,從0計算,每個 '

void p(int x, real* y)

網域名稱識別符號的內部表示:

name	識別符號的名字

type 是網域名稱識別符號型別的內部表示指標

off 是網域名稱識別符號對於記錄型別分配到記憶體塊起始位址的偏移量

next 指向下乙個網域名稱識別符號內部表示的指標

來乙個c語言版本的網域名稱識別符號定義:

typedef struct studtype

型別的內部表示:對資料型別進行分析,因為有自己定義的成分,很多時候需要把型別本身的資訊變成一種內部表示記錄。

標準型別的內部表示如下

陣列型別的內部表示

size	陣列型別所佔空間的大小

kind 值為arrayty,表示為陣列型別。

low 陣列下標的下界

up 陣列下標的上界

elemtype表示陣列成分型別的內部表示指標

來乙個c語言版本的陣列識別符號內部表示:

int a[10];

char b[5][10];

結構體型別的內部表示

size		結構型別所佔空間的大小

kind 值為structty,表示為結構體型別

fieldlist 值為field_1,field_1是結構體內部網域名稱表的表頭。

來乙個c語言版本的結構體識別符號內部表示:

struct date

struct bookno

列舉型別的內部表示

size		列舉型別所佔空間的大小

kind 值為enumty,表示為列舉型別

fieldlist 值為field_1,field_1是列舉型別內部列舉常量表表頭的指標,列舉常量表的內部表示結構如下:

name 列舉常量的名字

value 列舉常量代表的整數值

來乙個c語言版本的列舉型別示例:

enum color

指標型別的內部表示

size	表示指標型別的大小,由編譯程式確定指標型別應分配的資料空間的大小,同一系統中大小應該相同,一般為1.

kind 值為pointerty,表示指標型別。

typename表示指標指向的資料的型別的內部表示的指標。

c語言版本定義:

int * p1;

float * p2;

//p1和p2是整型指標和浮點型指標,記為t1,t2

符號表的建立與訪問

待補充

編譯原理之語義分析

見語法制導翻譯篇 語義是指源程式及其組成部分所表述的含義 和語法不同,語法是關於程式及其組成部分的構成規則的描述,是上下文無關的 而語義是關於語法結構的含義及其使用規則的描述,是上下文有關的。語法上正確,其語義不一定正確。語義分析與中間 生成器基於語義規則,對語法樹進行語義分析 變數是否定義,型別是...

編譯原理 語義分析題型

字尾式 又稱逆波蘭表示法,把運算量 運算元 寫在前面,把算符寫在後面 字尾 如 a b 寫成 ab a b c 寫成 abc 字尾式要注意的是運算符號優先順序 c語言中運算子優先順序排序如下 優先順序 高到低 分為優先順序15級 1 圓括號 下標運算子 分量運算子的指向結構體成員運算子 結構體成員運...

編譯原理語義分析(文字輸入)源程式

include include include include include struct quad struct quad quad 30 int count 0 char expression void char prog 200 token 9 function長度為8,加上 0 所以陣列最...