📄 relationship.java
字号:
package compiler;
import java.util.*;
public class RelationShip {
//得到FIRST集 用哈希表保存关系
public int[][] FirstSet(String left,String[] right,String s){
int[][] first=new int[s.length()][s.length()];
for(int i=0;i<right.length;i++){
int x=s.indexOf(left.charAt(i));
StringTokenizer token=new StringTokenizer(right[i],"|");
if(token.countTokens()==1){
int y=s.indexOf(right[i]);
first[x][y]=1;
}
else{
String[]str=new String[token.countTokens()];
for(int j=0;j<str.length;j++){
while(token.hasMoreTokens()){
str[j]=token.nextToken();
int y=s.indexOf(str[j].charAt(0));
first[x][y]=1;
}
}
}
}
return first;
}
//得到Follow集,用哈希表保存关系
public int[][]FollowSet(String left,String[] right,String s){
int[][] follow=new int[s.length()][s.length()];
for(int i=0;i<right.length;i++){
int x=s.indexOf(left.charAt(i));
StringTokenizer token=new StringTokenizer(right[i],"|");
if(token.countTokens()==1){
int l=right[i].length()-1;
int y=s.indexOf(right[i].charAt(l));
follow[x][y]=1;
}
else{
String[]str=new String[token.countTokens()];
for(int j=0;j<str.length;j++){
while(token.hasMoreTokens()){
str[j]=token.nextToken();
int l=str[j].length()-1;
int y=s.indexOf(str[j].charAt(l));
follow[x][y]=1;
}
}
}
}
return follow;
}
//得到equal集
public int[][] EqualSet(String left,String[] right,String s){
int[][]equal=new int[s.length()][s.length()];
for(int i=0;i<right.length;i++){
StringTokenizer token=new StringTokenizer(right[i],"|");
if(token.countTokens()==1)continue;
else{
String[]str=new String[token.countTokens()];
for(int j=0;j<str.length;j++){
while(token.hasMoreTokens()){
str[j]=token.nextToken();
for(int k=0;k+1<str[j].length();k++){
int x=s.indexOf(str[j].charAt(k));
int y=s.indexOf(str[j].charAt(k+1));
equal[x][y]=1;
}
}
}
}
}
return equal;
}
//FIRST集的传递闭包
public int[][] FirstSet_1(int[][]first){
Warshall war=new Warshall();
int[][] f=war.warshall(first);
return f;
}
//Follow集的传递闭包
public int[][] FollowSet_1(int[][]follow){
Warshall war=new Warshall();
int[][] f=war.warshall(follow);
return f;
}
//FIRST集的自反传递闭包
public int[][] FirstSet_2(int[][]FirstSet_1){
for(int i=0;i<FirstSet_1.length;i++){
if(FirstSet_1[i][i]==0)
FirstSet_1[i][i]=1;
}
return FirstSet_1;
}
//Follow集的传递闭包的转置
public int[][] FollowSet_2(int[][]FollowSet_1){
int[][]followset_2=new int[FollowSet_1.length][FollowSet_1.length];
for(int i=0;i<FollowSet_1.length;i++){
for(int j=0;j<FollowSet_1.length;j++){
followset_2[i][j]=FollowSet_1[j][i];
}
}
return followset_2;
}
//矩阵相乘算法
public int[][]Mul(int[][]m,int[][]n){
int[][]p=new int[m.length][m.length];
int d=0;
for(int i=0;i<m.length;i++){
for(int j=0;j<m.length;j++){
d=0;
for(int k=0;k<m.length;k++)
d+=m[i][k]*n[k][j];
p[i][j]=d;
}
}
return p;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -