日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(3) 用java编译器实现一个简单的编译器-语法分析

發布時間:2024/1/23 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (3) 用java编译器实现一个简单的编译器-语法分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載地址:http://blog.csdn.net/tyler_download/article/details/50708807

視頻地址:http://study.163.com/course/courseLearn.htm?courseId=1002830012#/learn/video?lessonId=1003210315&courseId=1002830012

代碼地址 :?https://pan.baidu.com/s/1sjWiwPn

正文內容

語法和解析樹:

舉個例子看看,語法解析的過程。句子:“我看到劉德華唱歌”。在計算機里,怎么用程序解析它呢。從語法上看,句子的組成是由主語,動詞,和謂語從句組成,主語是“我”,動詞是“看見”, 謂語從句是”劉德華唱歌“。因此一個句子可以分解成 主語 + 動詞 + 謂語從句:


句子-->主語+動詞 + 謂語從句?


主語是名詞,因此有 :


主語->名詞


句子里的名詞有: “我”, “劉德華”,因此有解析規則:

名詞-> "我“ ?| ?"劉德華".

句子里的動詞是“看見”, “唱歌”,由此有解析規則:

動詞-> “看見” | “唱歌”


再看謂語從句,謂語從句由賓語和謂語動詞組成, 賓語是 “劉德華”, 謂語動詞是“唱歌", 謂語從句的解析規則就是:

謂語從句 -> 賓語 + 謂語動詞

謂語動詞是屬于動詞,于是又有:

謂語動詞-> 動詞

動詞->”看見” | "唱歌"


這樣,整個句子的解析規則就有:


1.句子-->主語+動詞 + 謂語從句

2.謂語從句 -> 賓語 + 謂語動詞

3.主語->名詞

4.謂語動詞->動詞

5.動詞-> “看見” | “唱歌”

6.名詞-> "我“ ?| ?"劉德華".


上面這組解析規則就是在計算機中用來解析句子的算法,接下來我們通過一系列替換,從這組規則還原回句子,首先從第一個規則開始,用右邊的式子替換左邊的符號,

1. 句子 通過規則 :句子-->主語+動詞 + 謂語從句 替換得到:

2.?主語+動詞 + 謂語從句, 通過規則?主語->名詞?替換得到:

3. 名詞 + 動詞 + 謂語從句, 通過規則?名詞-> "我“ ?| ?"劉德華"?替換得到

4. 我 + 動詞 + 謂語從句, 通過規則?動詞-> "看見"?替換得到:

5. 我 看見 + 謂語從句, 通過規則?謂語從句 -> 賓語 + 謂語動詞?替換得到:

6. 我 看見 賓語+謂語動詞, 通過規則 賓語->名詞?替換得到:

7. 我 看見 名詞+謂語動詞, 通過規則?名詞-> "我“ ?| ?"劉德華"?替換得到:

8. 我 看見 劉德華 + 謂語動詞, 通過規則 謂語動詞->動詞 替換得到:

9. 我 看見 劉德華 動詞。通過規則 動詞-> “唱歌” 替換得到

10 我 看見 劉德華 唱歌

至此,我們已經沒有可替換的地方,于是語法解析完成。 由此可見,語法解析就是通過設立一組規則,然后判斷輸入的文本是否符合給定規則的過程。我們看到,最底層的一些規則是這樣的:

名詞-> "我“ ?| ?"劉德華",?動詞-> “看見” |“唱歌“

這幾條規則,其實就是以前(http://blog.csdn.net/tyler_download/article/details/50668983)所說的詞法分析,-> 左邊就是標簽,右邊就是詞法分析的字符串。整個解析過程,形成了一種樹狀結構,這個結構就叫語法解析樹:

設想,由文字組成的文本,其形式是無窮的,語法解析的規則是將無窮的文本中,選取出組合形式符合語法規則的文本,例如對于上述語法,句子:“我看見張學友唱歌” 就無法通過語法規則,按照上面的替換過程,我們發現,到第7步時 解析到賓語,賓語替換成名詞后無法將名詞替換成“張學友”, 因此“我看見張學友唱歌”對于上面的語法規則而言,是非法輸入。


當然,語法規則所限定的文本輸入也不是唯一的,句子:“劉德華看見我唱歌” 也符合上面的語法規則,大家可以仿照上面的替換過程驗證一下。

如果想要語法識別“我看見張學友唱歌”, 那么只要將規則改一下:名詞->”我“ | ”劉德華” | “張學友” 即可。


我們看看,將上述替代過程轉成計算機偽碼是怎樣的:

假定“我看見劉德華唱歌” 這歌句子存在緩沖區buffer 里,那么代碼表述如下:

句子(buffer) {

? ?//主語 + 動詞 + 謂語從句 替換 句子

? ? 主語(buffer);

? ? 動詞(buffer);

? ?謂語從句(buffer);

}

主語(buffer) {

//名詞 替換 主語

? ?名詞(buffer);

}


名詞(buffer) {

? // “我” | “劉德華” 替換 名詞

? ? if (buffer[0] == “我”) {

? ? ? ? buffer = buffer.substring(1);

? ? ? ? return;

? }

?if (buffer[0,1,2] == “劉德華”) {

? ? buffer = buffer.substring(3);

? ? return;

?}


throw new Exception (“該語句不符合語法”);

}


動詞(buffer) {

?// “看見” | “唱歌“ 替換 動詞

? if (buffer[0,1]== “看見” || buffer[0,1] == “唱歌") {

? ? buffer = buffer.substring(2);

? ? return;?

? }

?throw new Exception (“該語句不符合語法”);

}


謂語從句(buffer) {

//賓語 謂語動詞 替換 謂語從句

? ? 賓語(buffer);

? ? 謂語動詞(buffer);

}


賓語(buffer) {

? //名詞 替換 賓語

? ? 名詞(buffer);

}


謂語動詞(buffer) {

? //動詞 替換 謂語動詞

? ? 動詞(buffer);

}


在下一篇,我們看看,如何對帶有加好和乘號的算術表達式,如何制定一套語法規則以及相應的語法替換代碼。



總結

以上是生活随笔為你收集整理的(3) 用java编译器实现一个简单的编译器-语法分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。