C++原始碼單詞掃描程式(詞法分析)
實驗內容及要求:
(1)C++原始碼掃描程式識別C++記號。
C++語言包含了幾種型別的記號:識別符號,關鍵字,數(包括整數、浮點數),字串、註釋、特殊符號(分界符)和運算子號等。
(2)開啟一個C++原始檔,列印出所有以上的記號。
(3)要求應用程式應為Windows介面。
(4)選作部分:為了提高C++源程式的可讀性,C++程式在書寫過程中加入了空行、空格、縮排、註釋等。假設你想犧牲可讀性,以節省磁碟空間,那麼你可以存貯一個刪除了所有不必要空格和註釋的C++源程式的壓縮文字。因此,程式中還應該有這樣的壓縮功能。
(5)選作部分:進一步思考或實現——如何進一步實現減小原始檔大小的壓縮功能。
思路:
(1)由於需要處理特殊字元等,因此只能逐個字元掃描;
(2)觀察上述要求的記號:識別符號、關鍵字、數、特殊符號、運算子號(暫時不考慮註釋和字串,比較特殊後面再進行處理),可以發現這些記號幾乎都被特殊符號分割開來了,如空格符、換行符、製表符、逗號、分號等;
(3)分詞: 也就是說我們再逐個字元掃描的時候,若遇到這些特殊字元,要麼就是某個記號的結束,或者記號本身(分號、逗號也是記號,即特殊符號);而我們掃描過程中,正在處理的字元若不是特殊符號,可以暫存起來,直到遇到結束符,然後把之前快取起來的字元組合成一個詞;
(4)型別判斷:經過一輪掃描之後,我們就會得到一個個劃分號的詞,此時再進行記號型別的判斷就容易多了;
(5)當然,除了註釋和字串需要特殊處理外,還有一些特殊字元不一定只有一個位元組,比如(++,--)這些是兩個字元作為一個整體,若按上面進行分詞,這些記號就會被切分開來,不符合要求;這裡我們也可以把無法判斷是否多個位元組的特殊字元快取起來,等到下一個能確定結束的字元再進行處理;
程式執行效果圖:
相關文章
- C語言編譯器開發之旅(一):詞法分析掃描器C語言編譯詞法分析
- PHP-7.1 原始碼學習:詞法分析PHP原始碼詞法分析
- Shading-jdbc原始碼分析-sql詞法解析JDBC原始碼SQL
- vue之詞法分析Vue詞法分析
- 詞法分析基礎詞法分析
- 詞法分析器詞法分析
- 雷達氣象相關詞彙(一 掃描模式)模式
- 什麼是詞法分析?請描述下js詞法分析的過程?詞法分析JS
- Hanlp分詞之CRF中文詞法分析詳解HanLP分詞CRF詞法分析
- C++ 統計單詞數C++
- Lex詞法分析器詞法分析
- 詞法分析的前奏:字元分析(三)詞法分析字元
- PostgreSQL 原始碼解讀(165)- 查詢#85(基礎知識-詞法分析)SQL原始碼詞法分析
- Java 實現《編譯原理》簡單詞法分析功能Java編譯原理詞法分析
- this詞法
- 文字分析——分配單詞權重
- leetcode 127. 單詞接龍(C++)LeetCodeC++
- 實現指令碼直譯器 - 詞法分析器指令碼詞法分析
- C++謂詞C++
- 英語單詞記憶 詞源法-思維導圖(14)詞源press-51
- Monkey 01 lexer 詞法分析器詞法分析
- Go 語言的詞法分析和語法分析(1)Go詞法分析語法分析
- 單詞
- 劍指offer—58.翻轉單詞順序列—分析及程式碼(Java)Java
- 【Lua篇】靜態程式碼掃描分析(一)初步介紹
- [譯]用javascript實現一門程式語言-詞法分析JavaScript詞法分析
- 使用map:單詞計數程式
- Spring Boot 基於註解驅動原始碼分析--自動掃描Spring Boot原始碼
- Go編譯原理系列3(詞法分析)Go編譯原理詞法分析
- Win10系統下掃描器程式無法掃描的解決方法Win10
- C++記憶體掃描C++記憶體
- 掃描行為分析
- 熱詞分析
- 單詞拆分
- webpack單詞Web
- Go編譯原理系列2(詞法分析&語法分析基礎)Go編譯原理詞法分析語法分析
- 小C語言--詞法分析程式(編譯原理實驗一)C語言詞法分析編譯原理
- 多位數碼管動態掃描原理分析