欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    编译原理 词法分析程序 C++.doc

    • 资源ID:2385460       资源大小:30KB        全文页数:9页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    编译原理 词法分析程序 C++.doc

    编译原理 词法分析程序 C+#include <iostream>#include <fstream>#include <string>using namespace std;/*全局变量*/ifstream infile; /读取目标字符串ofstream outfile; /向文件中输出结果char buf164 ,buf264; /双缓冲char *p2; /指向双缓冲char数组的指针char ci; /用来存储从文件中读取的单个charstring token; /多个ci组成的一个字符串string keyWord="asm","do","if","return","typedef","auto","double","inline","short","typeid","bool","dynamic_cast","int","signed","typename","break","else","long","sizeof","union","case","enum","mutable","static","unsigned","catch","explicit","namespace","static_cast","using","char","export","new","struct","virtual","class","extern","operator","switch","void","const","false","private","template","volatile","const_cast","float","protected","this","wchar_t","continue","for","public","throw","while","default","friend","register","true","delete","goto","reinterpret_cast","try","NULL"/保留字(摘自百度百科)最后一个"NULL是我自己加的"const int KEYWORDLENGTH = 64; /keyWord的长度/*全局变量*/*函数声明*/void start(); /main函数开始时对程序的预处理void get_ci(); /获取字符,使用双缓冲bool isLetter(int); /判断是否是 字母bool isDigit(int); /判断是否是 数字bool isUnderLine(int); /判断是否是 下划线bool isKeyWord(string); /判断是否是 关键字char getType(char); /获取ci的类型 代表void printFile(string ,string);/输出至文件void retractPoint();/p2指针前移撤销一位/*函数声明*/void main()start();/预处理,初始化while (true)/死循环直到主动跳出token=""/每次循环时,清空get_ci();switch(getType(ci) case 'a':/a是字母的代表,当ci是字母是,进入这个casetoken=token+ci;get_ci();while (isLetter(ci)|isDigit(ci)|isUnderLine(ci)token=token+ci;get_ci();/while循环跳出if (isKeyWord(token)printFile(token,"关键字");elseprintFile(token,"标识符");/此时指针指向了下一个retractPoint();/所以指针要回退;break;case '_':token=token+ci;get_ci();while (isLetter(ci)|isDigit(ci)|isUnderLine(ci)token=token+ci;get_ci();/while循环跳出if (isKeyWord(token)printFile(token,"关键字");elseprintFile(token,"标识符");/此时指针指向了下一个retractPoint();/所以指针要回退;break;case '0':while (isDigit(ci)|ci='.')token =token +ci;get_ci();printFile(token,"数值");retractPoint();break;case '<':get_ci();if (ci='=')printFile("<=","运算符");else if (ci='<')printFile("<<","运算符");elseprintFile("<","运算符");retractPoint();break;case'/':get_ci();if (ci='/')do get_ci(); while (ci!='n');elseprintFile("/","运算符");retractPoint();break;case '+':get_ci();if (ci='=')printFile("+=","运算符");else if (ci='+')printFile("+","运算符");elseprintFile("+","运算符");retractPoint();break;case '-':token=token+ci;get_ci();if (ci='=')printFile("-=","运算符");else if (ci='-')printFile("-","运算符");else if (ci>='0' && ci<='9')while (isDigit(ci)|ci='.')token =token +ci;get_ci();printFile(token,"数值");retractPoint();elseprintFile("-","运算符");retractPoint();break;case '*':get_ci();if (ci='=')printFile("*=","运算符");elseprintFile("*","运算符");retractPoint();break;case '=':get_ci();if (ci='=')printFile("=","运算符");elseprintFile("=","运算符");retractPoint();break;case '>':get_ci();if (ci='=')printFile(">=","运算符");else if (ci='>')printFile(">>","运算符");elseprintFile(">","运算符");retractPoint();break;case'(' :printFile ("(","界符"); break;case')' :printFile (")","界符"); break;case'' :printFile ("","界符"); break;case'' :printFile ("","界符"); break;case'' :printFile ("","界符"); break;case'.' :printFile (".","界符"); break;case',' :printFile (",","界符"); break;case'' :printFile ("","界符"); break;case'' :printFile ("","界符"); break;case'#' :printFile ("#","界符");break;case ' ':/空格时,跳出循环case 'n':case 't':break;default:;infile.close();outfile.close();system("pause");/*/* 以下是子函数的定义 */*/void start()/此函数用于初始化cout<<"本程序读取程序所在目录下的ASCII编码文件 in.txt 进行词法分析"<<endl;cout<<"分析结果输出至当前目录下的文件 out.txt"<<endl;token="" /初始化takenp2=buf1; /指针预指向 buf163=-1; /每个缓冲数据结尾为-1buf263=-1;infile.open("in.txt",ios:in);/打开文件if (!infile)cout<<endl<<"错误警告:未在程序当前目录下找到文件 in.txt"<<endl;system("pause");exit(-1);outfile.open("out.txt",ios:out);/输出文件,方式:覆盖for (int i=0;i<63;i+)infile.get(buf1i);void get_ci()if (*p2=-1)/p2指向某一个缓冲buf的结尾处时if (p2=buf1+63)/p2指针的值 = buf1的地址+63 ->说明p2位于第一缓冲区结尾for (int i=0;i<63;i+)/读取文件到buf2buf2i=infile.get();p2=buf2;get_ci();/递归调用自身(只一层而已)else if (p2=buf2+63)/p2指向buf2的结尾时for (int i=0;i<63;i+)/读取文件到buf1buf1i=infile.get();p2=buf1;get_ci();/递归调用自身(只一层而已)else /p2没有指向buf1的结尾,也没有指向buf2的结尾,说明文件读取结束了infile.close();outfile.close();cout<<"分析结束"<<endl;system("pause");exit(-1);elseci= *p2;p2=p2+1;bool isLetter(int c) /判断是否是 字母if (c>='A' && c<='Z')|(c>='a' && c<='z')return true;elsereturn false;bool isDigit(int c) /判断是否是 数字if (c>='0' && c<='9')return true;elsereturn false;bool isUnderLine(int c) /判断是否是 下划线if (c='_')return true;elsereturn false;bool isKeyWord(string s) /判断是否是 关键字for (int i=0;i<KEYWORDLENGTH;i+)if (s = keyWordi)return true;return false;void printFile(string s1,string s2)/输出至文件outfile<<s1<<" "<<s2<<endl;void retractPoint()/p2指针前移撤销一位if (p2=buf1)/若当前指针指向buf1的头p2=buf2+63;/则重置为buf2的末尾-1elseif (p2=buf2)/若当前指向buf2的头p2=buf1+63;elsep2-;char getType(char c) /获取ci的类型 代表if (c>='A' && c<='Z')|(c>='a' && c<='z')return 'a'else if (c>='0' && c<='9')return '0' ;elsereturn c;

    注意事项

    本文(编译原理 词法分析程序 C++.doc)为本站会员(仙人指路1688)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开