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
- scheme编译器-词法分析-生成记号流
- 编译器-词法分析
- 编译器设计:词法分析
- 编译器之词法分析c
- 手工打造编译器之词法分析1
- 手工打造编译器之词法分析2
- Tiny语言编译器开发之词法分析
- 编译器DIY——词法分析
- C编译器剖析_2.2 词法分析
- MYC编译器源码之词法分析
- 编译器的结构——词法分析
- C++字符集和词法记号
- 自己动手写编译器之TINY编译器词法分析
- LCC编译器的源程序分析(6)词法分析
- LCC编译器的源程序分析(7)词法分析
- [转载]LCC编译器的源程序分析(6)词法分析
- [转载]LCC编译器的源程序分析(7)词法分析
- 词法分析之LED文件批量生成
- Android sdk content loader 0%的解决方案
- 软件测试——功能测试
- NGUI控件说明(中文) UIPanel
- Leetcode6: Palindrome Number
- Android视图状态及重绘流程分析,带你一步步深入了解View(三)
- scheme编译器-词法分析-生成记号流
- struts2配置文件详解
- 局部内部类——内部实现与外在形式一致
- JXL: Java Excel API简易教程
- 利用Recycleview水平平移并自动挪动Item位置(仿Instagram效果)
- 例题7-12 旋转游戏 UVa1343
- Android自定义View的实现方法,带你一步步深入了解View(四)
- 黑马程序员---OC基础知识⑦
- Python爬虫Csdn系列III