集合 lastvt(p)构造算法的程序实现 java
时间: 2024-01-03 22:01:23 浏览: 73
下面是一个java实现的"lastvt(p)"集合构造算法的程序代码:
```java
import java.util.HashSet;
import java.util.Set;
public class LastVTPAlgorithm {
public static Set<Character> lastvt(String p) {
Set<Character> vt = new HashSet<>(); // 存储终结符的集合
Set<Character> nonTerminals = new HashSet<>(); // 存储非终结符的集合
// 遍历产生式,将产生式中的终结符放入终结符集合,非终结符放入非终结符集合
for (int i = 0; i < p.length(); i++) {
char c = p.charAt(i);
if (Character.isUpperCase(c)) {
nonTerminals.add(c);
} else {
vt.add(c);
}
}
Set<Character> lastvt = new HashSet<>(); // 存储输出结果的集合
while (true) {
int size = lastvt.size(); // 判断是否还有新的非终结符被加入lastvt集合
// 遍历产生式,可以直接推导出终结符的加入到lastvt集合中
for (int i = 0; i < p.length(); i++) {
char c = p.charAt(i);
if (vt.contains(c)) {
lastvt.add(c);
}
}
// 遍历非终结符集合,如果所有产生式右部的所有符号都在lastvt集合中,则该非终结符加入到lastvt集合中
for (char nt : nonTerminals) {
boolean add = true;
for (int i = 0; i < p.length(); i++) {
char c = p.charAt(i);
if (c == nt) {
if (i + 1 < p.length() && Character.isUpperCase(p.charAt(i + 1))) {
if (!lastvt.contains(p.charAt(i + 1))) {
add = false;
break;
}
}
}
}
if (add) {
lastvt.add(nt);
}
}
if (lastvt.size() == size) {
break;
}
}
return lastvt;
}
public static void main(String[] args) {
String p = "A->aB, B->bC, C->cD, D->dE, E->f";
Set<Character> lastvt = lastvt(p);
System.out.println(lastvt);
}
}
```
该代码首先定义了一个`lastvt(p)`方法来实现算法的集合构造过程。在方法中,我们使用了两个`HashSet`对象来存储终结符集合和非终结符集合,并创建了一个名为`lastvt`的`HashSet`对象来存储结果。算法的实现过程中,我们遍历了产生式,将产生式中的终结符放入终结符集合,非终结符放入非终结符集合。然后使用一个循环,不断遍历产生式和非终结符集合,将所有可以直接推导出终结符号的加入到`lastvt`集合中,并判断是否有新的非终结符被加入到`lastvt`集合中。当没有新的非终结符被加入到`lastvt`集合中时,算法结束。最后,我们在`main`方法中调用`lastvt(p)`方法,并输出结果。
该算法的核心思想是通过分析产生式的结构,判断出哪些非终结符可以推导出终结符,然后构建出`lastvt`集合。这样可以帮助我们在语法分析的过程中,判断一个符号串的最后一个终结符集合。
阅读全文