翻譯乙份lex yacc教程,希望不要爛尾

2021-08-30 16:40:35 字數 1643 閱讀 3636

譯者按:打算翻譯乙份lex& yacc教程,每天一點點,這個是原文的第一部分,介紹。

1. 介紹

直到2023年,寫乙個編譯器還是乙個非常耗時的里程。然後lesk和johnson發布了關於lex和yacc的**。這些工具極大地簡化了編譯器的構造。lex和yacc的實現細節可以在 aho[1986]裡找到。

lex和yacc可以在以下地方找到

1. mortice kern systems(mks),

2.gnu flex and bison, at

3.ming, at

4.cygnus, at and

5.my version of lex and yacc, at

原始碼 a = b + c * d|v

詞法分析|v

語法分析|v

語法樹 =

/ \id1 +

/ \id2 *

| / \

| id3 id4

**生成|v

生成的** load id3

mul id4

add id2

store id1

圖1.1 編譯順序

lex生成詞法分析的c**,或者說是掃瞄器。它使用這樣一種模式,匹配輸入字串,並將字串轉化成符號(token)。符號是這些字串的數字表示。上圖可以說明。

當lex在輸入流中找到了變數名,就把它們放入符號表。符號表也同時儲存著其它一些資訊,比如資料型別(整形還是實形)和變數在記憶體中的位址。接下來所有對變數的引用都會通過符號表+索引的形式來實現。

yacc生成語法分析的c**,或者說是解析器。yacc利用語法規則,來分析lex產生的符號,並構造語法樹。語法樹把符號理清了層次結構。下一步,**生成,對語法樹進行深度優先的遍歷來生成**。有些編譯器產生機器碼,另外一些,如上圖所示,輸出的是彙編碼。

(yyparse) source

bas.y -> yacc -> y.tab.c |

| \ |

| \ v

y.tab.h cc -> bas.exe

| / |

| / |

bas.l -> lex -> lex.yy.c v

(yylex) 編譯輸出

圖1.2 用lex/yacc構造乙個編譯器

圖1.2說明了保用lex和yacc時檔名的轉換。我們先設定我們的目標是寫乙個basic編譯器。首先,我們使用lex來識別所有的模式匹配,使用yacc來識別語法規則。建立你自己的編譯器,bas.exe,的命令,如下:

yacc –d bas.y # 建立 y.tab.h, y.tab.c

lex bas.l # 建立 lex.yy.c

cc lex.yy.c y.tab.c –obas.exe # 編譯鏈結

yacc從bas.y中讀出語法描述,並生成解析器,主要部分是y.tab.c檔案中的yyparse。bas.y包含了符號宣告的標頭檔案,-d的引數使yacc生成符號的定義並把它們放置在標頭檔案y.tab.h中。lex讀出bas.l中的模式描述,包含y.tab.h標頭檔案,並生成詞法分析器,主要部分是yylex,在檔案lex.yy.c中。

最後,詞法分析器和語法解析器都被編譯,並鏈結在一起,形成乙個可執行檔案,bas.exe。在它的main函式中,我們呼叫yyparse來驅動整個編譯器。函式yyparse中自動呼叫yylex來獲得每乙個符號。

這是乙份完整的Python魔術方法教程

在python中,所有以 雙下劃線包起來的方法,都統稱為 magic method 中文稱 魔術方法 例如類的初始化方法 init python中所有的魔術方法均在官方文件中有相應描述,但是對於官方的描述比較混亂而且組織比較鬆散。很難找到乙個例子。今天我在苦惱魔術方法的時候,發現了乙個好東西,乙份完...

總結現在的工作,我希望的下乙份工作和我近期的打算

不知不覺已經在這個公司工作快2年時間了,在這裡學到了很多東西,不過我還是離去的想法.在離開之前我對這兩年來的工作做一下總結,還有我希望下乙份是什麼樣的工作.這是一家專做車載導航的嵌入式公司,但是公司的市場不在中國,而是在日本.日本總部會把專案派發給我們公司來做。大概公司的業務流程就是這樣。當我們接到...

鏈脈課堂 這是乙份抖音營銷快速入門教程

有人可以用一萬粉絲做到月入過萬,有人擁有百萬粉絲卻無法變現。抖音如何玩,今天簡單聊聊。流量在 紅利就在 抖音月活使用者5億,日活使用者2.5億。這麼大的流量池,你只需要在垂直細分領域找到自己的位置,定位好自己的標籤,自然能汲取到足夠的流量。當然也得有方法,下面就分解下.1.定位,觸發機制 2.標籤 ...