【编译原理】TEST递归下降演示
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递归下降演示的更多相关文章
- 编译原理-递归下降分析法 c程序部分的分析
实验三 语法分析程序实验 专业 商软2班 姓名 黄仲浩 学号 201506110166 一. 实验目的 编制一个部分文法分析程序. 二. 实验内容和要求 输入:源程序字符串 输出:正确 ...
- 编译原理 #02# 简易递归下降分析程序(js实现)
// 实验存档 截图: 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...
- 编译原理之LL(1)文法的判断,递归下降分析程序
1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...
- 编译原理:LL(1)文法的判断,递归下降分析程序
1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...
- Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法
Atitit 表达式原理 语法分析 原理与实践 解析java的dsl 递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...
- Stanford公开课《编译原理》学习笔记(2)递归下降法
目录 一. Parse阶段 CFG Recursive Descent(递归下降遍历) 二. 递归下降遍历 2.1 预备知识 2.2 多行语句的处理思路 2.3 简易的文法定义 2.4 文法产生式的代 ...
- 跟vczh看实例学编译原理——三:Tinymoe与无歧义语法分析
文章中引用的代码均来自https://github.com/vczh/tinymoe. 看了前面的三篇文章,大家应该基本对Tinymoe的代码有一个初步的感觉了.在正确分析"print ...
- Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用
catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...
- 【编译原理】语法分析LL(1)分析法的FIRST和FOLLOW集
近来复习编译原理,语法分析中的自上而下LL(1)分析法,需要构造求出一个文法的FIRST和FOLLOW集,然后构造分析表,利用分析表+一个栈来做自上而下的语法分析(递归下降/预测分析),可是这个FIR ...
随机推荐
- ROS机器人之动作(一)
前面我们探讨了ros的两种通信方式,话题和服务,服务机制常用于同步的请求/响应交互方式. 话题则是单工通信,尤其是接收方有多时(比如传感器数据流),然而,当需要完成的任务比较复杂时, 服务和话题都不是 ...
- 拒绝低效!Python教你爬虫公众号文章和链接
本文首发于公众号「Python知识圈」,如需转载,请在公众号联系作者授权. 前言 上一篇文章整理了的公众号所有文章的导航链接,其实如果手动整理起来的话,是一件很费力的事情,因为公众号里添加文章的时候只 ...
- MFC对话框和控件
对话框和控件 对话框是Windows应用程序中一种常用的资源,其主要功能是输出信息和接收用户的输入数据.控件是嵌入在对话框中或其它父窗口中的一个特殊的小窗口,它用于完成不同的输入.输出功能.对话框与控 ...
- CSS颜色表示的几种方式
在CSS中颜色有很多表示方式,今天列出一些常见的颜色表示方式及它们的用法. ①color:blue; 第一种,调用颜色属性,将颜色的英文输入在冒号后,以分号结束. 这种方法直接了当,但是能表示的颜色 ...
- Go语言项目中使用zap日志库(翻译)
本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项目中使用Uber-go的Zap L ...
- Java中的8种基本数据类型
JAVA中的8种基本数据类型:byte short int long float double char boolean 特别说明: 1)char类型占2个字节,可以表示汉字.汉字和英文字符都占2个字 ...
- OOP(面向对象编程)
原文链接:https://blog.csdn.net/qq_38526635/article/details/81319127OOP编程思想OOP核心思想:封装,继承,多态. 理解: 对象是由数据和容 ...
- Imagine— 让图片再小一点点
文章选自我的博客:https://blog.ljyngup.com/archives/267.html/ 再次祭出神奇的Github 这次给大家介绍的是一款神奇的图片压缩软件,以质量的微小损失换取大量 ...
- xdebug插件攻击
title: xdebug插件攻击 date: 2017-09-30 17:08:38 tags: 前一阵突然看到一个有关于xdebug的一个攻击面,不得不说这个想法还是很有意思的.自己搭环境记录一下 ...
- Kali桥接模式下配置ip
以管理员身份运行虚拟机 打开控制面板-->网络和Internet-->更改适配器 再在虚拟机处桥接到这个WLAN2 点击 编辑-->编辑虚拟网卡 没有网卡就点上图的添加网络作为桥接网 ...