scheme编译器-词法分析-生成记号流

来源:互联网 发布:php中的正则表达式 编辑:程序博客网 时间:2024/06/06 01:24

目前做了数字、字符和标识符的DFA

Token的数据结构:

typedef union{char* str;int i;double real;}Attribute;typedef struct{std::string name;Attribute attributes;}Token;
二进制 八进制 十六进制 十进制数 以及字符 的有穷自动机:

bool WordReader::NumberDFA_10(std::istringstream &is,bool acc,int& number){char c;bool accepted=acc;is.get(c);int num=number;while(!is.eof()){switch(c){case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':num=num*10+c-'0';accepted=true;break;default:return false;}is.get(c);}number=num;return accepted;}bool WordReader::NumberDFA_2(std::istringstream &is,int& number){char c;is.get(c);int num=number;while(!is.eof()){switch(c){case '0':case '1':num=num*2+c-'0';break;default:return false;}is.get(c);}number=num;return true;}bool WordReader::NumberDFA_8(std::istringstream &is,int& number){char c;is.get(c);int num=number;while(!is.eof()){switch(c){case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':num=num*8+c-'0';break;default:return false;}is.get(c);}number=num;return true;}bool WordReader::NumberDFA_16(std::istringstream &is,int& number){char c;is.get(c);int num=number;while(!is.eof()){switch(c){case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':num=num*16+c-'0';case 'a':case 'b':case 'c':case 'd':case 'e':case 'f':num=num*16+c+10-'a';break;default:return false;}is.get(c);}number=num;return true;}//2015/4/10bool WordReader::CharDFA(std::istringstream& is, char& c){std::string in;char t;if (is.eof())return false;is >> in;if (in == "space")c = ' ';else if (in == "tab")c = '\t';else if (in == "newline")c = '\n';else{t = *in.begin();c = t;}return true;}//2015/4/11

词法分析,产生记号流:

bool WordReader::WordScan(){int line=1;std::string in;std::istringstream is(str);Token token;is>>in;EOFERROR(C001," ");do{char c;std::istringstream inis(in);if (in == "$nextline$"){line++; goto nextdo;}inis.get(c);switch(c){case '#':inis.get(c);switch(c){case 't':case 'f':token.name="boolean";token.attributes.str = new char[6];strcpy(token.attributes.str,(c=='t')?"true":"false");inis.get(c);if(!inis.eof())ERROR(C002,line);break;case 'd':token.name = "number";token.attributes.i = 0;if(!NumberDFA_10(inis,false,token.attributes.i))ERROR(C003,line);break;case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':token.name = "number";token.attributes.i=c-'0';if(!NumberDFA_10(inis,true,token.attributes.i))ERROR(C003,line);break;case 'b':token.attributes.i = 0;token.name = "number";if(!NumberDFA_2(inis,token.attributes.i))ERROR(C003,line);break;case 'o':token.attributes.i = 0;token.name = "number";if(!NumberDFA_8(inis,token.attributes.i))ERROR(C003,line);break;case 'x':token.attributes.i = 0;token.name = "number";if(!NumberDFA_16(inis,token.attributes.i))ERROR(C003,line);break;case '\\':token.name = "char";char chr;if (!CharDFA(inis, chr))ERROR(C004, line);token.attributes.str = new char[2];token.attributes.str[0] = chr;token.attributes.str[1] = 0;break;}break;case '(':case ')':token.name = "delimiter";token.attributes.str = new char[2];token.attributes.str[0] = c;token.attributes.str[1] = 0;break;default:token.name="identical";strcpy(token.attributes.str, in.data());}TokenStream.push_back(token);nextdo:is >> in;}while(!is.eof());return true;}


TokenStream是一个链表

运行结果:


代码及文章版权归InsZVA所有 转载请注明出处

0 0