国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

詞法分析器(c++)

這篇具有很好參考價(jià)值的文章主要介紹了詞法分析器(c++)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前景提示:

個(gè)人覺(jué)得單純是用來(lái)完成實(shí)驗(yàn)報(bào)告的話還行,但僅做參考,因?yàn)楸救说木幊趟接邢?,怕誤人子弟。

本次代碼支持以下操作:

單行注釋

多行注釋

文件形式輸入

種別碼可以在文件中自由修改

單詞字符串識(shí)別支持:

部分關(guān)鍵字(可手動(dòng)在程序外部---reference.txt文件添加,),

標(biāo)識(shí)符,

無(wú)符號(hào)整形數(shù)字(僅可識(shí)別整形,其他類型需要自主添加別的函數(shù)支持),

界符(,{}()[]),

全部運(yùn)算符(+、=、-、*、/、<、>,以及這些的兩兩組合)

代碼程序:

// 編譯原理詞法分析器


#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <map>
using namespace std;


string getFormFile(string filePath);
bool isLetter(char ch);
bool isNumber(char ch);
bool isOperator(char ch);
bool isDelimiter(char ch);
string rmExegesis(const string);
string rmExegesis_1(const string str);
string rmExegesis_2(const string str);


vector<string> compile();
vector<string> compile(const string originpath, const string targetpath);
map<string, string> getMap();
void showTime(map<string, string> refer, vector<string> key);

int main()
{
?? ?map<string, string> refer = getMap();?? ??? ??? ??? ??? ??? ??? ?//從配置文件中拿到鍵值對(duì)

?? ?cout << "請(qǐng)?jiān)谖募?input.txt 中輸入待編譯程序" << endl;
?? ?system("pause");
?? ?vector<string> key = compile();?? ??? ??? ??? ??? ??? ??? ??? ??? ?//拿到待識(shí)別字符
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?
?? ?showTime(refer, key);
?? ?cout << "編譯成功!" << endl;
}


string getFormFile(string filePath)
{

?? ?ifstream ifs;
?? ?ifs.open(filePath);
?? ?if (!ifs.is_open())
?? ??? ?cout << filePath << "打開(kāi)失?。? << endl;

?? ?ifs.seekg(0, ios::end);
?? ?int size = ifs.tellg();?? ??? ??? ??? ?//得到文件大小?? ??? ??? ??? ?
?? ?string str;
?? ?str.resize(size);
?? ?ifs.seekg(0, ios::beg);
?? ?ifs.read((char*)str.c_str(), size);
?? ?ifs.close();?? ??? ??? ??? ??? ??? ?//關(guān)閉了!

?? ?return str;
}

//單詞
bool isLetter(char ch)
{
?? ?if (ch > ('a' - 1) && ch < ('z' + 1))
?? ??? ?return true;
?? ?else if (ch > ('A' - 1) && ch < ('Z' + 1))
?? ??? ?return true;
?? ?else if (ch == '_')
?? ??? ?return true;
?? ?else
?? ??? ?return false;
}

//數(shù)字
bool isNumber(char ch)
{
?? ?if (ch > ('0' - 1) && ch < ('9' + 1))
?? ??? ?return true;
?? ?else
?? ??? ?return false;
}

//算術(shù)運(yùn)算符
bool isOperator(char ch)
{
?? ?if (ch == '=' || ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == ':' || ch == '<' || ch == '>')
?? ??? ?return true;
?? ?else
?? ??? ?return false;
}

//界符
bool isDelimiter(char ch)
{
?? ?if (ch == ';' || ch == ',' || ch == '(' || ch == ')' || ch == '{' || ch == '}' || ch == '[' || ch == ']')
?? ??? ?return true;
?? ?else
?? ??? ?return false;
}


//去單行注釋函數(shù)
string rmExegesis_1(const string str)
{
?? ?string temp = str;
?? ?string result = temp;
?? ?string str1;
?? ?string str2;

?? ?int len = temp.length();
?? ?for (int i = 0; i < len;)
?? ?{
?? ??? ?auto be = temp.find("http://", i);
?? ??? ?auto en = temp.find("\n", be) + 1;

?? ??? ?if (be == string::npos || en == string::npos)
?? ??? ?{
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?str1.assign(temp, 0, be);
?? ??? ?str2.assign(temp, en, len - en);

?? ??? ?result = str1 + str2;
?? ??? ?temp = result;
?? ??? ?len = temp.length();
?? ?}
?? ?return result;
}

//去多行注釋函數(shù)
string rmExegesis_2(const string str)
{
?? ?string temp = str;
?? ?string result = temp;
?? ?string str1;
?? ?string str2;

?? ?int len = temp.length();
?? ?for (int i = 0; i < len;)
?? ?{
?? ??? ?auto be = temp.find("/*", i);
?? ??? ?auto en = temp.find("*/", i) + 2;

?? ??? ?if (en < be)
?? ??? ?{
?? ??? ??? ?i = be;
?? ??? ??? ?en = temp.find("*/", i) + 2;
?? ??? ?}

?? ??? ?if (be == string::npos || en == string::npos)
?? ??? ?{
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?str1.assign(temp, 0, be);
?? ??? ?str2.assign(temp, en, len - en);

?? ??? ?result = str1 + str2;
?? ??? ?temp = result;
?? ??? ?len = temp.length();
?? ?}
?? ?return result;
}

//去單行和多行注釋
string rmExegesis(const string str)
{
?? ?string result = rmExegesis_1(str);
?? ?return rmExegesis_2(result);
}

vector<string> compile()
{
?? ?string origin = "input.txt";
?? ?string target = "output.txt";

?? ?return compile(origin, target);
}

vector<string> compile(const string originpath, const string targetpath)
{
?? ?string str = getFormFile(originpath);
?? ?str = rmExegesis(str);?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//去注釋
?? ?cout << str << endl;?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//輸出去注釋之后的文本

?? ?vector<string> v;?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//存儲(chǔ)字符
?? ?int pos = 0;
?? ?int len = str.find("#~");

?? ?v.push_back("");
?? ?for (int i = 0; i < len; i++)
?? ?{
?? ??? ?if (str[i] == ' ' || str[i] == '\t' || str[i] == '\n')?? ?//空格,tab鍵,換行鍵作為分割符
?? ??? ?{
?? ??? ??? ?if (v[pos] != "")
?? ??? ??? ?{
?? ??? ??? ??? ?v.push_back("");
?? ??? ??? ??? ?pos++;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?else if (isLetter(str[i]))
?? ??? ?{
?? ??? ??? ?v[pos] = v[pos] + str[i];
?? ??? ??? ?if (i + 1 < len && !isLetter(str[i + 1]))
?? ??? ??? ?{
?? ??? ??? ??? ?v[pos] = v[pos] + "$ident";
?? ??? ??? ??? ?v.push_back("");
?? ??? ??? ??? ?pos++;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?else if (isNumber(str[i]))
?? ??? ?{
?? ??? ??? ?v[pos] = v[pos] + str[i];
?? ??? ??? ?if (i + 1 < len && !isNumber(str[i + 1]))
?? ??? ??? ?{
?? ??? ??? ??? ?v[pos] = v[pos] + "$idconst";
?? ??? ??? ??? ?v.push_back("");
?? ??? ??? ??? ?pos++;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?else if (isOperator(str[i]))
?? ??? ?{
?? ??? ??? ?v[pos] = v[pos] + str[i];

?? ??? ??? ?if (i + 1 < len && isOperator(str[i + 1]))
?? ??? ??? ?{
?? ??? ??? ??? ?i = i + 1;
?? ??? ??? ??? ?v[pos] = v[pos] + str[i];

?? ??? ??? ??? ?v.push_back("");
?? ??? ??? ??? ?pos++;
?? ??? ??? ?}
?? ??? ??? ?else
?? ??? ??? ?{
?? ??? ??? ??? ?v.push_back("");
?? ??? ??? ??? ?pos++;
?? ??? ??? ?}

?? ??? ?}
?? ??? ?else if(isDelimiter(str[i]))
?? ??? ?{
?? ??? ??? ?v[pos] = v[pos] + str[i];
?? ??? ??? ?v.push_back("");
?? ??? ??? ?pos++;
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?v[pos] = v[pos] + str[i];
?? ??? ??? ?v.push_back("");
?? ??? ??? ?pos++;
?? ??? ?}
?? ?}
?? ?return v;
}

map<string, string> getMap()
{
?? ?string str = getFormFile("reference.txt");?? ??? ??? ??? ??? ?//讀取匹配文件
?? ?map<string, string> refer;
?? ?pair<string, string> p;

?? ?string bpattern = "<reference>";
?? ?string epattern = "</reference>";
?? ?int ben = str.find(bpattern) + bpattern.size();
?? ?int end = str.find(epattern);

?? ?string key;
?? ?string value;
?? ?int flag1;
?? ?int flag2;
?? ?for (int i = ben; i < end; i++)
?? ?{
?? ??? ?if (str[i] == ' ' || str[i] == '\t' || str[i] == '\n')
?? ??? ??? ?continue;
?? ??? ?flag1 = i;
?? ??? ?flag2 = (str.find(' ', i) < str.find('\t', i) ? str.find(' ', i) : str.find('\t', i));
?? ??? ?key.assign(str, flag1, flag2 - flag1);

?? ??? ?flag1 = str.find('$', flag2) + 1;
?? ??? ?flag2 = str.find('\n', i);
?? ??? ?value.assign(str, flag1, flag2 - flag1);
?? ??? ?p = make_pair(key, value);
?? ??? ?refer.insert(p);
?? ??? ?i = flag2;
?? ?}
?? ?return refer;
}

void showTime(map<string, string> refer, vector<string> key)
{?? ?
?? ?cout << "符號(hào)\t\t\t" << "種別碼\t\t\t" << "說(shuō)明" << endl;
?? ?int len = key.size();
?? ?for (int i = 0; i < len; i++)
?? ?{
?? ??? ?auto pos = key[i].find('$');
?? ??? ?if (pos != string::npos)
?? ??? ?{
?? ??? ??? ?string key1;
?? ??? ??? ?string key2;
?? ??? ??? ?key1.assign(key[i], 0, pos);
?? ??? ??? ?key2.assign(key[i], pos + 1, key[i].length() - pos);

?? ??? ??? ?map<string, string>::iterator iter = refer.find(key1);
?? ??? ??? ?if (iter != refer.end())
?? ??? ??? ?{
?? ??? ??? ??? ?cout << key1 << "\t\t\t" << iter->second << "\t\t\t" << "關(guān)鍵字" << endl;
?? ??? ??? ?}
?? ??? ??? ?else
?? ??? ??? ?{
?? ??? ??? ??? ?cout << key2 << "\t\t\t" << refer[key2] << "\t\t\t" << key1 << endl;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?if (key[i] == "")
?? ??? ??? ??? ?continue;
?? ??? ??? ?cout << key[i] << "\t\t\t" << refer[key[i]] << "\t\t\t" << key[i] << endl;
?? ??? ?}
?? ?}
}

運(yùn)行示例:

文件結(jié)構(gòu):

詞法分析器(c++)

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-445415.html

示例1:

input.txt文件:

begin
?? ?begin
?? ?
?? ??? ?begin?
?? ??? ? a:=1
??? ??? ?end;
??? ??? ?
??? ? ?begin?
?? ??? ? b:=1
? ? end;
? ? q:=10
?? ?end;
?? ?
?? ?x:=9;
?? ?y:=11;
?? ?z:=12
end
#~

reference.txt文件

<reference>
?? ?if?? ??? ?$0
?? ?then?? ?$1
?? ?else?? ?$2
?? ?while?? ?$3
?? ?begin?? ?$4
?? ?do?? ??? ?$5
?? ?end?? ??? ?$6
?? ?a?? ??? ?$7
?? ?:=?? ??? ?$8
?? ?+?? ??? ?$9
?? ?-?? ??? ?$10
?? ?*?? ??? ?$11
?? ?/?? ??? ?$12
?? ?+=?? ??? ?$13
?? ?-=?? ??? ?$14
?? ?*=?? ??? ?$15
?? ?/=?? ??? ?$16
?? ?,?? ??? ?$17
?? ?;?? ??? ?$22
?? ?(?? ??? ?$18
?? ?)?? ??? ?$19
?? ?{?? ??? ?$20
?? ?}?? ??? ?$21
?? ?ident?? ?$100
?? ?idconst?? ?$101
</reference>

?輸出

詞法分析器(c++)

?

示例2:

input.txt文件:

#include <iostream>
using namespace std;

void main()
{
?? ?cout<<"hello world!!!"<<endl;?? ??? ??? ?//單行注釋在這里?。?! ?/*eryedhds
}
#~?? ??? ??? ??? ??? ??? ?//#~為結(jié)束標(biāo)志符


/*
多行注釋在這里!!
asbhfafs
afs
adfsdfcdc

cs
csCSZ
C
ZXC
Scxcds ? ?sfasf saf sd f afd sfd a14 1 411:36 2022/11/711:36 2022/11/7

wr


#~
*/

reference.txt文件

<reference>
?? ?if?? ??? ?$0
?? ?then?? ??? ?$1
?? ?else?? ??? ?$2
?? ?while?? ?$3
?? ?begin?? ?$4
?? ?do?? ??? ?$5
?? ?end?? ??? ?$6
?? ?:=?? ??? ?$8
?? ?+?? ??? ?$9
?? ?-?? ??? ?$10
?? ?*?? ??? ?$11
?? ?/?? ??? ?$12
?? ?+=?? ??? ?$13
?? ?-=?? ??? ?$14
?? ?*=?? ??? ?$15
?? ?/=?? ??? ?$16
?? ?>?? ??? ?$30
?? ?<?? ??? ?$31
?? ?,?? ??? ?$17
?? ?;?? ??? ?$22
?? ?(?? ??? ?$18
?? ?)?? ??? ?$19
?? ?{?? ??? ?$20
?? ?}?? ??? ?$21
?? ?#?? ??? ?$1111
?? ?include?? ?$1112
?? ?iostream?? ?$1113
?? ?using?? ?$1114
?? ?namespace?? ?$1115
?? ?std?? ??? ?$1116
?? ?int?? ??? ?$1117
?? ?main?? ??? ?$1118
?? ?cout?? ??? ?$1119
?? ?endl?? ??? ?$1120
?? ?void?? ??? ?$1121
?? ?"?? ??? ?$1122
?? ?ident?? ?$100
?? ?idconst?? ?$101
?? ?!?? ??? ?$1123
?? ?<<?? ??? ?$1124
?? ?>>?? ??? ?$1125
</reference>

輸出

詞法分析器(c++)
?

?

?

?

到了這里,關(guān)于詞法分析器(c++)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 詞法分析器的設(shè)計(jì)與實(shí)現(xiàn)

    詞法分析器的設(shè)計(jì)與實(shí)現(xiàn)

    1.1、實(shí)驗(yàn)?zāi)康?????????加深對(duì)詞法分析器的工作過(guò)程的理解;加強(qiáng)對(duì)詞法分析方法的掌握;能夠采用一種編程語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的詞法分析程序;能夠使用自己編寫的分析程序?qū)?jiǎn)單的程序段進(jìn)行詞法分析。 1.2、實(shí)驗(yàn)要求 ? ? ? ? 1)對(duì)單詞的構(gòu)詞規(guī)則有明確的定義; ? ? ?

    2024年02月13日
    瀏覽(17)
  • 編譯原理詞法分析器(C/C++)

    編譯原理詞法分析器(C/C++)

    ? ? ? ? 詞法分析器不用多說(shuō),一開(kāi)始我還不知道是什么樣的,看了下別人的博客,再看看書,原來(lái)是輸出二元組,這不就是字符串操作嘛。然后細(xì)看幾篇博客,發(fā)現(xiàn)大都是用暴力判斷來(lái)寫的。我對(duì)代碼重復(fù)性比較高的方法不太感冒,不是說(shuō)我編程有多好,就是單純的不喜歡

    2024年02月06日
    瀏覽(87)
  • HNU-編譯原理-實(shí)驗(yàn)1-利用FLEX構(gòu)造C-Minus-f詞法分析器

    HNU-編譯原理-實(shí)驗(yàn)1-利用FLEX構(gòu)造C-Minus-f詞法分析器

    計(jì)科210X 甘晴void 202108010XXX 詳細(xì)的實(shí)驗(yàn)項(xiàng)目文檔為 https://gitee.com/coderwym/cminus_compiler-2023-fall/tree/master/Documentations/lab1 學(xué)習(xí)和掌握詞法分析程序的邏輯原理與構(gòu)造方法。通過(guò) FLEX 進(jìn)行實(shí)踐, 構(gòu)造 C-Minus-f 詞法分析器。具體完成過(guò)程如下: 學(xué)習(xí) C-Minus-f 的詞法規(guī)則 學(xué)習(xí) FLEX 工具使

    2024年01月20日
    瀏覽(85)
  • 分析器:常見(jiàn)問(wèn)題

    分析器:常見(jiàn)問(wèn)題

    源生成器(增量生成器)由于它特殊的定位,關(guān)于它的調(diào)試十分困難。在這里分享一些調(diào)試它的經(jīng)驗(yàn)。 另外經(jīng)常有寫類庫(kù),然后提供可以生成代碼的Attribute給用戶的需求,此時(shí)需要用到傳遞引用的知識(shí)點(diǎn)。 源生成器項(xiàng)目和普通的項(xiàng)目不同。 普通的會(huì)在你按下運(yùn)行或調(diào)試后才

    2024年02月01日
    瀏覽(15)
  • Elasticsearch 文本分析器(下)

    注意:字符過(guò)濾器用于在將字符流傳遞給分詞器之前對(duì)其進(jìn)行預(yù)處理 此過(guò)濾器會(huì)替換掉HTML標(biāo)簽,且會(huì)轉(zhuǎn)換HTML實(shí)體 如: 會(huì)被替換為 。 解析結(jié)果: 因?yàn)槭?p 標(biāo)簽,所以有前后的換行符。如果使用span標(biāo)簽就不會(huì)有換行符了。 可配參數(shù)說(shuō)明 escaped_tags (可選,字符串?dāng)?shù)組)不包

    2024年02月08日
    瀏覽(47)
  • Elasticsearch 查詢分析器簡(jiǎn)介

    Elasticsearch 是一個(gè)開(kāi)源的分布式搜索和分析引擎,它提供了強(qiáng)大的查詢和分析功能。它基于 Apache Lucene 構(gòu)建,支持大規(guī)模數(shù)據(jù)的實(shí)時(shí)搜索,并具有高可用性和可擴(kuò)展性。 在 Elasticsearch 中,查詢分析器負(fù)責(zé)處理用戶搜索的輸入,將文本進(jìn)行分詞并生成倒排索引。分析器在搜索過(guò)

    2024年02月17日
    瀏覽(23)
  • Elasticsearch:搜索及索引分析器

    在我之前的文章 “Elasticsearch: analyzer”,我詳細(xì)介紹了在 Elasticsearch 中的分析器。分析器在 Elasticsearh 中,它在索引文檔的時(shí)候需要使用,同時(shí),它也在搜索時(shí),也需要針對(duì)搜索的文字進(jìn)行分詞。在今天的文章中,我們來(lái)詳細(xì)介紹分析器是如何在索引及搜索時(shí)使用的。 可以在

    2024年02月05日
    瀏覽(23)
  • ElasticSearch 基礎(chǔ)(七)之分析器

    ElasticSearch 基礎(chǔ)(七)之分析器

    就 ES 基礎(chǔ)部分來(lái)說(shuō)這暫時(shí)就是最后一篇的文章,寫完之后就會(huì)學(xué)習(xí) MQ 了。本篇內(nèi)容簡(jiǎn)單了解 ES 的分析器,最重要的還是根據(jù)自己需求去定制自定義分析器,自定義分析器自行了解,這里只是基礎(chǔ)。其他比較重要的就是中文分詞器了,只需要知道常用的幾種中文分詞器就可以

    2024年02月09日
    瀏覽(21)
  • Android Profiler 內(nèi)存分析器使用

    Android Profiler 內(nèi)存分析器使用

    Android Profiler是Android Studio的一部分,提供了一個(gè)集成的性能分析工具套件,包括內(nèi)存分析。Android Profiler 工具可提供實(shí)時(shí)數(shù)據(jù),幫助您了解應(yīng)用的 CPU、內(nèi)存、網(wǎng)絡(luò)和電池資源使用情況。 在Android Profiler中,您可以查看內(nèi)存使用情況的實(shí)時(shí)圖表、堆轉(zhuǎn)儲(chǔ)快照、分析內(nèi)存泄漏等,

    2024年02月08日
    瀏覽(21)
  • 編譯原理-6-LR語(yǔ)法分析器

    編譯原理-6-LR語(yǔ)法分析器

    自頂向下的、不斷歸約的、基于句柄識(shí)別自動(dòng)機(jī)的、適用于LR(?) 文法的、LR(?) 語(yǔ)法分析器 只考慮無(wú)二義性的文法 自底向上 構(gòu)建語(yǔ)法分析樹(shù) 根節(jié)點(diǎn) 是文法的起始符號(hào) S S S 每個(gè)中間 非終結(jié)符節(jié)點(diǎn) 表示 使用它的某條產(chǎn)生式進(jìn)行歸約 葉節(jié)點(diǎn) 是詞法單元$w$$ 僅包含終結(jié)符號(hào)與

    2024年02月05日
    瀏覽(52)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包