【编译原理】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 ...
随机推荐
- Centos 7x 安装 Telegram MTproxy代理【完美可用】
0x00 最近迷上了Telegram,也就是电报,觉得通过这个获取国外的新闻比较方便 可是我的VPS小机子不给力,一开始使用的Centos 6x,死活装不上去, 发现MTproxy不支持Centos ...
- python中的变量和字符串
一.变量 1.python变量 *变量用于存储某个或某些特定的值,它与一个特定标识符相关联,该标识符称为变量名称.变量名指向存储在内存中的值.在创建变量时会在内存中开辟一个空间.基于变量的数据类型,解 ...
- NLP(二十)利用BERT实现文本二分类
在我们进行事件抽取的时候,我们需要触发词来确定是否属于某个特定的事件类型,比如我们以政治上的出访类事件为例,这类事件往往会出现"访问"这个词语,但是仅仅通过"访问&q ...
- Spring注入bean的方式
在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入 这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式). 使用属性的se ...
- POJ_2752_KMP
http://poj.org/problem?id=2752 求字符串的字串,使前缀后缀都为这个字串,按字母数量排序输出数量. 用了KMP的未优化的next数组. #include<iostre ...
- Loj 6002 最小路径覆盖(最大流)
题意: 求不相交的最小路径覆盖 思路: 连边跑二分图,匹配一条边相当于缩了一条边,答案为n-maxflow 如果是求可以相交的最小路径覆盖的话,先用Floyd跑出可达矩阵,然后所有可达的点连边跑二分图 ...
- 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, ...
- HDU 6186 CS Course (连续位运算)
CS Course Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- Jmeter之上传文件
前言 我们可以利用postman工具来测试上传文件的接口,那么假如要利用Jmeter工具来进行上传接口的测试,又该如何测试呢? 上传文件的接口地址:/pinter/file/api/upload:接口 ...
- 一. 数据分片和路由 <<大数据日知录>> 读书笔记
本章主要讲解大数据下如何做数据分片,所谓分片,即将大量数据分散在不同的节点,同时每个存储节点还要做副本备份. 而一般的抽象分片方法是, 先将数据映射到一个分片空间,这是多对一的关系,即一个数据分片区间 ...