簡單的C語言編譯器 詞法分析器

2022-08-01 10:36:12 字數 1847 閱讀 9041

首先要將可能出現的詞進行分類,可以有不同的分類方式。如多符一類:將所有逗號、分號、括號等都歸為一類,或者一符一類,將乙個符號歸為一類。我這裡採用的是一符一類的方式。c**如下:

#ifndef tag_h

#define tag_h

namespace tag

#endif

設計乙個詞法分析器,當然要包括如何儲存乙個詞法單元,如何掃瞄(scan)測試**等,直接上**:

mylexer.h

#ifndef mylexer_h

#define mylexer_h

#include #include #include #include "tag.h"

/** 主要是定義基本的詞法單元類,

* 宣告了詞法分析類

*///儲存詞法單元

class word ;

std::string getlexeme() ;

int gettag()

void settag(int t)

void setlexeme(std::string s)

private:

std::string lexeme;

int tag;

};//詞法分析器類

class lexer

private:

char peek;

std::unordered_mapwords;

int line;

};#endif

mylexer.cpp

#include #include #include #include "mylexer.h"

void lexer::reserve(word w) );

}lexer::lexer()

//方便處理像》=,++等這些兩個字元連在一起的運算子

bool lexer::readnext(char c, std::ifstream &in)

word lexer::scan(std::ifstream &in)

else if(peek == '\n')

++line;

else

break;

in >> peek;

}//處理分界符、運算子等

switch(peek) ':

in >> peek;

return word("}", tag::rgbracket);

}//處理常數

if(isdigit(peek)) while(isdigit(peek));

if(peek != '.')

return word(std::to_string(v), tag::num);

} //處理識別符號

if(isalpha(peek)) while(isalnum(peek) || peek == '_');

std::string tmp = b.str();

//判斷是否為保留字

if(words.find(tmp) != words.end())

return words[tmp];

else

return word(tmp, tag::id);

}if(peek != ' ' && peek != '\t' && peek != '\n')

return word("error", tag::error);

return word("empty", tag::empty);

}

設計完成後,自己寫乙個main函式,在while迴圈中呼叫scan函式,每次列印出word內容,就能夠得到

詞法分析器 C語言

include include include include include int i,row 0,line 0 char test 1000 test檔案中的字元 int number 100 常數表 char mark 100 5 識別符號表 詞法分析 int wordanalysis in...

C語言簡單詞法分析器

詞法分析器 c語言 輸入源程式 輸出單詞符號 1 預處理程式 2 掃瞄器 單詞識別程式 include include include define keyword num 32 int pos pos搜尋指標 char ch ch最新讀入的字元 char buf 1000000 buf緩衝區 ch...

詞法分析器(分析C語言)

用c或c 語言編寫乙個簡單的詞法分析程式,掃瞄c語言小子集的源程式,根據給定的詞法規則,識別單詞,填寫相應的表。如果產生詞法錯誤,則顯示錯誤資訊 位置,並試圖從錯誤中恢復。簡單的恢復方法是忽略該字元 或單詞 重新開始掃瞄。相關詞法規則 識別符號 字母 識別符號 識別符號 字母 識別符號 識別符號 數...