這是我個(gè)人用來(lái)學(xué)習(xí)編譯原理,練習(xí)實(shí)現(xiàn)的工具
假設(shè)我們有一個(gè)數(shù)據(jù)文本文件如下:
0x00000001, 0x0000012a, 0x01042018, 0x000406d8,
0x7cacb989, 0x00000001, 0x00000001, 0x00014bd0,
0x00014c00, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x000000a1, 0x00020001, 0x0000012a,
0x00000000, 0x00000000, 0x20180103, 0x00005271,
0x00000001, 0x000406d8, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x000052f4, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
...
我們要將其轉(zhuǎn)為二進(jìn)制數(shù)據(jù)存儲(chǔ)吊输,利用hexdump 查看如下
0000000 0001 0000 012a 0000 2018 0104 06d8 0004
0000010 b989 7cac 0001 0000 0001 0000 4bd0 0001
0000020 4c00 0001 0000 0000 0000 0000 0000 0000
0000030 0000 0000 00a1 0000 0001 0002 012a 0000
0000040 0000 0000 0000 0000 0103 2018 5271 0000
0000050 0001 0000 06d8 0004 0000 0000 0000 0000
0000060 0000 0000 0000 0000 0000 0000 0000 0000
0000070 0000 0000 52f4 0000 0000 0000 0000 0000
用c語(yǔ)言實(shí)現(xiàn)此項(xiàng)功能很簡(jiǎn)單饶号,一般需要如下幾步
- 按行讀取文件
- 利用strchr 或 strtok函數(shù)分割字符串
- 解析數(shù)據(jù),轉(zhuǎn)換(此時(shí)要考慮大小端)季蚂,存儲(chǔ)到文件茫船。
如果從編譯原理的角度考慮這個(gè)問(wèn)題可以為:
- 編譯一個(gè)文本文件為二進(jìn)制數(shù)據(jù)文件
- 這比實(shí)現(xiàn)c語(yǔ)言到機(jī)器碼要簡(jiǎn)單的多
- 不夠?qū)崿F(xiàn)起來(lái)依然要考慮分詞,語(yǔ)法分析扭屁,狀態(tài)轉(zhuǎn)移算谈,后端調(diào)優(yōu)等動(dòng)作。
目前的實(shí)現(xiàn):
- 采用逐字解析料滥,解析過(guò)程不回溯然眼。
- 不生成語(yǔ)法樹(shù)
3 一輪編譯,后端調(diào)優(yōu)以大小端轉(zhuǎn)化的形式模擬葵腹。
調(diào)試期間遇到的問(wèn)題:
- 混淆了 get_token get_next_token的語(yǔ)義
- get_token 直接返回了指針高每,導(dǎo)致后續(xù)判斷邏輯混亂屿岂,應(yīng)直接返回ascii碼
- EOF判斷邏輯混亂,EOF判斷應(yīng)在解析最上層判斷
下一步:
- 重寫(xiě)strtol語(yǔ)義函數(shù)
- 后續(xù)會(huì)更新此倉(cāng)庫(kù)鲸匿,完成對(duì)編譯原理基本知識(shí)的學(xué)習(xí)
代碼:
代碼放在了github