编译原理 C++ 词法分析器
2019-05-27 11:36
309 查看
4000
词法分析器
C++
实验一 词法分析器
参考课本 p44-3.2.4,设计词法分析器,识别下列单词符号:
关键字:while if else in标识符
常数:整常数
运算符:+ - * / % = > < <= >= == != && || 界符:( ) ; [ ] { }
单词符号的表示形式: (单词种别,单词符号的属性值)
单词种别使用整数编码,如:
输入:
while (i>=j) i–;
输出单词符号:
< 20, - >
< 81, - >
< 111, i >
< 48, - >
< 111, j >
< 82, - >
< 111, i >
< 57, - >
< 84, - >
!
在这里插入图片描述
样例***********************************
具体代码
按老师要求修改好的,其中“1.txt”需要和Cpp文件在同一路径
// An highlighted block // by xyw #include <bits/stdc++.h> using namespace std; string str; string s; map<string,int> mp; int flag; struct xx { int id; string t; }pos,a,b; int tmp=0; int ttp; int tt=0; void init() { mp["int"] = 5; mp["else"] = 15; mp["if"] = 17; mp["while"] = 20; mp["+"] = 41; mp["-"] = 42; mp["*"] = 43; mp["/"] = 44; mp["%"] = 45; mp["="] = 46; mp[">"] = 47; mp[">="] = 48; mp["<"] = 49; mp["<="] = 50; mp["=="] = 51; mp["!="] = 52; mp["&&"] = 53; mp["||"] = 54; mp["!"] = 55; mp["++"] = 56; mp["--"] = 57; mp["("] = 81; mp[")"] = 82; mp[";"] = 84; mp["{"] = 86; mp["}"] = 87; mp["["] = 88; mp["]"] = 89; return; } bool isInt(string ss) { int sz=ss.size(); for(int i=0;i<sz;i++) { if(!(ss[i]>='0'&&ss[i]<='9')) return false; } return true; } xx output(int i) { //cout<<flag<<' '; ttp=1; flag^=1; if(s[0]==' '||!s.size()) goto xia; if(s[s.size()-1]==';') { string ss=s.substr(0,s.size()-1); string sss;sss+=s[s.size()-1]; if(ss.size()){tt=1,b.id=mp[ss],b.t=ss;} a.id=mp[sss],a.t=sss; goto xia; } if(mp[s]) {a.< 1ddc4 /span>id=mp[s],a.t=s;} else { //cout<<s<<endl; if(isInt(s)) {a.id=100,a.t=s;} else {a.id=111,a.t=s;} } xia:; s=""; if(str[i]==' ') ttp=0; s+=str[i]; return a; } void make() { while(getline(cin,str)) { str+=' '; int sz=str.size(); if(str[0]>='a'&&str[0]<='z') flag=1; else flag=0; s+=str[0]; for(int i=1;i<sz;i++) { if(!(flag^((str[i]>='a'&&str[i]<='z')||(str[i]>='0'&&str[i]<='9')))&&str[i]!=' ') s+=str[i]; else { pos=output(i); if(tt) {tt=0,cout<<"<"<<b.id<<","<<b.t<<">"<<endl;} if(ttp) cout<<"<"<<pos.id<<","<<pos.t<<">"<<endl; } } } return; } int main() { init(); freopen("1.txt","r",stdin); make(); return 0; }
相关文章推荐
- c++ 编译原理 简单词法分析器
- C++实现编译原理的词法分析器
- 编译原理:第七节 及词法分析器的C++和Python实现
- 编译原理(六) LL(1)文法分析法(分析过程的C++实现)
- 编译链接原理&nbsp;&nbsp;&nbsp;C++
- 词法分析器——哈工大编译原理课程(一)
- 【转帖】C++编译原理 资料
- 编译原理(九) LR(0)文法分析法(算法描述和C++代码实现)
- C++中重定义的问题——问题的实质是声明和定义的关系以及分离式编译的原理
- 编译原理(一) Chomsky文法的判断方法及C++代码实现
- 编译原理LR分析法c++实现
- 编译原理(1)词法分析程序(C++实现)
- 编译原理(七) 算符优先分析法(构造算符优先关系表算法及C++实现)
- 编译原理——词法分析器
- [编译原理]词法分析器JLEX使用指南 (Jdk1.5.0 + JLex 1.2.6)
- [编译原理课程设计] 程序示例一、词法分析器
- 浅谈C++编译原理
- 编译原理__词法分析器
- [编译原理]词法分析器JLEX使用指南 (Jdk1.5.0 + JLex 1.2.6)
- 编译原理实验-FLEX+BISON+DEV C++完美解决方案