制作簡(jiǎn)單的編譯器需要怎么做?怎樣從無做到有?跟著我的教學(xué)走,你會(huì)覺得很簡(jiǎn)單
編譯原理是計(jì)算機(jī)專業(yè)大三或者大四的必修課程之一,許多學(xué)員都會(huì)對(duì)學(xué)生提出硬性或者軟性的制作簡(jiǎn)易編譯器的要求。許多學(xué)生手足無措,別急,學(xué)長(zhǎng)也是過來人,看完這個(gè)教程,保證你輕輕松松完成屬于你自己的編譯器。
首先第一篇教程不會(huì)涉及具體的實(shí)現(xiàn)。在這種大工程之前,正確的模塊劃分是極為重要的。這樣可以讓你階段性地看到自己的成果,對(duì)于自信心是一個(gè)極大的幫助;此外,正確的模塊劃分有助于后期排除錯(cuò)誤。
在此之前也介紹一下工作量。如果完全自己手撕一個(gè)編譯器,其工作量可能和手撕一個(gè)CPU(用verilog)工作量差不多,大概會(huì)耗時(shí)一個(gè)月左右,不過如果只是交一個(gè)作業(yè),完全不用全部自己完成。特別是語義分析這種工作,有大量現(xiàn)成的代碼稍加修改就可以直接使用(當(dāng)然,嚴(yán)格意義上來講,所有部分都可以稍加修改直接使用)。
我們將編譯器制作分為以下四個(gè)模塊分塊實(shí)現(xiàn)完成:
一、語法分析、詞法分析模塊(yacc、lex)
yacc、lex是linux環(huán)境下的語法生成器和詞法生成器,使用非常廣泛。一般情況下老師也比較鼓勵(lì)學(xué)生去用yacc和lex去完成這樣的實(shí)驗(yàn)。需要說明的是,在現(xiàn)存的linux操作系統(tǒng)中,yacc和lex已經(jīng)發(fā)生了變異。我們所采用的是ubuntu環(huán)境下的bison和flex。
二、語義分析(C語言)
語義分析是在詞法分析語法分析結(jié)束,生成了語法樹的基礎(chǔ)上,對(duì)語法樹進(jìn)行遍歷,建表,查錯(cuò)。
三、中間代碼生成(C語言)
這一部分就是在語義分析的基礎(chǔ)上,生成三元式、四元式之類的。
四、目標(biāo)代碼生成(C語言)
這一步就實(shí)現(xiàn)了從某種語言(你制定的語言)到MIPS代碼的轉(zhuǎn)換。有人說我不要MIPS,我要x86的,沒問題,從中間引入llvm即可
跟著我的教程走,學(xué)到哪里,編譯器做到哪里;做到哪里,作業(yè)交到哪里。即使你只做了語法分析、詞法分析,你也可以交一個(gè)語法生成樹,就是這么簡(jiǎn)單、這么人性化??吹竭@里,如果符合你的要求,follow me;不符合的話,可以去看看其他的教程。