1. 程式人生 > >一直學,你始終是學生,但是隻要創造一招,你便是宗師。

一直學,你始終是學生,但是隻要創造一招,你便是宗師。

本文是詞法分析的第一篇文章,主要介紹在詞法分析過程中需要用到的一些基本概念,包括詞法單元、模式和詞素以及三者之間的關係,理解這些內容對學習詞法分析過程十分重要。

詞法分析器的作用

詞法分析是編譯的第一階段。詞法分析器的主要任務是讀入源程式的輸入字元,將它們組成詞素,生成並輸出一個詞法單元序列,這個詞法單元序列被輸出到語法分析器進行語法分析。另外,由於詞法分析器在編譯器中負責讀取源程式,因此除了識別詞素之外,它還會完成一些其他任務,比如過濾掉源程式中的註釋和空白,將編譯器生成的錯誤訊息與源程式的位置關聯起來等。總而言之,詞法分析器的作用如下:
1. 讀入源程式的輸入字元,將它們組成詞素,生成並輸出一個詞法單元序列;
2. 過濾掉源程式中的註釋和空白;
3. 將編譯器生成的錯誤訊息與源程式的位置關聯起來;
4. 其它。

詞法單元、模式和詞素

詞法分析涉及到三個重要的相關術語——詞法單元、模式和詞素:
- 詞法單元由詞法單元名和可選的屬性值組成。詞法單元名是一個詞法單元的引用(別名),它將作為語法分析器處理的輸入符號。當有多個詞素的詞法單元名相同時,可以附加屬性值資訊來區別這些詞素。詞法單元名將影響語法分析過程中的決定,而屬性值將影響語法分析之後對這個詞法單元的翻譯(具體翻譯成哪一個詞素);
- 模式描述一個詞法單元的詞素可能具有的形式;
- 詞素是一個字元序列(串),它和某個詞法單元的模式匹配,並被詞法分析器識別為該詞法單元的一個例項。

為了進一步說明詞法單元、模式和詞素之間的關係,我們舉一個例子:

20171018_img1

PS:由於詞法分析器通常還要和符號表進行互動,因此屬性值常常作為一個指標指向符號表中的某個條目。

詞法單元的規約

我們知道,每個詞法單元都有一個模式來描述它的所有詞素,正則表示式正是這樣一種用來描述詞素模式的重要方法。在真正介紹正則表示式之前,我們還需要了解串和語言以及一些相關的術語和運算,這些內容能幫助我們十分容易地理解正則表示式。

某個符號集合上的一個串是該集合中符號的一個有窮序列。這句話說明了串的兩個特點:第一是組成串的符號都來自某個符號集合,第二是串的長度是可數的。舉個例子:對集合A={a,b,…,z,A,B,…,Z}來說,它的一個串只能包括大小寫字母,並且長度是可數的。

下面定義了一些串相關的術語:

20171018_img2

下面定義了串上的運算:

20171018_img3

語言

語言是某個給定的符號集合上一個任意的可數的串集合。這句話稍微有點抽象,我們把這句話拆分開來解釋:首先,語言是一個集合;其次,這個集合中的元素是串,並且集合的大小是任意的;最後,這些串是依據某個符號集合生成的。

下面定義了語言上的運算:

20171018_img4

正則表示式

正則表示式可以用來描述詞素的模式,一個正則表示式可以由較小的正則表示式遞迴的構建:

20171018_img5

下面我們舉例說明。對於符號集合∑={a,b},有:
- 正則表示式a表示語言{a};
- 正則表示式a|b表示語言{a,b};
- 正則表示式(a|b)(a|b)表示語言{aa,ab,ba,bb};
- 正則表示式a*表示語言{ε,a,aa,aaa,…};
- 正則表示式(a|b)*表示語言{ε,a,b,aa,ab,ba,bb,aaa,…};
- 正則表示式a|a*b表示語言{a,b,ab,aab,aaab,…}。

上面通過基本的並、連線和閉包運算遞迴定義了正則表示式,為了增強正則表示式描述串模式的能力,也出現了許多針對正則表示式的擴充套件,下面是一些比較典型的擴充套件:

20171018_img6

詞法單元的識別

上面介紹瞭如何用正則表示式來表示一個模式,下面我們將介紹如何根據詞法單元的模式來識別一個與該模式匹配的詞素,為此,我們首先將模式轉換成狀態轉換圖。

一個狀態轉換圖由一組表示狀態的結點和表示輸入字元的邊構成,詞法分析器在掃描輸入字串的過程中尋找和某個模式匹配的詞素,狀態轉換圖中的每個狀態代表一個可能在這個過程中出現的情況。一個狀態轉換圖有如下特點:
- 有一個初始狀態,該狀態由一條無出髮結點的、標號為“start”的邊指明。在讀入任何輸入符號之前,狀態轉換圖總位於它的初始狀態;
- 有某些最終狀態,該狀態用雙層的圈表示。這些狀態表明已經找到一個詞素;
- 有某些回退狀態,該狀態附近有一個“*”標明。在識別“3+4”這個串時,只有當掃描到“+”符號時,才能確定前面的數字符號“3”,此時識別出了詞素“3”,並且需要回退一個字元。

下面是詞法單元relop的狀態轉換圖,它表示比較運算子<、>、<=、>=、<>和=:

20171018_img7

根據這個狀態轉換圖,我們可以十分容易的編寫出一段程式碼來識別這些比較運算子,這裡就不再贅述了。

qrcode

歡迎關注微信公眾號fightingZhヾ(๑╹◡╹)ノ”

相關推薦

一直始終學生但是創造便宗師

本文是詞法分析的第一篇文章,主要介紹在詞法分析過程中需要用到的一些基本概念,包括詞法單元、模式和詞素以及三者之間的關係,理解這些內容對學習詞法分析過程十分重要。 詞法分析器的作用 詞法分析是編譯的第一階段。詞法分析器的主要任務是讀入源程式的輸入字元,將它們組

大神教如何使用Shell

shel 14. text 組合 行為 語法 權限 測試 如何 Shell是用來解決用戶如何與操作系統通信的問題。    其實大家都對Shell這個概念有誤解,好像一定要是命令行的Shell才叫Shell。    其實Shell,就是殼。    顧名思義就是機器外面的一層殼

摘下月亮送給TA!信不信我用PPT就能做到

最近抖音有首歌很火,“想摘下星星給你,摘下月亮給你……”,是不是也想摘下超美的月亮送給你的男/女朋友呢?   今天就來教大家畫一個這樣的超美彎彎月亮,不難,用PPT就可以做到哦,快get起來,你也可以摘下月亮送給TA啦!   一、插入圖形,填充線條 具

Excel快速列印底端標題肯定行!

pdf技巧之家 2018-11-10 11:06:00今天跟大家分享一個關於Excel如何快速列印底端標題的技巧,需要的趕緊學起來! 方法步驟: 首先我們在工作表中輸入底部要顯示的標題文字,然後使用截圖工具把這部分文字截圖儲存為圖片,接下來將工作表中的底端標題文字清除掉。 點選工具欄【

Excel快速打印底端標題肯定行!

一個 我們 ffffff 對話 mage 單擊 ima 頁腳 img pdf技巧之家 2018-11-10 11:06:00今天跟大家分享一個關於Excel如何快速打印底端標題的技巧,需要的趕緊學起來! 方法步驟: 首先我們在工作表中輸入底部要顯示的標題文字,然後使用截圖

解決NAS噪音及速度問題!

原文網址:https://www.toutiao.com/a6609514064659874317/   去年的時候,本人終於有了一臺群暉DS418PLAY,體驗了一把NAS的感覺。 說實話,有了NAS後,確實方便了許多,譬如下載完電影,再也不用在各個電腦之間拷來拷去,只需存入

的朋友圈更具13格包教包會

  前言 對於發朋友圈,我想很多人都有一種“執念”,那就是一定要集齊九張圖,沒有九張圖的朋友圈是沒有靈魂的!!! 為了集齊九張圖也是煞費苦心,我會告訴你,用Python輕鬆製作九張圖嘛,而且也特別的好看! 基本環境配置 版本:Python3 系統:Window

車架號都不會看看懂!

相信大家都聽過車架號這個詞,但大多數人只知道這串字母數字很重要,有了它就可以證明車輛的合法性,至於怎麼讀?在哪裡看?其中字母數字又分別代表什麼含義?很多人就不大清楚了,今天我們就帶大家來認識一下這個車架號。 車架號(Vehicle Identification Number

程式設計師教如何設定一個容易記住又安全的密碼

網際網路時代,賬號太多,不同賬號設定同一密碼不安全,密碼多了又記不住?如果你還在被這個問題困擾,不妨來看看程式設計師們如何解決這個問題的。在這裡相信有許多想要學習前端的同學,關注小編文章最後面文字,可免費領取一整套系統的web前端學習教程!一個簡單密碼引發的“慘案”2016年

Python:教將500W+的資料快速寫入redis

最近遇到一個問題:用python寫500W+的資料到redis,時間要花費2小時左右。該如何優化呢? redis介紹 Redis是REmote DIctionary Server的縮寫。對Redis的作用的不同解讀決定了你對Redis的使用方式。如果你認為Redis是一個key

提升Python程式碼的可讀性小技巧

Python的初學者,開發者都應該知道的程式碼可讀性提高技巧,本篇主要介紹瞭如下內容: PEP 8是什麼以及它存在的原因 為什麼你應該編寫符合PEP 8標準的程式碼 如何編寫符合PEP 8的程式碼     為什麼我們需要PEP 8?

win10“未激活”提示太煩人輕松搞定它

tail 自己 ret win 教你 感到 最新 密鑰 window10 win10"未激活”提示是很多同學遇到過的問題,經常出現讓你感到心煩意亂。今天小編就教你解決win10"未激活"的提示並且永久激活自己的windows10系統。出現這種情

寫部落格Typora+PicGo+阿里雲oss,最好用的Markdown+最好用的圖床工具!

### 部落格 > ### 寫部落格的好處 **1.使自己變得更善於觀察**。一旦你養成了記部落格的習慣,與此同時你也賦予了一個更好的機會給自己,讓自己去更細緻地觀察生活。一個人的生活經歷本就是價值連城的,從中學習到的知識,教訓更是異常珍貴。放眼生活中那些正面的、負面的資訊,讓自己靜靜地去思考,

就這成為人生的贏家

技術男 兩性 情感 人生贏家我的朋友範磊,一個高高瘦瘦的技術男,最近總喜歡問我們一個問題,“為什麽我現在還沒有找到合適的對象?”範磊是我認識的人中比較另類的一個——他曾是大學裏吃苦耐勞的典型,畢業後勤奮工作的標桿,畢業後3年就存款30萬,儼然成了我們這群剛畢業學生中的人生贏家。範磊以節儉出名,我聽說他的室友這

AI有能幹到王思聰沒幣可撒

歸納 智能問答 這樣的 想象 結構 nor work 協作 人工智能 曾記得十幾天之前否?那時我們躊躇滿誌的跨進了2018,滿懷著對未來的渴望和珍重……然後我們驚奇的發現,2018第一個火起來的詞叫“撒幣”…不是我說啥,這可真出戲啊。似乎一夜之間,直播答題和這個叫做“撒幣”

CF988 C. Equal Sums【map+pair/hash/任選兩個序列兩個序列都除去他們中的個數使的總和相同】

相同 value can 個數 sca code esp 分析 return 【鏈接】:CF988C 【題意】:在n個序列中任選兩個序列,兩個序列都除去他們中的一個數,使的總和相同 【分析】:map

03人脈搜索:學會這就能輕松找到90%的人的聯系方式

郵件 你在 公開 尊重 直接 新浪 擁有 前綴 問題 人脈搜索:學會這一招,就能輕松找到90%的人的聯系方式 在我們進行人脈搜索之前,我們要做一下相關的準備工作(1)我有哪幾個待解決的問題?(2)能解決的人掌握什麽資源和能力?(3)這樣的人供職於怎樣的機構,有著怎樣

在一個無序整數數組中找出連續增長片段最長的段, 增長步長是1Example: [3,2,4,5,6,1,9], 最長的是[4,5,6]

lse [] 是我 == push color 感覺 bsp emp 在一個無序整數數組中,找出連續增長片段最長的一段, 增長步長是1。Example: [3,2,4,5,6,1,9], 最長的是[4,5,6] 下面是我自己的編寫的代碼,感覺還能再優化。 希望有大神可以分享

根據身份證計算週歲並且按9月之前生的加之後減

package com.yuncai.core.common.utils; import java.text.SimpleDateFormat; import java.util.Calendar; /** * @Author: LIGuanghua * @Description: *

數學問題1 - 兩個圓圈小圓貼著大圓外部轉過問小圓轉幾圈

1個小圓半徑1,1個大圓半徑3,小圓繞著大圓轉1圈,問小圓自轉幾圈 設小圓半徑為r,以大圓圓心為觀察點,小圓的圓心繞過了距離S = (1+3)πr = 4πr, 則自轉圈數Rotation= S/2πr =4 圈 視覺實現: https://www.geogebra.org/m/v