首先要將可能出現的詞進行分類,可以有不同的分類方式。如多符一類:將所有逗號、分號、括號等都歸為一類,或者一符一類,將乙個符號歸為一類。我這裡採用的是一符一類的方式。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語言小子集的源程式,根據給定的詞法規則,識別單詞,填寫相應的表。如果產生詞法錯誤,則顯示錯誤資訊 位置,並試圖從錯誤中恢復。簡單的恢復方法是忽略該字元 或單詞 重新開始掃瞄。相關詞法規則 識別符號 字母 識別符號 識別符號 字母 識別符號 識別符號 數...