若已知运算符之间的优先关系,可按如下步骤构造优先函数:

1、对每个运算符a(包括#在内)令f(a)=g(a)=1

2、如果a⋗b且f(a)<=g(b)令f(a)=g(b)+1

3、如果a⋖b且f(a)>=g(b)令g(b)= f(a)+1

4、如果a≐b而f(a) ≠g(b),令min{f(a),g(b)}=max{f(a),g(b)}

5、重复2~4,直到过程收敛。如果重复过程中有一个值大于2n,则表明不存在算符优先函数。

import java.util.Scanner;/*** Created by redli on 2017/5/2.** 样例输入1* --------------------------------------------------请输入终结符(输入#号结束):+*()i#请输入关系矩阵(#号结束):><<><>><><<<<+<>>!>!>>!>!#-----------------------------------------------------* 样例输入2* --------------------------------------------------请输入终结符(输入#号结束):abcd#请输入关系矩阵(#号结束):!!>>!!>!<=<!=!=!#-----------------------------------------------------*/
public class Floyd {public static Scanner in = new Scanner(System.in);public static StringBuffer terminal = new StringBuffer();public static StringBuffer matrix = new StringBuffer();public  static void main(String args[]){//输入Input input = new Input();input.inputTerminal();input.inputMatrix();//优先函数PriorityFunction priority_function = new PriorityFunction();priority_function.makePriorityFunction();priority_function.createPriorityFunction();priority_function.outPriorityFunction();}private static class Input{//输入终结符public void inputTerminal(){System.out.println("请输入终结符(输入#号结束):");String str = in.next();while(!str.equals("#")){if(str.substring(str.length()-1).equals("#")){terminal.append(str.substring(0,str.length()-1));str = "#";} else{terminal.append(str);str = in.next();}}}/** 输入关系矩阵* 输入>,<,=,!(表示为空)* */public void inputMatrix(){System.out.println("请输入关系矩阵(#号结束):");String str = in.next();while(!(str.equals("#"))){if(!(str.substring(str.length()-1).equals("#"))){matrix.append(str);str = in.next();} else{matrix.append(str.substring(0,str.length()-1));str = "#";}}}}/** 优先函数处理类* */private static class PriorityFunction{int num = terminal.length();int [][] arr = new int[2][num];/** 构造优先函数,赋初值1* */public void makePriorityFunction(){for(int i=0; i<2; i++){for(int j=0;j<num;j++){arr[i][j] = 1;}}}/*** 生成优先函数**  */public void createPriorityFunction(){int k=1;int terLength = terminal.length();while(k!=0){k = 0;for(int i=0; i<terminal.length();i++){for(int j=0; j<terminal.length(); j++){if(Character.toString(matrix.charAt(i*terLength+j)).equals(">") && arr[0][i]<=arr[1][j]){arr[0][i]=arr[1][j]+1;k=1;} else if(Character.toString(matrix.charAt(i*terLength+j)).equals("<") && arr[0][i]>=arr[1][j]){arr[1][j]=arr[0][i]+1;k=1;}}}}}/** 输出优先函数* */public void outPriorityFunction(){for(int k=0; k<terminal.length(); k++){System.out.print(terminal.charAt(k)+" ");}System.out.println();for(int i=0; i<2; i++){for(int j=0; j<terminal.length();j++){System.out.print(arr[i][j]+" ");}System.out.print("\n");}}}
}

根据优先关系矩阵使用逐次加一法构造优先函数(Java)相关推荐

  1. 算符优先分析法代码 java_编译原理——算符优先分析文法(附源代码)

    1 源代码2 模块一:3 /****************#include"firstVT_lastVT.h"************************/ 4 5 //程序 ...

  2. 离散数学【关系】习题解析 序偶,直积,关系图,关系矩阵,哈斯图

    下面是习题与解析 文章目录 第一题 序偶与类型 第二题 关系图,矩阵与类型 第三题关系图,矩阵与类型 第四题 复合关系 第五题 求t( R) 第六题 求表达式 第七题 求关系图等价类 第八题 写出序偶 ...

  3. tomcat的class加载的优先顺序

    来源:https://bbs.csdn.net/topics/80459833 Tomcat的class加载的优先顺序一览 最先是$JAVA_HOME/jre/lib/ext/下的jar文件. 环境变 ...

  4. 总结Vue中index.html、main.js、App.vue、index.js之间关系以及Vue项目加载流程

    总结Vue中index.html.main.js.App.vue.index.js之间关系以及Vue项目加载流程 文章目录 总结Vue中index.html.main.js.App.vue.index ...

  5. 【20200422】编译原理课程课业打卡十七之求解文法FirstVTLastVT构造文法算符优先关系表

    [20200422]编译原理课程课业打卡十七之求解文法FirstVT&LastVT&构造文法算符优先关系表 一.课业打卡十七之求解文法FirstVT&LastVT&构造 ...

  6. 算符优先系列之(二)算符优先关系表

    算符优先系列之(二)算符优先关系表 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 学 ...

  7. 编译原理基本定义(文法、算符文法、算符优先文法、算符优先关系表、算符优先分析过程)

    文法 文法和语言分为4类. 0型文法:最大类,包含1.2.3型文法. 1型文法:对0型文法来说,所有的产生式的右边的字符长度都要大于左边的字符长度. 2型文法:所有的产生式左边都只有一个字符. 3型文 ...

  8. 用C++来实现关系矩阵的性质(自反性、反自反性、对称性、反对称性、)的判断

    实验题目:编程实现关系性质的判断 1.自反性:主对角线元素全为1 2.反自反性:主对角线元素全为0 3.对称性:矩阵为对称矩阵 4.反对称性:如果a[i][j] = 1,且i != j,则a[j][i ...

  9. 画图分析Dual Attention(CAM、PAM)、non-local、CCNet、Relation-Aware Global Attention关系矩阵的具体含义--附代码)

    初衷:在读代码时,只知道要对于non-local,PAM,CAM要 求出相应的关系矩阵,但这个关系矩阵是怎么求的,以及为什么要这样做就有效果,一直是云里雾里,所以本篇根据tensor数据流,将重点te ...

最新文章

  1. 太赞了!华为工程师总结的Linux笔记,提供下载
  2. system()函数实现
  3. mysql Got error 28 from storage engine
  4. 翻译器DIY它———算在英文文本中的单词数,字符和行数
  5. 构建可读性更高的 ASP.NET Core 路由
  6. list筛选数据_Power Query如何对于各类混合格式的数据展开?
  7. 六十、走进位运算的大门
  8. Mybatis分页插件PageHelper简单使用
  9. JFree chart
  10. Oracle 创建主键自增表
  11. 使用.NET Core创建Windows服务 - 使用.NET Core工作器方式
  12. SpringBoot-(1)-IDEA创建SpringBoot项目并运行访问接口
  13. Windows手机开发工具与资源
  14. Android开发笔记(一百三十五)应用栏布局AppBarLayout
  15. matlab用dft对连续信号做谱分析,用 DFT 对连续信号进行谱分析的误差问题有哪些?...
  16. (十二) 简单使用 Dockerfile 保留字指令,尝试自定义centos镜像
  17. 最新一百期的结果与统计php
  18. 关于安装office软件时和visio软件冲突
  19. 数据分析第二章课后习题解答
  20. 吴伯凡-认知方法论-真真切切的感觉

热门文章

  1. JS jQuery显示隐藏div的几种方法
  2. linux suspend和关机,suspend
  3. 显示器什么牌子好性价比高(显示器哪个品牌性价比高点)
  4. 基于C语言实现(WinForm)FIFA球队管理系统【100010337】
  5. WebGPT: Browser-assisted question-answering with human feedback
  6. python中矩阵.A是什么意思?
  7. 青岛新生儿手续办理事项
  8. 【项目实战】 图书信息管理系统(Maven,mybatis)(第一个自己独立完成的项目)
  9. etag java_浅谈ETag
  10. SpringScurity+JWT实战讲解三(用户权限问题)