python编译原理_编译原理词法分析_python+java+c专栏 - SegmentFault 思否

学习计算机或者软件工程的人都知道编译原理是一门非常重要的课程,下面是本人学习编译原理过后写的词法分析的源码,喜欢的可以看看,顺便我附上一个下载地址:

####include

#####include

#####include

#####include

#####include

#####include

#####include

using namespace std;

class Content

{

private:

int id;

int forToken;

string content;

char character;

char *token;

char *characterSet;

int c;

string str;

map store;

public:

string getStr();

long getLength();

int getC();

void display();

bool operator==(char rch);

Content(string content);

~Content();

void stringToChar();

char get_Char();

bool getbe();

void concatenation();

bool letter();

bool digit();

int reserve();

void retract();

void buildList();

string error();

string analysis();

};

//bool Content::operator==(char rch){

// char lch;

// if(strcpy(&lch,&rch)==0){

// return 1;

// }

// else

// return 0;

//}

Content::Content(string _content)

{

content=_content;

c=0;

id=0;

character=' ';

forToken=0;

str="";

characterSet=new char[content.length()+1];//最后又'\0'

token=new char[100];

}

Content::~Content()

{

free(characterSet);

free(token);

delete []characterSet;

delete []token;

}

void Content::stringToChar()

{

strcpy(characterSet,content.c_str());

//返回的是const char*,也就是字符数组的首地址

}

/*

www.panmama.com

转载请务必告知

*/

int Content::getC()

{

return c;

}

long Content::getLength()

{

return content.length();

}

char Content::get_Char()

{

character=characterSet[c];

if(!(character==' ')||!(character!='\n')||!(character!='\t'))

{

c++;

}//非空符号,指针向后加1

return character;

}

bool Content::getbe()

{

if(character==' '||character=='\n'||character=='\t')

{

c++;

return 1;

}

return 0;

}

void Content::display()

{

for(int i=0; i

{

cout<

cout<

}

}

void Content::concatenation()

{

token[forToken]=character;

forToken++;

}

string Content::getStr(){

int i=0;

string s="";

while(token[i]!=' ')

{

s+=token[i];

i++;

}

return s;

}

bool Content::digit()

{

if(character>='0'&&character<='9')

return true;

return false;

}

bool Content::letter()

{

if((character>='a'&&character<='z')||(character>='A'&&character<='Z'))

{

return true;

}

return false;

}

int Content::reserve()

{

// int i=0;

// str="";

// while(token[i]!=' ')

// {

// str+=token[i];

// i++;

// }

str=getStr();

if(str=="if")

{

return 4;

}

else if(str=="int")

{

return 1;

}

else if(str=="for")

{

return 6;

}

else if(str=="char")

{

return 3;

}

else if(str=="void")

{

return 12;

}

else if(str=="main")

{

return 2;

}

else if(str=="else")

{

return 5;

}

else if(str=="case")

{

return 9;

}

else if(str=="while")

{

return 7;

}

else if(str=="float")

{

return 11;

}

else if(str=="const")

{

return 12;

}

else if(str=="break")

{

return 13;

}

else if(str=="switch")

{

return 8;

}

else if(str=="return")

{

return 14;

}

else if(str=="switch")

{

return 8;

}

else if(str=="double")

{

return 15;

}

else if(str=="string")

{

return 16;

}

else if(str=="printf")

{

return 17;

}

else

{

return 0;

}

}

void Content::retract()

{

c--;

character=' ';

}

void Content::buildList()

{

//id=18;

store.insert(pair(1,"int"));

store.insert(pair(2,"main"));

store.insert(pair(3,"char"));

store.insert(pair(4,"if"));

store.insert(pair(5,"else"));

store.insert(pair(6,"for"));

store.insert(pair(7,"while"));

store.insert(pair(8,"switch"));

store.insert(pair(9,"case"));

store.insert(pair(11,"float"));

store.insert(pair(12,"const"));

store.insert(pair(13,"break"));

store.insert(pair(14,"return"));

store.insert(pair(15,"double"));

store.insert(pair(16,"string"));

store.insert(pair(17,"printf"));

store.insert(pair(id,str));

// if(id!=20)

// id++;

// else

// id=21;

}

string Content::error()

{

return "有误";

}

string Content::analysis()

{

char s;

string num;

int k;

for(int i=0; i<100; i++)

{

token[i]=' ';

}

s=get_Char();//从数组中取一个字符

if(getbe())//是空格

return "";//是空格返回“”

switch(s)

{

case 'a':

case 'b':

case 'c':

case 'd':

case 'e':

case 'f':

case 'g':

case 'h':

case 'i':

case 'j':

case 'k':

case 'l':

case 'm':

case 'n':

case 'o':

case 'p':

case 'q':

case 'r':

case 's':

case 't':

case 'u':

case 'v':

case 'w':

case 'x':

case 'y':

case 'z':

while(letter()||digit())

{

concatenation();

get_Char();

}

forToken=0;

k=reserve();

if(k==0)

{

buildList();

return "(10,ID)";

}

else

{

buildList();

stringstream ss;

string first;

string second;

ss<

first=ss.str();//以上为将int型转化为string型

map::iterator iter;

for(iter=store.begin(); iter!=store.end(); iter++)

{

if(iter->first==k)

second=iter->second;

}

return "("+first+","+second+")";

}

break;

case '0':

case '1':

case '2':

case '3':

case '4':

case '5':

case '6':

case '7':

case '8':

case '9':

while(digit())

{

concatenation();

get_Char();

}

retract();

//budlist();对其登记

num=getStr();

return "("+num+",NUM)";

break;

case'+':

return "(22,+)";

break;

case'-':

return "(23,-)";

break;

case'*':

return "(24,*)";

break;

case'/':

return "(25,/)";

break;

case'(':

return "(26,()";

break;

case')':

return "(27,))";

break;

case'[':

return "(28,[)";

break;

case']':

return "(29,])";

break;

case'{':

return "(30,{)";

break;

case'}':

return "(31,})";

break;

case'"':

return "(41,\")";

break;

case',':

return "(32,,)";

break;

case':':

return "(33,:)";

break;

case';':

return "(34,;)";

break;

case'<':

get_Char();

if(character=='=')

{

return "(38,<=)";

}

else

{

retract();

return "(36,<)";

}

break;

case'>':

get_Char();

if(character=='=')

{

return "(37,>=)";

}

else

{

retract();

return "(35,>)";

}

break;

case'=':

get_Char();

if(character=='=')

{

return "(39,==)";

}

else

{

retract();

return "(21,=)";

}

break;

case'!':

get_Char();

if(character=='=')

{

return "(40,!=)";

}

else

{

retract();

}

break;

case '\0':

return "1000";

break;

default:

error();

}

}

int main()

{

string temp="int main(){int c=33;if(c=33){printf();}}";

Content b=(temp);

b.stringToChar();

//c.display();

while(b.getC()

string s=b.analysis();

if(s!="")

cout<

}

return 0;

}

本人建个qq群,欢迎大家一起交流技术, 群号:512245829 喜欢微博的朋友关注:转盘娱乐即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值