您的位置:首页 > 编程语言 > C语言/C++

编译原理 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: