MyUtil.java

  1. package Util;
  2.  
  3. import Value_Final.RRule;
  4.  
  5. public class MyUtil {
  6. /**
  7. * 判断字符串是否是关键字
  8. * @param key 要判断的字符串
  9. * @return 是否找到
  10. * */
  11. public static boolean isKeyValue(String key){
  12. for(int i=0;i< RRule.KEY_VALUE.length;i++){
  13. if(key.equals(RRule.KEY_VALUE[i])){
  14. return true;
  15. }
  16. }
  17. return false;
  18. }
  19. /**
  20. * 判断字符串是否是双分界符
  21. * @param key 要判断的字符串
  22. * @return 是否找到
  23. * */
  24. public static boolean isDoubleDivider(String key){
  25. for(int i=0;i< RRule.DOUBLE_DIVIDER.length;i++){
  26. if(key.equals(RRule.DOUBLE_DIVIDER[i])){
  27. return true;
  28. }
  29. }
  30. return false;
  31. }
  32. /**
  33. * 判断字符串是否是单分界符
  34. * @param key 要判断的字符串
  35. * @return 是否找到
  36. * */
  37. public static boolean isSignalDivider(String key){
  38. for(int i=0;i< RRule.SIGNAL_DIVIDER.length;i++){
  39. if(key.equals(RRule.SIGNAL_DIVIDER[i])){
  40. return true;
  41. }
  42. }
  43. return false;
  44. }
  45. /**
  46. * 判断字符串是否是字母还是数字
  47. * @param key
  48. * @return 1 是字母 0 是数字 -1 异常
  49. * */
  50. public static int isWordsOrNumber(char key){
  51. int number=(int)key;
  52. if((number>='A'&&number<='Z')||(number>='a'&&number<='z')){
  53. return 1;
  54. }else if(number>='0'&&number<='9'){
  55. return 0;
  56. }else {
  57. return -1;
  58. }
  59. }
  60. /**
  61. * 判断字符串是否是数字
  62. * @param ss
  63. * @return
  64. * */
  65. public static Boolean isNumber(String ss){
  66. for(int i=0;i<ss.length();i++){
  67. if(isWordsOrNumber(ss.charAt(i))!=0){
  68. return false;
  69. }
  70. }
  71. return true;
  72. }
  73. }

RRule.java

  1. package Value_Final;
  2.  
  3. /**
  4. * 一些常用变量规则
  5. * */
  6. public class RRule {
  7. //关键字 规则
  8. public static final String[] KEY_VALUE={"abstract","assert","boolean","break","byte","case","catch","char",
  9. "class","const","continue","default","do","double","else","enum","extends","final","finally",
  10. "float","for","goto","if","implements","import","instanceof","int","interface","long","native",
  11. "long","native","new","package","private","protected","public","return","short","static","super",
  12. "switch","this","throw","throws","try","void","while"};
  13.  
  14. public static final String[] SIGNAL_DIVIDER={"=","+","-","*","(",")","{","}",";",":",","};
  15. public static final String[] DOUBLE_DIVIDER={"==",">=","<=","!="};
  16.  
  17. }

Analysis,java

  1. import Util.MyUtil;
  2.  
  3. import java.util.Scanner;
  4.  
  5. public class Analysis {
  6. public static void main(String[] args) {
  7. String inputCode=getInputString();
  8. String spiltItem[]=inputCode.split(" ");
  9. for(String item:spiltItem){
  10. if (MyUtil.isKeyValue(item)){
  11. System.out.println(item);//输出关键字
  12. }else if(MyUtil.isSignalDivider(item)){
  13. System.out.println(item);
  14. }else {//不是关键字则有可能是好几种情况
  15.  
  16. if(item.contains(";")){//解析a+b=c;
  17. String addstring="";
  18. for(int i=0;i<item.length();i++){
  19. if(MyUtil.isSignalDivider(item.charAt(i)+"")){//如果是单分隔符
  20. System.out.println(item.charAt(i));
  21. addstring="";
  22. continue;
  23. }
  24. addstring=addstring+item.charAt(i);
  25. if(MyUtil.isDoubleDivider(addstring)){//判断是不是双分隔符
  26. System.out.println(item.charAt(i));
  27. addstring="";
  28. continue;
  29. }
  30. if(item.charAt(i+1)==';'){
  31. if(MyUtil.isNumber(addstring)){
  32. System.out.println("数字:"+addstring);
  33. }else {
  34. System.out.println("变量:"+addstring);
  35. }
  36.  
  37. System.out.println(";");
  38. }
  39. }
  40. }
  41.  
  42. }
  43. }
  44.  
  45. }
  46.  
  47. public static String getInputString() {
  48. System.out.println("请输入一段代码,并以最后一行为end结束");
  49. Scanner scanner = new Scanner(System.in);
  50. String firstLine = scanner.nextLine();
  51. StringBuffer ss = new StringBuffer(firstLine+" ");
  52. while (!firstLine.equals("end")) {
  53. firstLine = scanner.nextLine();
  54. ss.append(firstLine+" ");
  55. }
  56. scanner.close();
  57. System.out.println("读取的是"+ss.toString());
  58. return ss.toString().replace("end", "");
  59.  
  60. }
  61. }

【编译原理】TEST递归下降演示的更多相关文章

  1. 编译原理-递归下降分析法 c程序部分的分析

    实验三 语法分析程序实验 专业 商软2班   姓名 黄仲浩  学号 201506110166 一. 实验目的      编制一个部分文法分析程序. 二. 实验内容和要求 输入:源程序字符串 输出:正确 ...

  2. 编译原理 #02# 简易递归下降分析程序(js实现)

    // 实验存档 截图: 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...

  3. 编译原理之LL(1)文法的判断,递归下降分析程序

    1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...

  4. 编译原理:LL(1)文法的判断,递归下降分析程序

    1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...

  5. Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法

    Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...

  6. Stanford公开课《编译原理》学习笔记(2)递归下降法

    目录 一. Parse阶段 CFG Recursive Descent(递归下降遍历) 二. 递归下降遍历 2.1 预备知识 2.2 多行语句的处理思路 2.3 简易的文法定义 2.4 文法产生式的代 ...

  7. 跟vczh看实例学编译原理——三:Tinymoe与无歧义语法分析

    文章中引用的代码均来自https://github.com/vczh/tinymoe.   看了前面的三篇文章,大家应该基本对Tinymoe的代码有一个初步的感觉了.在正确分析"print ...

  8. Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用

    catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...

  9. 【编译原理】语法分析LL(1)分析法的FIRST和FOLLOW集

    近来复习编译原理,语法分析中的自上而下LL(1)分析法,需要构造求出一个文法的FIRST和FOLLOW集,然后构造分析表,利用分析表+一个栈来做自上而下的语法分析(递归下降/预测分析),可是这个FIR ...

随机推荐

  1. Centos 7x 安装 Telegram MTproxy代理【完美可用】

    0x00 最近迷上了Telegram,也就是电报,觉得通过这个获取国外的新闻比较方便 可是我的VPS小机子不给力,一开始使用的Centos 6x,死活装不上去, 发现MTproxy不支持Centos ...

  2. python中的变量和字符串

    一.变量 1.python变量 *变量用于存储某个或某些特定的值,它与一个特定标识符相关联,该标识符称为变量名称.变量名指向存储在内存中的值.在创建变量时会在内存中开辟一个空间.基于变量的数据类型,解 ...

  3. NLP(二十)利用BERT实现文本二分类

      在我们进行事件抽取的时候,我们需要触发词来确定是否属于某个特定的事件类型,比如我们以政治上的出访类事件为例,这类事件往往会出现"访问"这个词语,但是仅仅通过"访问&q ...

  4. Spring注入bean的方式

    在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式).   使用属性的se ...

  5. POJ_2752_KMP

    http://poj.org/problem?id=2752 求字符串的字串,使前缀后缀都为这个字串,按字母数量排序输出数量. 用了KMP的未优化的next数组. #include<iostre ...

  6. Loj 6002 最小路径覆盖(最大流)

    题意: 求不相交的最小路径覆盖 思路: 连边跑二分图,匹配一条边相当于缩了一条边,答案为n-maxflow 如果是求可以相交的最小路径覆盖的话,先用Floyd跑出可达矩阵,然后所有可达的点连边跑二分图 ...

  7. Codeforces 977D Divide by three, multiply by two(拓扑排序)

      Polycarp likes to play with numbers. He takes some integer number xx, writes it down on the board, ...

  8. HDU 6186 CS Course (连续位运算)

    CS Course Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  9. Jmeter之上传文件

    前言 我们可以利用postman工具来测试上传文件的接口,那么假如要利用Jmeter工具来进行上传接口的测试,又该如何测试呢? 上传文件的接口地址:/pinter/file/api/upload:接口 ...

  10. 一. 数据分片和路由 <<大数据日知录>> 读书笔记

    本章主要讲解大数据下如何做数据分片,所谓分片,即将大量数据分散在不同的节点,同时每个存储节点还要做副本备份. 而一般的抽象分片方法是, 先将数据映射到一个分片空间,这是多对一的关系,即一个数据分片区间 ...