JAVA设计算法求解FIRSTVT(P)和LASTVT(P)

1.啥也不说了,上才艺

自己用改两个Set()函数和NonTer非终结符数组

package main;

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

public class FL {
	static Map<String,String> map = new HashMap<String,String>();//保存文法的map
	static String[] NonTer= {"E","T","F","P"};//文法的非终结符
	static String[] First=new String[20];//First保存的数组
	static String[] Last=new String[20];//Last保存的数组
	public static void Set(){//定义文法
		map.put("E","T+E|T");
		map.put("T","FT|F");
		map.put("F","P*F|P");
		map.put("P","(E)|a|b|^");
	}	
	public static void Firstvt(){//求非终结符的First
		//求p-a&p-Qa
		for (int i=0;i<NonTer.length;i++) {
			String[] a=map.get(NonTer[i]).split("\\|");
			First[i]="";
			for (int j=0;j<a.length;j++) {
					if (!Character.isUpperCase(a[j].charAt(0))) {
						First[i]=First[i]+a[j].charAt(0)+',';
					}else if(a[j].length()>2) {
						if (Character.isUpperCase(a[j].charAt(0))&&!Character.isUpperCase(a[j].charAt(1))) {
							First[i]=First[i]+a[j].charAt(1)+',';
						}
					}
			}
		}
		//求p-Q  First(P)= First(P)+ First(Q)
		for (int i=NonTer.length-1;i>=0;i--) {
			String[] a=map.get(NonTer[i]).split("\\|");
			for (int j=0;j<a.length;j++) {
				for (int k=0;k<NonTer.length;k++)
					if (a[j].charAt(0)==NonTer[k].charAt(0)) {//去重
						if (First[i].indexOf(First[k])==-1)
							First[i]=First[i]+First[k];
					}
			}
		}
		for (int i=NonTer.length-1;i>=0;i--) {//去掉末尾逗号
			if (First[i].length()>0)
			First[i] = First[i].substring(0,First[i].length()-1);
		}				
	}
	public static void Lastvt(){
		for (int i=0;i<NonTer.length;i++) {
			String[] a=map.get(NonTer[i]).split("\\|");
			Last[i]="";
			for (int j=0;j<a.length;j++) {
					if (!Character.isUpperCase(a[j].charAt(a[j].length()-1))) {
						Last[i]=Last[i]+a[j].charAt(a[j].length()-1)+',';
					}else if(a[j].length()>2) {
						if (Character.isUpperCase(a[j].charAt(a[j].length()-1))&&!Character.isUpperCase(a[j].charAt(a[j].length()-2))) {
							Last[i]=Last[i]+a[j].charAt(a[j].length()-2)+',';
						}
					}
			}
		}
		
		for (int i=NonTer.length-1;i>=0;i--) {
			String[] a=map.get(NonTer[i]).split("\\|");
			for (int j=0;j<a.length;j++) {
				for (int k=0;k<NonTer.length;k++)
					if (a[j].charAt(a[j].length()-1)==NonTer[k].charAt(0)) {//去重
						if (Last[i].indexOf(Last[k])==-1)
							Last[i]=Last[i]+Last[k];
					}
			}		
		}
		for (int i=NonTer.length-1;i>=0;i--) {//去掉末尾逗号
			if (Last[i].length()>0)
				Last[i] = Last[i].substring(0,Last[i].length()-1);
		}		
	}
	public static void main(String[] args) {
		Set();//定义文法
		Firstvt();//求First
		Lastvt();
		for (int i=0;i<NonTer.length;i++) {
			System.out.println("First("+NonTer[i]+")="+"{"+First[i]+"}");//输出First
		}
		for (int i=0;i<NonTer.length;i++) {
			System.out.println("Last("+NonTer[i]+")="+"{"+Last[i]+"}");//输出Last
		}
		//String[] a=map.get("E").split("\\|");
		
	}	

}

输出结果如下:
在这里插入图片描述

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值