资源预览内容
第1页 / 共30页
第2页 / 共30页
第3页 / 共30页
第4页 / 共30页
第5页 / 共30页
第6页 / 共30页
第7页 / 共30页
第8页 / 共30页
第9页 / 共30页
第10页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
词法分析设计1. 实验目的通过本实验的编程实践,了解词法分析的任务,掌握词法分析程 序设计的原理和构造方法,对编译的基本概念、原理和方法有完整的 和清楚的理解,并能正确地、熟练地运用。2. 实验内容用C+语言实现对C+语言子集的源程序进行词法分析。通过输入 源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部 编码及单词符号自身值;若遇到错误则显示Error”,然后跳过错误 部分继续显示 ;同时进行标识符登记符号表的管理。3. 实验原理本次实验采用 NFA-DFA-DFA0 的过程:对待分析的简单的词法(关键词/id/num/运算符/空白符等)先 分别建立自己的FA,然后将他们用三产生式连接起来并设置一个唯一 的开始符,终结符不合并。待分析的简单的词法(1)关键字:!F!F !Fj_ !F !F 11 11 !F !F丄!F !F 1!F !F 1!F !Fasm,auto,bool,break,case,catch,char,class,const,const_cast等(2)界符(查表)!F !F !F !F !F / !F !F !F” !F !F C !F !F 1 !F;,(,),3)运算符+=,-=*=,/=,%=, &=,=,!Frelop:reLurnfftljuriil;强恤p-lTiother *H.; H懐Mp 用T*staiifrEiriM rrbujj n LF)(4)其他单词是标识符(ID)和整型常数(SUM),通过正规式定义。id/keywords:digit:(5)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、 运算符、界符和关键字,词法分析阶段通常被忽略。空白、制表符和换行符:4. 相关自动机描述DFA:JC 如 e f 催辭祇 呼心)、*世如片詁呼T) r 旳,Efe 心戶性酸帥1 I却Jti丽 f j疋血叶t叱呻.駅Jirl I 应啊柑)7)呛站i加卩&T 轡脸)*圧如曲/鬥4必)d君妙 *債砒/I?二窗忧亦i甲小 磊够才c-; 出Mt f ufr-t) ft鉀Jeftm 3*) 血如评/ ie*m( of f/=) 注如山和/ ) 城阿r呼”轉 止畑睛10” 巳 氏如l oft JQ 眾議鸡 代触H of j l /论1“打胚丿把如t Cpy A )DFA0:Iffl 皿丘!収,-|、1-|.g5. 核心数据结构描述(1) 生成的token序列由name、type、attr保存。struct tokenstring name;string type;int attr;(2) 本文的大多数数据结构都用map来保存,优点是查找方便,大/保存token序列,大小未知,所以s,int type) s为找到的字符串,type大提高时间复杂度。map Keywords;map Sep;map Relop;map Op;mapid;mapnum;vectorToken;采用vector保存6. 核心算法描述(1)void addToken(string为可能类型。/保存关键字/保存界符/保存比较运算符/保存其他运算符/保存输入字符串中的id/保存数字将分析出来的token()序列添加到Token序列表中。如果是类型为1,查看关键词表,若找到,其类型为关键词并将其以类型为关键 词存储到Token表中;若未找到,则查找id表,若找到,说明该id 已经出现过,否则添加新的id到id表中,将该i字符串以类型为 id添加到Token表中。如果类型为2,在界符表中查找,如果找到以 类型为界符存储到Token表中,同理其他几种类型。可能类型为15, 如果出现其他类型表示是词法分析器中发现额错误,将错误信息记录 下来。void addToken(string s,int type)switch(type)case 1:l_it=Keywords.find(s);if (l_it!=Keywords.end()token t=s,keywords,l_it-second;Token.push_back(t);elsel_it=id.find(s);if (l_it=id.end()ids=idNum;token t=s,id,idNum+;Token.push_back(t);else token t=s,id,l_it-second;Token.push_back(t);break;case 2:l_it=Sep.find(s);if (l_it!=Sep.end()token t=s,separatrix,l_it-second;Token.push_back(t);break;case 3:l_it=Op.find(s);if (l_it!=Op.end()token t=s,op,l_it-second;Token.push_back(t);break;case 4:l_it=Relop.find(s);if (l_it!=Relop.end()token t=s,relop,l_it-second;Token.push_back(t);break;case 5:l_it=num.find(s);if (l_it=num.end()nums=nNum;token t=s,num,nNum+;Token.push_back(t);else token t=s,num,l_it-second;Token.push_back(t);break;default: /errortoken t=s,id,-1;Token.push_back(t);break;(2)void lexical() 词法分析器,按字符读入文法并对其进行处理。 从状态0开始处理,如果是空白符则一直在状态0,如果第一个字符 为字母,继续往后寻找,直至不是字母或是数字结束;若第一个字符 为数字,将其拼凑成一个数字,数字可以有小数点等,详细见状态转 换图,注意以数字开头容易出现一种例如3a类型的错误,所以以数 字开头的一定要往下多找一个,看最后一个数字后面是否为空白符或 界符或者其他允许出现的符号,如果后面紧跟着字母则报错。如上同 理分析运算符等。注意每次处理完遇到一个字符串都要将其送到 addToken()添加到Token表中并回到状态0,继续往下处理。void lexical()fstream ln(E:ln.txt);char ch,tempch;int state=0;丄 ” ”1” ”string s=,key=;while(!ln.eof()switch(state)case 0: ch=ln.get();s=ch;if (ch=13|ch=10|ch=32|ch=9) else if (ch=) state=9;else if (isLetter(ch) state=13;else if (isDigit(ch) state=15; else if(ch=+|ch=-|ch=*|ch=/|ch=& state=20; tempch=ch;else if (ch=八)state=44;else if (isSep(ch)!=-1) state=47;else if (isOp(s)!=-1) state=48;else if (isRelop(s)!=-1) state=49;else state=50;break;case 1: ch=ln.get();if(ch=|ch=) state=2; else if(ch=) state=11;else state=12;break;case 10:s+=ch;addToken(s,4);state=0;break;case 11:s+=ch;addToken(s,3);state=0;break;case 12: /*state=0;ln.seekg(-1,ios:cur);break;case 13: ch=ln.get();if(isDigit(ch)|isLetter(ch) s+=ch;else state=14;break;case 14: /*state=0;addToken(s,1);ln.seekg(-1,ios:cur);break;case 15: ch=ln.get();if (isDigit(ch) s+=ch;else if (ch=.)s+=ch;state=16;else state=18;break;case 16: ch=ln.get();s+=ch;if (isDigit(ch) state=17;else state
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号