MyUtil.java

package Util;

import Value_Final.RRule;

public class MyUtil {
/**
* 判断字符串是否是关键字
* @param key 要判断的字符串
* @return 是否找到
* */
public static boolean isKeyValue(String key){
for(int i=0;i< RRule.KEY_VALUE.length;i++){
if(key.equals(RRule.KEY_VALUE[i])){
return true;
}
}
return false;
}
/**
* 判断字符串是否是双分界符
* @param key 要判断的字符串
* @return 是否找到
* */
public static boolean isDoubleDivider(String key){
for(int i=0;i< RRule.DOUBLE_DIVIDER.length;i++){
if(key.equals(RRule.DOUBLE_DIVIDER[i])){
return true;
}
}
return false;
}
/**
* 判断字符串是否是单分界符
* @param key 要判断的字符串
* @return 是否找到
* */
public static boolean isSignalDivider(String key){
for(int i=0;i< RRule.SIGNAL_DIVIDER.length;i++){
if(key.equals(RRule.SIGNAL_DIVIDER[i])){
return true;
}
}
return false;
}
/**
* 判断字符串是否是字母还是数字
* @param key
* @return 1 是字母 0 是数字 -1 异常
* */
public static int isWordsOrNumber(char key){
int number=(int)key;
if((number>='A'&&number<='Z')||(number>='a'&&number<='z')){
return 1;
}else if(number>='0'&&number<='9'){
return 0;
}else {
return -1;
}
}
/**
* 判断字符串是否是数字
* @param ss
* @return
* */
public static Boolean isNumber(String ss){
for(int i=0;i<ss.length();i++){
if(isWordsOrNumber(ss.charAt(i))!=0){
return false;
}
}
return true;
}
}

RRule.java

package Value_Final;

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

Analysis,java

import Util.MyUtil;

import java.util.Scanner;

public class Analysis {
public static void main(String[] args) {
String inputCode=getInputString();
String spiltItem[]=inputCode.split(" ");
for(String item:spiltItem){
if (MyUtil.isKeyValue(item)){
System.out.println(item);//输出关键字
}else if(MyUtil.isSignalDivider(item)){
System.out.println(item);
}else {//不是关键字则有可能是好几种情况 if(item.contains(";")){//解析a+b=c;
String addstring="";
for(int i=0;i<item.length();i++){
if(MyUtil.isSignalDivider(item.charAt(i)+"")){//如果是单分隔符
System.out.println(item.charAt(i));
addstring="";
continue;
}
addstring=addstring+item.charAt(i);
if(MyUtil.isDoubleDivider(addstring)){//判断是不是双分隔符
System.out.println(item.charAt(i));
addstring="";
continue;
}
if(item.charAt(i+1)==';'){
if(MyUtil.isNumber(addstring)){
System.out.println("数字:"+addstring);
}else {
System.out.println("变量:"+addstring);
} System.out.println(";");
}
}
} }
} } public static String getInputString() {
System.out.println("请输入一段代码,并以最后一行为end结束");
Scanner scanner = new Scanner(System.in);
String firstLine = scanner.nextLine();
StringBuffer ss = new StringBuffer(firstLine+" ");
while (!firstLine.equals("end")) {
firstLine = scanner.nextLine();
ss.append(firstLine+" ");
}
scanner.close();
System.out.println("读取的是"+ss.toString());
return ss.toString().replace("end", ""); }
}

【编译原理】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. 深入解读大厂java面试必考基本功-HashMap集合

    课程简介 HashMap集合在企业开发中是必用的集合同时也是面试官面试率很高的集合,因为HashMap里面涉及了很多的知识点,可以比较全面考察面试者的基本功,想要拿到一个好offer,这是一个迈不过的 ...

  2. Django模型中的admin后台管理无法显示字段

    在执行django后台管理时,登陆到http://127.0.0.1:8000/admin/,进入页面后没有对应的字段显示.请解决? 代码: models.py from django.db impo ...

  3. shell命令之一天一见:grep

    一. 简介 grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来 ...

  4. HTML5与HTML4的区别-----新增的常用标签

    做前端工程师这么长时间了, 对HTML5的一些标签的用法还不是很熟悉.这篇随笔算是对学过的知识的梳理.常言道,温故而知新  ~哈哈.里面有不正确的地方还望各位大牛们指正,评论. 在做网页时习惯把网页分 ...

  5. Go语言实现:【剑指offer】翻转单词顺序列

    该题目来源于牛客网<剑指offer>专题. 例如,"student. a am I",正确的句子应该是"I am a student." Go语言实 ...

  6. 12-MyBatis02

    今日知识 1. 关联查询 2. 延时加载 3. 查询缓存 关联查询 1.一对一 resultType实现 1. 写个定单的扩展类 public class OrdersExt extends Orde ...

  7. sublime笔记

    插件安装和使用 首先,要安装package control,按照官方方法安装: https://packagecontrol.io/installation 重启Sublime Text 3. 如果在 ...

  8. C++ char to string 方法

    1. 使用string()构造函数方法 //method 1: the constructor of string() char c = 'F'; , c); cout << s ; 2. ...

  9. Flume 自定义拦截器 多行读取日志+截断

    前言: Flume百度定义如下: Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统,Flume支持在日志系统中定制各类数据发送方,用于收集数据:同时,F ...

  10. UWP通过机器学习加载ONNX进行表情识别

    首先我们先来说说这个ONNX ONNX是一种针对机器学习所设计的开放式的文件格式,用于存储训练好的模型.它使得不同的人工智能框架(如Pytorch, MXNet)可以采用相同格式存储模型数据并交互. ...