public class Test1 {
public static void main(String[] args) {
/*Scanner scanner = new Scanner(System.in);
System.out.println("请输入文法产生式的个数:");
int n = scanner.nextInt();
String inputCss;
CSS[] p = new CSS[n];
for (int k = 0; k < p.length; k++) {
inputCss = scanner.next();
String temp = inputCss.trim();
p[k] = new CSS();
p[k].left = inputCss.split("->")[0];
p[k].right = temp.split("->")[1];
}
scanner.close();
pd(p);*/
StringBuffer token=new StringBuffer();//存放形参的单词
char[] s={'a','b','c'};
for(int i=0;i<s.length;i++){
token.append(s[i]);
}
System.out.println(token.toString());
}
//判断
public static void pd(CSS[] p){
if(type0(p)){
if(type1(p)){
if(type2(p)){
if(type3(p)){
System.out.println("该文法属于3型文法");
}else{
System.out.println("该文法是2型文法");
}
}else{
System.out.println("该文法是1型文法");
}
}else{
System.out.println("该文法是0型文法");
}
}else{
System.out.println("该文法不是0型文法");
}
}
//左部不为空:左部至少含非终结符
public static boolean type0(CSS[] p) {
int i, j;
for (i = 0; i < p.length; i++){
for (j = 0; j < p[i].left.length(); j++){
//不含有非终结符时
if (p[i].left.charAt(j) >= 'A'&&p[i].left.charAt(j) <= 'Z')
break;
}
//该产生式右部没有非终结符
if (j == p[i].left.length()) {
//System.out.println("该文法不是0型文法");
return false;
}
}
// 如果每个产生时都能找到非终结符
if (i == p.length){
return true;
}
return false;
}
//右部大于左部
public static boolean type1(CSS[] p) {
int i;
for (i = 0; i < p.length; i++) {
//若右部不大于左部
if ((p[i].left.length() > p[i].right.length())&& p[i].right.length() != 0)
break;
}
if (i == p.length){
return true;
}else {
//System.out.println("0型文法");
return false;
}
}
//左部只能有一个非终结符
public static boolean type2(CSS[] p) {
int i;
for (i = 0; i < p.length; i++){
if ((p[i].left.length() != 1)|| !(p[i].left.charAt(0) >= 'A' && p[i].left.charAt(0) <= 'Z'))
break;
}
if (i == p.length)
return true;
else {
return false;
}
}
//右部含非终结符
public static boolean type3(CSS[] p){
int i;
for (i = 0; i < p.length; i++){
if ((p[i].right.length() == 0)|| (p[i].right.length() >= 3)|| (p[i].right.charAt(0) >= 'A' && p[i].right.charAt(0) <= 'Z')) // 判断产生式右部字符个数是否在12之间,判断右部第一个字符是否是非终结符
break;
}
if (i == p.length) {
for (i = 0; i < p.length; i++) {
if (p[i].right.length() == 2) {
if (!(p[i].right.charAt(1) >= 'A' && p[i].right.charAt(1) <= 'Z'))
break;
}
}
if (i == p.length) {
return true;
} else {
return false;
}
} else{
return false;
}
}
}
//产生式
class CSS {
String left;
String right;
CSS() {
left = new String();
right = new String();
}
}
/*
* 请输入文法产生式的个数:
1
A->aA
该文法属于3型文法
请输入文法产生式的个数:
1
A->S
该文法是2型文法
请输入文法产生式的个数:
1
aAb->ayb
该文法是1型文法
请输入文法产生式的个数:
1
Aa->b
该文法是0型文法
请输入文法产生式的个数:
1
->s
该文法不是0型文法
*/
编译原理实验-文法类型分析
最新推荐文章于 2022-10-14 18:43:21 发布