譯者按:打算翻譯乙份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.標籤 ...