[编译原理学习]词法分析
此前一直沒能系統完整地學過編譯原理,只有很粗淺的理解,雖然其實對工作里的任務也沒啥影響,但總覺得缺了一大塊知識,加上對所謂程序員三大浪漫(編譯器,操作系統,圖形學)的向往,所以最近跟著網易云課堂推出的計算機專業課程來學習編譯原理.無奈生性懶惰,常常下班之后覺得累了,打打游戲啊看看視頻啊,拖延癥就犯了.......所以在這里打算將學習的過程,心得記錄下來,也算是對自己的一個督促.課程傳送門http://mooc.study.163.com/learn/USTC-1000002001#/learn/announce
首先要明確一個概念,語言是設計出來的,不是寫代碼寫出來的,編譯器才是寫出來的.源代碼其實就是一堆字符而已,只不過些字符是按照事先規定好的規則組織起來.
編譯器是一個程序,完成的功能是把源代碼(c/c++,python,java。。。。)轉換為目標代碼.這其中又涉及到很多過程.簡單的講就是下面這個過程
?
?以if(a > 1)為例,詞法分析器的任務就是要將這一句拆分出if,(,a,>,1,)并判斷出他們的類型,比如if是個關鍵字,a是一個變量,名字叫a,>是一個大于號,1是一個整數,值為1等等......?
下面是一個完成下列功能的簡單分析器代碼示例:
分析器的輸入:存儲在文本文件中的字符序列,字符取自ASCII字符集。文件中可能包括四種記號:關鍵字if、符合C語言標準的標識符、空格符、回車符\n。
分析器的輸出:打印出所識別的標識符的種類、及行號、列號信息。
?
1 #ifndef TOKENIZER_H 2 #define TOKENIZER_H 3 4 #include <iostream> 5 #include <string> 6 #include <vector> 7 using namespace std; 8 9 enum symbol 10 { 11 //關鍵字if、符合C語言標準的標識符、空格符、回車符 12 KEYWORD, 13 ID, 14 BLANK, 15 ENTER 16 }; 17 18 struct result 19 { 20 string token; //符號名 21 int type; //符號類型 22 int line; //符號所在行 23 int row; //符號所在列 24 }; 25 26 class Tokenizer 27 { 28 public: 29 Tokenizer(void); 30 ~Tokenizer(void); 31 32 public: 33 // 34 void ReadSourceFile(const string& fileName); 35 // 36 void Parse(); 37 // 38 void HandleToken(const string token,int line,int row); 39 // 40 void ShowResult(); 41 private: 42 char* m_buffer; 43 vector<result> m_resultVec; 44 }; 45 46 #endif #include "Tokenizer.h"#include <fstream>#define BUFFSIZE 1024*1024Tokenizer::Tokenizer(void) {m_buffer = (char*)malloc(BUFFSIZE);memset(m_buffer,0,BUFFSIZE); }Tokenizer::~Tokenizer(void) { } void Tokenizer::ReadSourceFile(const string& fileName) {FILE* fp = fopen(fileName.c_str(),"r");if (fp != NULL){fread(m_buffer,1,BUFFSIZE,fp); fclose(fp);}else{cout<<"打開文件失敗";} }void Tokenizer::Parse() {std::string token;int currentLine = 1;//標記當前行數int pos = 1;//標記token在該行的位置int i = 0;char c = m_buffer[i];while(c != NULL){if (c != ' ' && c != '\n'){token.append(1,c);}if (c == ' '){HandleToken(token,currentLine,pos);token.clear();pos = (i + 1) + 1; //.下一個字符的下標為i+1.代表第(i+1)+1列. }if (c == '\n'){HandleToken(token,currentLine,pos);token.clear();pos = 1;currentLine += 1;}c = m_buffer[++i];}//處理最后一個token HandleToken(token,currentLine,pos);}void Tokenizer::HandleToken(const string token,int line,int row) {if (token == ""){return;}result ret;ret.token = token;ret.line = line;ret.row = row;if (token == "if"){ret.type = KEYWORD;}else if(token == " "){ret.type = BLANK;}else if(token == "\n"){ret.type = ENTER;}else{ret.type = ID;}m_resultVec.push_back(ret); }void Tokenizer::ShowResult() {for (int i = 0;i<m_resultVec.size();i++){switch(m_resultVec[i].type){case KEYWORD:{cout<<m_resultVec[i].token<<" "<<"("<<m_resultVec[i].line<<","<<m_resultVec[i].row<<")"<<endl;break;}case ID:{cout<<"ID("<<m_resultVec[i].token<<")"<<" "<<"("<<m_resultVec[i].line<<","<<m_resultVec[i].row<<")"<<endl;break;}case BLANK:{break;}case ENTER:{break;}}} } 1 #include "Tokenizer.h" 2 3 int main() 4 { 5 Tokenizer tokenizer; 6 tokenizer.ReadSourceFile("./test.txt"); 7 tokenizer.Parse(); 8 tokenizer.ShowResult(); 9 10 system("pause"); 11 12 return 0; 13 }?
轉載于:https://www.cnblogs.com/sdu20112013/p/4164345.html
總結
以上是生活随笔為你收集整理的[编译原理学习]词法分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dell最近的几款显示器看上去还不错的样
- 下一篇: (数论)数的计算