C 的詞法分析器

2021-04-02 15:11:33 字數 2659 閱讀 8625

[lexical_analyzer.h]

#ifndef lexical_analyzer_h

#define lexical_analyzer_h

enum lexical_status

;enum token_category

;struct token

;class lexical_analyzer

;inline lexical_analyzer::lexical_analyzer(std::istream& ifs) 

:m_pstream(&ifs), m_line(1)

inline int lexical_analyzer::current_line() const

inline int lexical_analyzer::peek_char()

inline void lexical_analyzer::skip_char()

#endif//lexical_analyzer_h

[lexical_analyzer.cpp]

#include 

#include "lexical_analyzer.h"

int lexical_analyzer::get_char()

void lexical_analyzer::putback(char ch)

bool lexical_analyzer::filter_space()

while (isspace(ch));

return true;

}return false;

}bool lexical_analyzer::filter_comment()

}else if(ch=='*')

}else

return true;

}else

}bool lexical_analyzer::is_keyword(const std::string& str)

;for(int i=0; i='a' && s[i]<='f')

x += s[i]-'a' + 10;

else if(s[i]>='a' && s[i]<='f')

x += s[i]-'a' + 10;

else

x += s[i]-'0';

}ch = (char)x;}}

result += ch;

}return result;

}std::string lexical_analyzer::get_digital_string()

putback(ch);

return result;

}std::string lexical_analyzer::get_hex_string()

putback(ch);

return result;

}lexical_status lexical_analyzer::get_token(token& t)

while(filter_comment() || filter_space())

if(m_pstream->eof())

return status_eof;

t.value.resize(0);

char ch = get_char();

if(ch=='_' || isalpha(ch) || isdigit(ch) || ch=='$')

while(ch=='_' || isalpha(ch) || isdigit(ch) || ch=='$');

putback(ch);

}else if(isdigit(ch))

else if(isdigit(ch))

}else if(ch=='/"')

else if(ch=='/'')

else 

}else if(ch=='+' || ch=='-')

else if(cc=='=')

else if(ch=='-' && cc=='>')

}else

}else if(ch=='*' || ch=='/' || ch=='%' || ch=='^' || ch=='!')

}else if(ch=='<' || ch=='>')

}else if(cc=='=')

else

}else if(ch=='.')

else if(ch=='.')

else

}else

}else if(ch=='~' || ch =='?' ||

ch=='[' || ch==']' ||

ch=='(' || ch==')'

)else if(ch==';' || ch==''|| ch==','|| ch=='#' )

else if(ch=='//')

else

}else

}if(t.category == token_identifier && is_keyword(t.value))

return status_success;

}[main.c], 測試程式

#include 

#include 

#include 

#include "lexical_analyzer.h"

int main()

return 0;

}

C 詞法分析器

編譯原理實驗 一 實驗題目 設計 編制 除錯乙個識別一簡單語言單詞的詞法分析程式。程式能夠識別基本字 識別符號 無符號整數 浮點數 運算子和界符 單詞符號及種別表如下 單詞符號 種別編碼 begin1if 2then 3while4do 5end 6l l d 10dd 11 13 14 15 16...

詞法分析器

這是我自己的第一篇部落格,就分享一下最近才做完的編譯原理實驗,詞法分析器。本次實驗中我用mysql資料庫儲存自動機狀態表,這樣做的目的只是為了在後續的課設中可以繼續使用現在的 這一段 並不是太完善,發出來只是為了太完善。裡面還有很多問題,比如對字元和字串的識別,不知道為什麼資料庫無法將 和 轉換到我...

詞法分析器

include using namespace std const int maxn 1e3 10 int n 輸入文字的行數 char buffer maxn maxn 緩衝區 int len maxn 輸入文字每行的列數 struct out 輸出格式 out string a,int b re...