/*词法分析器
* by qi
* */
import java.sql.SQLOutput;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;public class javasc {public static void main(String[] args) {// TODO Auto-generated method stubanalysis ana=new analysis();ana.str="* * ** * 0 00 DIM IF STOP ENO where while else";ana.anStr();}}
class analysis{public  char ch;//存放最新读入的字符public  String strToken="";//存放字符串public  int op=-1;//搜索指示器public String str;//存放读入的字符public Map<String,Integer> tain=new HashMap<>();//存放保留字public ArrayList<String> charTain=new ArrayList<>();//存放符号表public ArrayList<String> digitTain=new ArrayList<>();//存放常数表public analysis(){loadMap();//加载保留字}public void loadMap(){//存放保留字tain.put("DIM",1);tain.put("IF", 2);tain.put("DO",3);tain.put("STOP",4);tain.put("ENO",5);}public boolean GetChar(){//获得下一个字符到ch中op++;if((op<=str.length()-1)){ch=str.charAt(op);/*  if(ch<=0){return false;}*/return true;}return false;}public boolean GetBC(){//判断ch是否是空格,如果是,则获得下一个if(Character.isSpaceChar(ch)){GetChar();return true;}return false;}public void Concat(){//将ch连接到strToken之后strToken+=ch;}public boolean IsLetter(){//判断是否为字母if(Character.isLetter(ch)){return true;}else{return false;}}public boolean IsDigit(){//判断是否为数字if(Character.isDigit(ch)){return true;}else{return false;}}public int Reserve(){//从保留字表中查找strTokenInteger code=tain.get(strToken);if(code==null){return 0;}return code;}public void Retract(){//将搜索指示器回调一位op--;ch='\000';}public int InsertId(){//将strToken插入到标识符表中charTain.add(strToken);return charTain.indexOf(strToken);}public int InsertConst(){//将strToken插入到常量表中digitTain.add(strToken);return digitTain.indexOf(strToken);}public void an(){//分析主程序int code;int value;GetChar();       //获得一个字符GetBC();           //判断获得的字符是否为空,如果为空重新获得if(IsLetter()){     //判断是否为字母while(IsLetter()||IsDigit()){boolean o=true;Concat();o=GetChar();if(o==false){break;}}Retract();code=Reserve();if (code==0){//如果不是保留字,则将标示符插入到标识符表中,并返回下标value=InsertId();System.out.println("标识符:$ID"+" "+value);}else{System.out.println("保留字:"+strToken+" "+code);}strToken="";//完成一次校验,置空}else if(IsDigit()){while(IsDigit()){Concat();boolean o=GetChar();if(o==false){break;}}Retract();value=InsertConst();//插入到常量表中,返回下标System.out.println("$INT "+strToken+" "+value);}else if(ch=='='){System.out.println("="+"$ASSIGN");}else if(ch=='+'){System.out.println("+"+" "+"$PLUS");}else if(ch=='*'){boolean o=GetChar();if(ch=='*'&&o==true){System.out.println("**"+" "+"$POWER");}else {Retract();System.out.println("*" + " " + "$STAR");}}else if(ch==';'){System.out.println(";"+" "+"$SEMICOLON");}else if(ch=='('){System.out.println("("+" "+"$LPAR");}else if(ch==')'){System.out.println(")"+" "+"$RPAR");}else if(ch=='{'){System.out.println("{"+" "+"$LBRACE");}else if(ch=='}'){System.out.println("}"+" "+"$RBRACE");}else{System.out.println("error");System.out.println(strToken);}strToken="";}public void anStr(){while(op<str.length()-1){an();//System.out.println(op);}}
}

注意: 最后一个”前不能有空格

词法分析器|编译原理|陈火旺相关推荐

  1. 编译原理陈火旺第三版第六章课后题答案

    下面的答案仅供参考! 1.按照表6.1所示的属性文法,构造表达式(4*7+1) *2的附注语法树. 答: 首先考虑最底最左边的内部结点,它对应于产生式F→digit,相应的语义规则为F. val: = ...

  2. 编译原理陈火旺第三版第七章课后题答案

    下面的答案仅供参考! 1. 给出下面表达式的逆波兰表示(后缀式): a*(-b+c)                               not A or not (C or not D) a ...

  3. 编译原理陈火旺版第四章课后题答案

    下面答案仅供参考! 1.考虑下面文法G1: S→a∣∧∣(T) T→T,S∣S (1) 消去 Q 的左递归.然后,对每个非终结符,写岀不带回溯的递归子程序. (2) 经改写后的文法是否是LL(1)的? ...

  4. 编译原理陈火旺版第三章课后题答案

    下面答案仅供参考! 1.编写一个对于 Pascal 源程序的预处理程序.该程序的作用是,每次被调用时都将 下一个完整的语句送进扫描缓冲区,去掉注解行,同时要对源程序列表打印. 答:以下是一个简单的预处 ...

  5. 编译原理陈火旺版第五章课后题答案

    下面答案仅供参考! 1.令文法G为: E→E+T∣T T→T*F∣F F→(E)∣i 证明E+T*F是它的一个句型,指出这个句型的所有短语,直接短语和句柄. 2.考虑下面的表格结构文法G2: S→a∣ ...

  6. 编译原理陈意云3-20 (a) 证明下面文法 S→AaAb|BbBa A→ε B→ε 是LL(1)文法,但不是SLR(1)文法。

    思路:依次判断是否为LL(1)文法和SLR文法即可 证明: (1)首先该文法无左递归存在,没有公共左因子. 其次:对于S→AaAb|BbBa FIRST(AaAb)={a} FIRST(BbBa)={ ...

  7. 《编译原理》课程标准

    XX大学软件学院 <编译原理>课程标准 制定人:张晨光 课程代码: 773033 课程名称(中文 / 英文):编译原理 / Compiler Principle 学时( 实验学时 )/ 学 ...

  8. 《编译原理》实验教学大纲

    <编译原理>实验教学大纲 课程编号: 773033 课程名称:编译原理 英文名称:Compiler Principle 课程类型: 模块课 学 时:5 学 分:4 适用对象: 软件开发各专 ...

  9. 《编译原理》课程教学大纲

    <编译原理>课程教学大纲 课程编号:773033 课程名称(中/英文):编译原理 / Compiler Principle 课程类型: 模块课 总 学 时:5学时/周 讲课学时:4学时/周 ...

  10. 编译原理语义分析_编译原理 第一章 绪论

    编译原理系列,是在学习本校 "编译技术" 这门课程时,所作记录,参考教材为 <编译技术基础教程>清华大学出版社和<程序设计语言编译原理>国防工业出版社(陈火 ...

最新文章

  1. linux设置nexus开机自启动_在linux中使用nexus搭建maven私服
  2. CSS命名规范参考及书写注意事项(下)
  3. ASP.NET 网站路径[转载]
  4. HTTPS_SSL配置的步骤以及原理说明
  5. oracle如何在本地建库,oracle在本地建库
  6. CVPR2021 P2GAN:提高图像风格迁移的鲁棒性
  7. 中国水冷氙气试验箱行业市场供需与战略研究报告
  8. vue-Resource(与后端数据交互)
  9. 最简单的List集合排序方法
  10. 谷粒商城:02. 数据库初始化以及SQL语句
  11. 异速联未获取服务器信息,异速联客户端连接服务器的方法
  12. Spring AOP之动态代理方式
  13. 使用arecord、aplay 实现录音和播放
  14. 【手绘】海贼王女帝汉库克 - 附完整手绘教程
  15. 数字IC设计学习笔记(一)——逻辑综合简介
  16. 《Hexo: 从零开始编写自己的主题》3. 优化样式,设计自己的主题
  17. LINUX Ubuntu 平台上安装PGI的pgf90编译器
  18. 卸载 ibus 使Ubuntu16.04任务栏与桌面图标消失
  19. 利用Python爬虫抓取猫眼电影排行(BeautifulSoup方式初试手,欢迎改进)
  20. centos 7-aarch64如何替换yum源

热门文章

  1. AutoCAD许可、AutoCAD许可分析、分析许可
  2. it营Typescript学习笔记02(基础完结)模块,命名空间,装饰器
  3. vue导出Excel
  4. c语言投票程序设计,《C语言及程序设计》实践参考——投票表决器
  5. 【微课堂】汽车软件工程解决方案(现场实录)
  6. 香港 三星 android6.0,【极光ROM】-【三星NOTE20高通全系列(国行/港版/台版/韩版/美版) N98XX】-【V6.0 Android-R-UC1】...
  7. Chip-seq分析笔记
  8. 项目中常用的各国语言字典表分享
  9. Spring MVC学习总结(21)——i18n国际化资源配置各个国家语言汇总
  10. 基于java的网上书店系统设计(含源文件)