青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

loop_in_codes

低調(diào)做技術(shù)__歡迎移步我的獨(dú)立博客 codemaro.com 微博 kevinlynx

[總結(jié)]中間/目標(biāo)代碼生成

語法制導(dǎo)翻譯、中間代碼生成、目標(biāo)代碼生成在很多時(shí)候并不存在嚴(yán)格的劃分。對(duì)于目標(biāo)
代碼是某個(gè)簡(jiǎn)單的虛擬機(jī)代碼而言,中間代碼完全可以就是目標(biāo)代碼。中間代碼生成中結(jié)
合了語法制導(dǎo)翻譯,講述了大部分常規(guī)的編程語言結(jié)構(gòu)是怎樣被翻譯成一種接近目標(biāo)代碼
的形式(所謂的中間代碼形式)。本身,匯編代碼就是對(duì)應(yīng)于機(jī)器碼的一種字符表示形式,
而中間代碼的大部分表示形式--三地址碼,也是一種接近匯編代碼的形式。

簡(jiǎn)單來說,詞法分析階段將字符整理為單詞;語法分析則將這些代碼整理為一種層次結(jié)構(gòu)
(識(shí)別了程序代碼要表達(dá)的意思);那么,在接下來的階段里,則是將這些層次結(jié)構(gòu)翻譯
為線性結(jié)構(gòu)。也就是類似于匯編代碼這種格式。這種格式容易被機(jī)器識(shí)別:機(jī)器只需要順
序地一條一條地取指令并執(zhí)行之即可。這種簡(jiǎn)單直接性也使得要實(shí)現(xiàn)類似的虛擬機(jī)變得容
易。

翻譯過程并不需要先生成語法樹,在語法分析階段的語法識(shí)別過程中,即可以對(duì)應(yīng)地翻譯。
因?yàn)闊o論是自頂向下還是自底向上的語法分析,都可以先去識(shí)別葉子節(jié)點(diǎn)。在自頂向下中,
可以使用語法樹(并不真實(shí)存在)的后續(xù)遍歷,使得葉子節(jié)點(diǎn)先于父節(jié)點(diǎn)翻譯;而在自底
向上的分析中,因?yàn)槠浔旧砭褪窍茸R(shí)別葉子節(jié)點(diǎn)(所謂的規(guī)約),所以可以更自然地翻譯。

因?yàn)槲乙彩窍雽?shí)踐下這些東西,所以還是使用lex/yacc來進(jìn)行練習(xí),省得自己去寫詞法和
語法分析。不過在使用yacc的過程中,經(jīng)常會(huì)出現(xiàn)一些shift/reduce conflicts的警告/錯(cuò)
誤,解決這些問題也費(fèi)了不少時(shí)間。不過,也可能是我對(duì)LALR細(xì)節(jié)不熟悉,加之于文法本
身寫的有問題,才弄得如此折騰。現(xiàn)在我覺得上下文無關(guān)文法在整個(gè)編譯原理理論中非常
重要。一個(gè)好的文法可以準(zhǔn)確無誤地描述一種編程語言的語法,還可以指導(dǎo)編譯器的開發(fā)。
當(dāng)然,大部分常規(guī)的語言都可以找到現(xiàn)成的文法。

例子程序構(gòu)造了一個(gè)簡(jiǎn)單的翻譯程序,支持簡(jiǎn)單的算術(shù)表達(dá)式、整數(shù)變量、if、while、以
及僅用于if和while的邏輯表達(dá)式。為了省力,虛擬機(jī)用的是《編譯原理與實(shí)踐》中現(xiàn)成的。
目標(biāo)代碼也就直接是該虛擬機(jī)對(duì)應(yīng)的代碼。該虛擬機(jī)主要有5個(gè)寄存器:指令指針寄存器、
2個(gè)累加寄存器、全局變量基址寄存器、臨時(shí)變量基址寄存器。這里的臨時(shí)變量不同于編
程語言說的臨時(shí)變量,它是表達(dá)式計(jì)算的臨時(shí)值,例如a+b+c,a+b的結(jié)果值就可以被實(shí)現(xiàn)
為存儲(chǔ)到一個(gè)臨時(shí)值中。

對(duì)于算術(shù)表達(dá)式,其實(shí)翻譯起來很簡(jiǎn)單。主要是if/while和邏輯表達(dá)式的翻譯。邏輯表達(dá)
式的翻譯例子中我甚至沒有處理短路代碼:a && func(1)中如果已經(jīng)計(jì)算出a為false了,
就沒必要計(jì)算func(1)了。這可能是受限于yacc,暫不深究。對(duì)于if和while,則主要涉及
到所謂的“回填”技術(shù)。

回填主要是應(yīng)對(duì)向前跳轉(zhuǎn)這種問題。例如在if的代碼生成中,需要測(cè)試if的邏輯表達(dá)式的
真假,如果為假,則需要跳轉(zhuǎn)到then-part之后。這里的then-part也就是if為真時(shí)要執(zhí)行
的代碼序列。而這個(gè)跳轉(zhuǎn)指令具體要跳到哪里,則需要在生成完then-part之后才能確定。
回填的解決方法,就是預(yù)留下這個(gè)跳轉(zhuǎn)指令的位置,等到then-part生成完了,得到了具
體的跳轉(zhuǎn)位置,再回去填寫那個(gè)跳轉(zhuǎn)指令。

在這個(gè)問題上,yacc也讓我折騰了一番。在if文法中:

selection_statement
: IF '(' logical_or_expr ')' {
  // 本來想在這里預(yù)留這個(gè)跳轉(zhuǎn)指令的位置
} statement %prec IFX {
   }

結(jié)果,yacc又給我conflicts和never reduced之類的警告,并且最終生成的代碼也不正常
(果然是無法忽略的警告)。看起來,yacc似乎不支持在文法內(nèi)部添加action。通過一個(gè)
空文法符號(hào)效果一樣。對(duì)于這個(gè)問題,我甚至莫名其妙地在某個(gè)晚上的夢(mèng)里當(dāng)面問了yacc
的作者。他肯定地告訴我:支持,當(dāng)然支持(中文)。今天仔細(xì)地在yacc文檔里找了下,
還真支持。而且對(duì)于空符號(hào)的使用,似乎也有些規(guī)則:$Sign: {action }。

后來解決這個(gè)問題的方法,算是我取巧了:
selection_statement
: IF '(' logical_or_expr IfBracket statement %prec IFX { ....}
IfBracket
: ')' {
     // 邪惡地利用了這個(gè)括號(hào)
   }
另外,因?yàn)樾枰С智短椎膇f/while,還專門使用了一個(gè)棧,用于保存這些需要回填的預(yù)留地址。

 

下載例子

posted on 2010-04-09 20:22 Kevin Lynx 閱讀(8150) 評(píng)論(2)  編輯 收藏 引用 所屬分類: 編譯原理

評(píng)論

# re: [總結(jié)]中間/目標(biāo)代碼生成 2010-04-10 13:37 陳梓瀚(vczh)

其實(shí)不會(huì)受限于yacc,你應(yīng)該在yacc只導(dǎo)出語法樹結(jié)構(gòu),剩下的在語法樹里面做。  回復(fù)  更多評(píng)論   

# re: [總結(jié)]中間/目標(biāo)代碼生成 2010-04-10 17:04 Kevin Lynx

@陳梓瀚(vczh)
我當(dāng)時(shí)想試試直接生成代碼的感覺,因?yàn)榭吹絣ua就是這樣做的。:D。所以就折騰了下自己。
PS,美帝不錯(cuò)吧。  回復(fù)  更多評(píng)論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩中国免费专区在线看| 亚洲精品中文在线| 精品成人a区在线观看| 国产欧美日韩激情| 国产亚洲欧美色| 国内精品久久久久久久影视麻豆| 国产精品一二| 国产亚洲一区二区三区| 尤物99国产成人精品视频| 在线看欧美日韩| 99成人精品| 久久精品女人| 亚洲三级影片| 一区二区三区日韩精品| 午夜影视日本亚洲欧洲精品| 久久五月激情| 欧美日韩中文字幕日韩欧美| 国产精品av久久久久久麻豆网| 国产女人精品视频| 亚洲国产精品v| 亚洲小说欧美另类社区| 久久久久久久综合日本| 亚洲电影在线免费观看| 亚洲一区高清| 欧美高清不卡在线| 国产精品色网| 亚洲精品专区| 久久视频在线看| 亚洲视频欧美视频| 欧美电影免费观看高清| 国产欧美精品一区| 一本综合精品| 亚洲国产成人91精品 | 亚洲国产精品久久久久婷婷老年 | 性色av香蕉一区二区| 久久综合免费视频影院| 亚洲最新中文字幕| 久久影院午夜论| 久久久99爱| 欧美色综合网| 亚洲精品美女在线观看| 欧美在线观看一二区| 亚洲国产片色| 久久资源在线| 国内久久婷婷综合| 亚洲一区二区三区免费在线观看| 蜜桃av一区二区在线观看| 国产欧美一区二区三区另类精品 | 亚洲精品网站在线播放gif| 欧美一区二区在线看| 欧美日韩一区在线视频| 亚洲国产一区在线观看| 久久婷婷成人综合色| 一区二区三区**美女毛片| 欧美大尺度在线观看| 在线不卡亚洲| 玖玖玖国产精品| 久久久国产精品一区二区三区| 欧美视频日韩视频在线观看| 亚洲蜜桃精久久久久久久| 欧美电影专区| 麻豆成人av| 亚洲国产一区在线观看| 亚洲二区在线观看| 卡通动漫国产精品| 在线免费观看日本欧美| 久久在线精品| 久久久久久久久综合| 国产夜色精品一区二区av| 久久精品国产99国产精品| 亚洲欧美激情一区二区| 国产日韩欧美精品综合| 久久久亚洲一区| 久久久在线视频| 亚洲电影免费观看高清| 欧美好骚综合网| 欧美freesex8一10精品| 日韩视频在线观看国产| 日韩一级免费| 国产欧美一区二区三区另类精品 | 亚洲伦理网站| 亚洲精品一区二区三区不| 欧美日韩精品是欧美日韩精品| 日韩视频免费观看| 制服诱惑一区二区| 韩日成人av| 亚洲精品久久久久久久久久久| 欧美日韩视频在线观看一区二区三区| 亚洲午夜久久久久久久久电影网| 午夜免费在线观看精品视频| 午夜精品在线看| 欧美一级在线亚洲天堂| 136国产福利精品导航网址| 欧美激情网站在线观看| 欧美日韩一区在线观看| 欧美专区在线播放| 欧美国产日韩精品免费观看| 亚洲欧美一区二区精品久久久| 欧美在线1区| 一区二区免费在线播放| 欧美在线观看视频在线| 日韩网站在线| 欧美在线观看日本一区| 99日韩精品| 欧美影视一区| 正在播放亚洲| 米奇777在线欧美播放| 欧美一级午夜免费电影| 欧美大秀在线观看| 欧美一区亚洲二区| 欧美国产日韩在线观看| 欧美有码在线视频| 欧美黄色片免费观看| 久久国产欧美精品| 欧美日韩91| 欧美成人一品| 国产亚洲一区二区三区在线播放| 亚洲精品免费电影| 伊人色综合久久天天| 亚洲男人影院| 亚洲在线网站| 欧美日韩免费在线| 亚洲欧洲在线视频| 91久久国产自产拍夜夜嗨| 欧美在线观看www| 欧美在线观看视频在线| 国产精品视频男人的天堂| 夜夜嗨av色综合久久久综合网| 亚洲国产一区二区三区高清| 久久精品人人做人人综合| 亚洲欧美日韩一区在线| 欧美性大战久久久久久久| 亚洲美女中文字幕| 99精品久久免费看蜜臀剧情介绍| 麻豆精品精华液| 亚洲第一区在线| 亚洲精品视频免费| 欧美va亚洲va日韩∨a综合色| 久久婷婷丁香| 亚洲国产高清一区二区三区| 久久久精品一品道一区| 欧美成人一区二免费视频软件| 在线看片一区| 欧美二区在线播放| 亚洲乱码国产乱码精品精98午夜| 亚洲精品欧美一区二区三区| 欧美二区乱c少妇| 亚洲欧洲一区二区天堂久久 | 最新中文字幕一区二区三区| 久久精品国产亚洲5555| 久久亚洲一区| 亚洲卡通欧美制服中文| 欧美日韩一区二区在线观看| 日韩视频在线观看| 裸体女人亚洲精品一区| 欧美www视频| 亚洲国产精品久久久久婷婷884| 蜜桃精品久久久久久久免费影院| 亚洲国产精品黑人久久久| 亚洲美女免费视频| 欧美三级午夜理伦三级中文幕| 亚洲少妇诱惑| 久久久久久久999精品视频| 亚洲国产成人av| 欧美日韩福利在线观看| 亚洲制服丝袜在线| 久久影视三级福利片| 亚洲美女一区| 国产精品亚洲成人| 久久夜色精品国产亚洲aⅴ| 欧美激情一区| 亚洲午夜极品| 伊人成人开心激情综合网| 欧美阿v一级看视频| 亚洲永久在线观看| 亚洲丰满在线| 久久国产精品久久国产精品| 亚洲人成网站精品片在线观看| 欧美性猛交xxxx乱大交退制版 | 国产精品99久久不卡二区 | 一区二区91| 国内一区二区在线视频观看| 欧美大片一区二区三区| 亚洲直播在线一区| 亚洲国产高清视频| 久久精品一区中文字幕| 99综合电影在线视频| 国产精品有限公司| 欧美精品入口| 久久亚洲精品欧美| 亚洲欧美另类国产| 亚洲精品一区在线观看香蕉| 久久久爽爽爽美女图片| 亚洲欧美在线一区| 亚洲美女av网站| 精品51国产黑色丝袜高跟鞋| 欧美吻胸吃奶大尺度电影| 老鸭窝亚洲一区二区三区| 午夜精品福利一区二区三区av| 亚洲精品一区二区三区蜜桃久|