词法分析器分析加代码(编译原理)_第1页
词法分析器分析加代码(编译原理)_第2页
词法分析器分析加代码(编译原理)_第3页
词法分析器分析加代码(编译原理)_第4页
词法分析器分析加代码(编译原理)_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、现在在学编译原理,做了个简单的词法分析器。可以自定义关键字、界 符以及运算符。效果如下:请输入要解析的文件名template, txt请输入该编程语言的关键字if while else return请输入该编程语言的运算符,格式为符号名称 符号+ jia - jian * cheng / chu = fuzhi = deng请输入该编程语言的界符,格式为符号名称 符号(left ) right $ comma ; fengao dakuohao xiaokuohao 辽azint$标识符main$标识符($界符left)$界 fright$ 界符 dakuohaoint$柿识符a$棕识符;$

2、界符 f engaoint$袜识符b$棕识符;$ 界符 f engaoint$袜识符c$棕识符;$ 界符 f engaoc$袜识符+$运算待jiac$标识符=$运算符fuzhia$标识符;$ 界符 f engaowhile$关讎字、1($界符leftc$袜识符=$运算符fuzhi=$运負持fuzhi1$整型)$界 fright$ 界符 dakuohaoa$棕识符有一点不满意的地方是必须输入两次ctrl+z,原来打算的是按下回车就结束输入的 还有一点想法是不输入这些设置,而是读取一个配置文件,识别关键字, 界符以及运算符 代码如下:#include<iostream>#include

3、<vector>#inelude <map>#include<iterator>#i nclude<sstream>#includcstring>#includefstream> using namespace std;vector <string> keywords;vector <pair<string, string> > symble;vector <pair<string,string> > bound; char ch;int iskeyword(const st

4、ring& s, int& n)if(keywords empty ()for(vector<string>:iterator it = keywordsbegin();it !二 keywords end() ;it+, n+)if(s = *it)return 1;return t;int issymble(const string& s, string& result)for(vector<pair<string, string> >:i terator i t 二symble. begin ();it !二 symbl

5、e. encl() ;it+)if(s = (*it).first)result 二(*it)second; return 0;int isbound(const string& s, string& result)!for(vector<pair<string, string> >:iterator it 二 bound. begin ();it !二 bound.end();it+)if (s = (*it) first)result = (*it)second;return 1;retum 0;void analyse (file *fp)stri

6、ng temp 二string str 二string result 二 ;int id = 0;while(ch = fgetc(fp) != eof) temp =;str = ch;id 二 0;if (ch 二二,| | ch 二二t,| | ch 二二n ch 二二,r ) while (ch 二二i ch 二二t' | | ch 二二n'| ch 二二')ch = fgetc(fp);;fseek(fp,-ll, seek_cur);else if(isalpha(ch)while(i salpha(ch) | | isdigi t (ch)temp 二 t

7、emp + ch;ch 二 fgetc (fp);fscek(fp,-ll, seek_cur);if(iskeyword(temp, id) = 1)endl;cout << temp << t$关键字,"idelsecout << temp << 七$标识符 « endl:else if(isdigit (ch)while(isdigit (ch)temp = temp + ch;ch = fgetc (fp);fscck(fp,-ll, seek_cur);cout << temp << “t$整

8、型 << endl:else if(issymble (str, result)cout << ch << t$ << 运算符"<< result << endl;/*case '+' :cout « ch << “t$add << endl;break;case: cout « ch « t$subtractendl;break;case:cout « ch << t$divide << endl;break

9、;case:cout « ch << t$assign << endl;break;case,(':cout << ch << t$lpar << endl;break;case:cout << ch << t$rpar << endl;break;case:cout << ch « “t$lsb << endl;break;case:cout << ch << “t$rsb << endl:break;case

10、:cout << ch « t$semicolon << endl;break;case:cout << ch << “t$dot << endl:break;case:cout << ch << t$c0mma << endl;break;case,':cout << ch << t$lbrace << endl; break:case:cout ch << “t$rbrace << endl;break;: cout

11、« ch « t$multiplyendl;break;case:cout << ch « t$unknow << endl;*/defaultelse if(isbound(str, result)cout << ch t$ « 界符 << result « endl;el secout << ch << t$未知 « endl;int mainostring line,symbelline, boundline, word, filename, symblen

12、ame, symbleld, boundn ame, boundld;cout请输入要解析的文件名endl:cin > filename;cout « 请输入该编程语言的关键字 endl;whi le(getline(cin, 1 ine)istringstream stream (line);while(stream >> word)keywords. push back(word);cin. clear();cout « 请输入该编程语言的运算符,格式为符号名称 符号 « endl;while(get1ine(cin, symbelline)

13、istringstream stream(symbelline);while(stream >> symblename >> symbleld)symble push back(pair<string, string> (symblename, s ymbleld);cin. clear ();cout请输入该编程语言的界符,格式为符号名称符号 « endl;while(getline(cin, boundline)istringstream stream (boundline);whilc(stream >> boundxamo >> boundtd)bound, push-back(pair<string, str

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论