1. 程式人生 > >編譯原理學習筆記(一)制導翻譯器

編譯原理學習筆記(一)制導翻譯器

《編譯原理》在第二章中給出了一個翻譯表示式的例子(從中綴表示式到字尾表示式)。總結了如下內容:
1. 寫出描述語法規則的產生式(文法包含產生式集合與符號集合)
2. 根據文法建立對應語句的語法分析樹
3. 消除語言的二義性
4. 運算子的結合性以及優先順序
5. 通過向文法的產生式附加屬性和翻譯方案得到翻譯結果

NC程式碼的文法屬於上下文無關文法,構造簡單(加之最近畢設要做相關內容),因此用NC程式編譯器來作為學習語法制導的例子。
一條NC指令的結構如下:
N.. G.. X±..Y±..Z±…..M..S..T..F..;
其中NXXX為指令編號,如N001。GXXX為G程式碼編號。XYZ為尺寸字,如X100代表x軸正移至100,Y-50代表y軸負向移位至50。M為M程式碼編號,S為主軸速度功能字,T為刀具功能字,F為進給功能字。
乍一看很麻煩,其實只是指令字的類別繁雜。

NC文法產生式如下:
stmt ->N id code ;
id-> num | num id
num -> 0|1|2|3|4|5|6|7|8|9
code -> G X Y Z M S T F
G -> ε | G id
X -> ε | X char id
Y -> ε | Y char id
Z -> ε | Z char id
M -> ε | M id
S -> ε | S id
T -> ε | T id
F -> ε | F id
char -> ε | +

| -

其中斜體代表非終結符,黑體代表終結符。

對於任意一句指令,可建立語法分析樹。例如:
N001 G01 X100 Z-30 S300 T01 F2;
對應的語法分析樹為(省略部分遞推):

注意,這裡的產生式隱含著這樣一個規則:MSTF是按順序的,即不會出現F指令在T前的情況,但實際上是有這樣的程式碼的,在這個文法體系中,是屬於錯誤的。

目前的內容只是對指令語句進行語法分析,並不能得到結果。要得到結果,需要向產生式附加一些規則或者程式片段,即給出對應語句的語義。
例如:
產生式:
stmt ->N id code ;
語義規則:
編號為id的程式碼,指令為code.t。其中code.t代表code的語義。根據翻譯需求,這裡的語義可以是翻譯為目的碼(機器語言),也可以是執行指令內容(作為直譯器)。

語法制導定義(syntax-directed definition)把每個文法符號和一個屬性集合關聯,並把每個產生式和一組語義規則相關聯,這些規則用於計算與該產生式中符號相關聯的屬性值。
屬性可以按如下方法求值:對於輸入串x,首先建立其對應的語法分析樹,假設一個結點N的標號為文法符號X,使用X.a表示該節點的屬性a的值,並稱標記了相應屬性的語法樹為註釋分析樹。對註釋分析樹中的每個結點上的值應用語義規則求出其屬性值,從子節點求起,進行深度遍歷,直到求出根結點的屬性值。[1]
這種將字串作為屬性值附在結點上的翻譯方法是用來得到目的碼。另一種無需操作字串,直接執行程式片段的方法,是用作直譯器,也可得到相同的翻譯結果。
語義動作(semantic action)是被嵌入到產生式體中的程式片段
簡化其中的無關細節,定義語義動作:
G -> ε | G id {print(“excute G %d”,id.t)}
M -> ε | M id {print(excute M%d),id.t}
……
此時的語法分析樹,將會多出一個額外的子結點,同樣是深度遍歷此樹可得到翻譯結果。

總結:這裡所用到的主要是2.1~2.3的內容,沒有涉及詞法語法分析,僅僅是描述一個簡單的手動翻譯過程:寫出產生式、構造語法樹、附加屬性值或者程式片段、遍歷樹得到結果。

注:文中除了黑體標識以及引用標識屬於書中內容之外,其他大部分為個人理解,僅供參考。

相關推薦

編譯原理學習筆記制導翻譯器

《編譯原理》在第二章中給出了一個翻譯表示式的例子(從中綴表示式到字尾表示式)。總結了如下內容: 1. 寫出描述語法規則的產生式(文法包含產生式集合與符號集合) 2. 根據文法建立對應語句的語法分析樹 3. 消除語言的二義性 4. 運算子的結合性以及優先順

編譯原理學習筆記

.com bubuko image img 記錄 mage 學習 內容 基礎 簡單地瀏覽了一下第一章,主要是基礎性內容,就不記錄了。編譯原理學習筆記(一)

編譯原理學習筆記翻譯程式的實現

上一節所學的主要是語法到語義的內容,通過手動構造語法樹來理解編譯過程。 在3.5節,書中給出了字尾表示式翻譯程式的java實現。根據前面的內容,今天對NC程式碼編譯給出簡易的實現。 在實現前,需要幾個準備內容用以簡化程式碼: 1. 正則表示式 正則表示式

資料庫連線池學習筆記原理介紹+常用連線池介紹

什麼是連線池 資料庫連線池負責分配、管理和釋放資料庫連線,它允許應用程式重複使用一個現有的資料庫連線,而不是再重新建立一個。 為什麼要使用連線池  資料庫連線是一種關鍵的有限的昂貴的資源,這一點在多使用者的網頁應用程式中體現得尤為突出。  一個數據庫連線物件均對應

Servlet學習筆記之Servlet原理、初始化、生命週期、結構體系

Servlet是用java語言編寫的應用到Web伺服器端的擴充套件技術,與java物件的區別是,Servlet物件主要封裝了對HTTP請求的處理,並且它的執行需要Servlet容器的支援(以下會介紹原因,也可以看之前的一篇介紹Servlet容器的部落格,(http://blog.csdn.net/megust

《Kalman濾波原理及應用》學習筆記——Kalman濾波演算法在溫度測量中的應用

Kalman濾波器 考慮用如下狀態空間模型描述的動態系統(1.1)X(k+1)=ΦX(k)+ΓW(k)X(k+1)=\Phi X(k)+\Gamma W(k) \tag{1.1}X(k+1)=ΦX(k)+ΓW(k)(1.1)(1.2)Y(k)=HX(k)+V(

TypeScript 學習筆記安裝、編譯

TypeScript TypeScript 是一種由微軟開發的自由和開源的程式語言,它是JavaScript的一個超集,擴充套件了JavaScript的語法。 1、安裝 npm install -g

Kaldi學習筆記——Kaldi的下載安裝與編譯

Kaldi是一款基於C++編寫的開源語音識別工具箱。這款工具既可以在Windows下編譯也可以在Linux下編譯。本次我是在虛擬機器裝上了Ubuntu 16.04.03,64位,可以聯網。文件裡面也說還是建議在Linux下使用Kaldi。一、下載下載直接利用git版本控制系統

Qt學習筆記 VS2013編譯Qt5.4靜態庫(轉)

一、環境配置 我目前用的系統是Windows 8.1,請注意安裝好以下軟體,以及配置好環境變數: Visual Studio 2013 python perl 安裝好以上軟體 請用cmd測試下 python 和perl,如果提示不是內部或外部命令,也不是可執行的程式或批處理

python框架之 Tornado 學習筆記

tornado pythontornado 一個簡單的服務器的例子:首先,我們需要安裝 tornado ,安裝比較簡單: pip install tornado 測試安裝是否成功,可以打開python 終端,輸入: import tornado.https

Scala學習筆記編程基礎

大數據 上一個 extends 移除 condition api arr 調用方法 tab 強烈推薦參考該課程:http://www.runoob.com/scala/scala-tutorial.html 1. Scala概述 1.1. 什麽是Scala Scala

3D Game Programming withDX11 學習筆記 數學知識總結

表示 圖形 http 根據 轉置 元素 material -s com   在圖形學中,數學是不可或缺的一部分,所以本書最開始的部分就是數學知識的復習。在圖形學中,最常用的是矢量和矩陣,所以我根據前面三個章節的數學知識,總結一下數學知識。 一、矢量   數學中的矢量,擁有

系統分析與設計學習筆記

學習 掌握 應該 溝通 基本 最終 表示 對象 毫無 為什麽要學習這門課程?   “擁有一把錘子未必能成為建築師”。 這門課程學習的是面向對象分析和設計的核心技能的重要工具。對於使用面向對象技術和語言來,創建設計良好、健壯且可維護的軟件來說,這門課程所

最大熵學習筆記預備知識

color wrap targe dsm entropy plus 文件 eight 相關鏈接 生活中我們常常聽到人們說“不要把雞蛋放到一個籃子裏”。這樣能夠減少風險。深究一下,這是為什麽呢?事實上,這裏邊包括了所謂的最大熵原理(The Maxim

Nginx模塊之Nginx-Ts-Module學習筆記搶險體驗

學習筆記 體驗 nginx模塊 int images clas tps gin issues 1、通過HTTP接收MPEG-TS2、生產和管理Live HLS 3、按照官方的編譯和配置,當然了我是第一次編譯沒有通過,在作者重新調整下,編譯成功,感謝:@arut https:

jq學習筆記

簡單 ren 當前 一個 text 互斥 元素 如果 property 1 .attr() 與 .removeAttr()方法 - atr()方法用來獲取和設置元素屬性 attr()有4個表達式: attr(傳入屬性名):獲取屬性的值 attr(屬性名, 屬性

Redis學習筆記關於在windows64位環境下的安裝學習使用

客戶端 mas key-value 錯誤 services 再次 基準 alt 類型 前言 由於工作需要,目前我正在學習使用Redis。我當時學習Redis就從網上下載了點資料就開始學習了。入門看的是《REDIS入門指南》,這本書個人覺得很適合新手用來學習接觸。根據書上的引

Memcache 學習筆記----Memcache — Linux部署

工作 apach sch trick 解壓 font ash 一個 鍵值   Memcache 一、Memcache簡介(內容摘自 --百度百科)   memcache是一套分布式的高速緩存系統,由LiveJournal的Brad Fitzpatrick開發,但目前被許多網

HtmlParser學習筆記-- 創建Parser對象

nco 修改 英文 text aid 意思 charset 網頁 第一個 首先 ,介紹下HTMLParser的核心類,org.htmlparser.Parser類,這個類實際完成了對於HTML頁面的分析工作。主要的構造函數如下: public Parser ();

Python 學習筆記

pytho oat 變量 情況 class 弱類型 定義 寫代碼 基本上 為什麽學習Python?因為Python 的用處太多了。 本想學會一們語言就好好的維持下去,但是最近Python太火啦,什麽人工智能、網絡爬蟲的,耳濡目染的,心想多學習一些東西總是好的,於是就抽空學習