⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 re2enfa.java

📁 Regular Expression to Epsilon-NFA
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
import java.util.LinkedList;
import java.io.*;
import java.math.*;
import java.util.*;

public class RE2eNFA {
	LinkedList<String> list = new LinkedList<String>();
	LinkedList<Integer> Final = new LinkedList<Integer>();
	LinkedList<Integer> Transport = new LinkedList<Integer>();
	LinkedList<String> text = new LinkedList<String>();
	private String content = "";
	
    public RE2eNFA() {
    }
    public static void main(String[] arg){
    	RE2eNFA RTF = new RE2eNFA();
    	String RE;
    //	RE = "1+";
   		RE = "((0|1)1)*";
    	InfixToPostfix ITP = new InfixToPostfix(RE);
    	System.out.println("Postfix = "+ITP.getPostfix());
    	RTF.linkedList(ITP.getPostfix());
    	RTF.toArray();
    	SVG S1 = new SVG(RTF.toString(),RE);	
    }
	public void toArray(){	
		int[] input0 ,input1,epsilon;				
		int[] nextInput = new int[2];
		int s = 0,c=0, input=0;
		int size = 1;
		while(s< list.size()){
			for(int i =0 ; i<list.get(s).length(); i++){
				if(list.get(s).charAt(i) == 's' || list.get(s).charAt(i) == 'e' ){
					Transport.add(i);
					c++;
				}
				if(list.get(s).charAt(i) == '_'){
					nextInput[input] = i;
					input = 1;
					if(c>size){
						size =c;	
					}					
					c=0;					
				}
			}
			if(c>size){
				size =c;
			}			
			c=0;
			input0= new int[size];
			input1 =new int[size];
			epsilon=new int[size];
			for(int i=0 ; i<size ; i++){
				input0[i] = 0;
				input1[i] = 0;
				epsilon[i] = 0;
			}						
			int i =0;
			int state =1;
			int i2 =0;
			while( nextInput[0] > Transport.get(i)){
				if(list.get(s).charAt(Transport.get(i)+1) != 'n'){
				
					if(nextInput[0] > Transport.get(i+1)){
						state = Integer.parseInt(list.get(s).substring(Transport.get(i)+1,Transport.get(i+1)))+1;												
					}else{
						state = Integer.parseInt(list.get(s).substring(Transport.get(i)+1,nextInput[0]))+1;				
					}
					input0[i] = state;
				}else{
					input0[i] = 0;
				}
				i++;
			}	

			int x =-1, y;	
			while( nextInput[1] > Transport.get(i)){			
				y=0;
				if(list.get(s).charAt(Transport.get(i)+1) != 'n'){
					if(nextInput[1] > Transport.get(i+1)){
				       	state = Integer.parseInt(list.get(s).substring(Transport.get(i)+1,Transport.get(i+1)))+1;
					}else{
						state = Integer.parseInt(list.get(s).substring(Transport.get(i)+1,nextInput[1]))+1;				
					}										
					for(int j =0 ; j<size ; j++){
						if(state == input0[j]){
							x =j;
							y=1;
							if(input1[x] != 0){
								input1[i2] = input1[x];
								i2++;
							}
							input1[x] =state;																					
						}							
					}					
					if(y == 0 ){
						if(i2== x) i2= x+1;
						input1[i2]= state;
						i2++;						
					}																		
				}else{
					input1[i2] =0;
					i2++;					
				}	
				i++;
			}
	
			int i3=0;	
			while(Transport.getLast()!=Transport.get(i)){
				state = Integer.parseInt(list.get(s).substring(Transport.get(i)+1,Transport.get(i+1)))+1;	
				epsilon[i3] = state;
				i3++;
				i++;
			}	
			if(Transport.getLast()==Transport.get(i)){
				if(list.get(s).charAt(Transport.getLast()+1) != 'n'){
					state= Integer.parseInt(list.get(s).substring(Transport.getLast()+1,list.get(s).length()))+1;
					epsilon[i3] =state;
				}				
			}	
			input =0;
			Transport.clear();
			for(int j=0; j<size ;j++){
				if(input0[j] == 0){
					content+=s+",0,n,";
				}else{
					content+= s+",0,"+(input0[j]-1)+",";
				}
				
				if(input1[j] ==0){
					content += "n,";
				}else{
					content += (input1[j]-1)+",";
				}
				
				if(epsilon[j] ==0){
					content += "n\n";
				}else{
					content += (epsilon[j]-1)+"\n";
				}
				
			}		
			size=1;								
			s++;						
		}
		System.out.println("state at,final,input=0,input=1,input=e");
		System.out.println(content);
		System.out.println("::::::::::::::::::::::::::::::::::::::");				
	}
	public String toString(){
		return content;
	}
    public void  linkedList(String Re){
    	int n,m;
    	Final.add(0);
    	for(int i=0 ;i <Re.length() ; i++){
    		
    		if(Re.charAt(i) == '0' ){
    			n = Final.getLast();
    			if(Final.size()==1){
    				list.add("s"+1+"_sn_en"); 
    			}else{    					
    				list.add("s"+(n+2)+"_sn_en");  	
    			}
    			list.add("sn_sn_en");    			
    			Final.add(list.size()-1);    			

    		}else if(Re.charAt(i)== '1'){
    			n = Final.getLast();
    			if(Final.size()==1){
    				list.add("sn_s"+1+"_en");    	
    			}else{
    				list.add("sn_s"+(n+2)+"_en");    	
    			}
    			list.add("sn_sn_en");
    			Final.add(list.size()-1);
    			
    		}else if(Re.charAt(i)=='e'){
    			n = Final.getLast();
    			if(Final.size()==1){
    				list.add("sn_sn_e"+1);
    			}else{    			    			
    				list.add("sn_sn_e"+(n+2));
    			}
    			list.add("sn_sn_en");
				Final.add(list.size()-1);    
					
							
			}else if(Re.charAt(i)== '.'){
				n=Final.getLast();
				m =Final.get(Final.size()-2);
				Final.remove(Final.size()-2);
    			String t = list.get(m);
    			for(int j=0; j<t.length();j++){
    				if(t.charAt(j)=='e'){
    					if(t.charAt(j+1)== 'n'){
    						list.set(m,t.substring(0,(j+1)) + (m+1));  // snsnen > snsne5
    					}else{
    						list.set(m,t+"e"+(m+1)); // snsne2 > snsne2e5
    					}    						
    				}    			
    			}    			    			
    				
			}else if(Re.charAt(i)=='?'){
				n= Final.getLast();
    			m = Final.get(Final.size()-2);
    			String t = list.getLast();
    			
    			/*........   S2--(e)-->S3 ................*/
    			for(int j=0; j< list.get(n).length() ;j++){
    				if(t.charAt(j)=='e'){
    					if(t.charAt(j+1)== 'n'){
    					
    						if(Final.size() ==2){
    							list.set(n,list.getLast().substring(0,(j+1)) + (n+1));  // snsnen > snsne5
    						}else{
    							list.set(n,list.getLast().substring(0,(j+1)) + (n+1)); 
    						}
    					
    						
    					}else{
    						if(Final.size() ==2){   						
    							list.set(n,list.getLast()+"e"+(n+1)); // snsne2 > snsne2e5    							
    						}else{
    							list.set(n,list.getLast()+"e"+(n+1)); // snsne2 > snsne2e5
    						}
    					}
    					break;
    				}
    			}
    			/*....  s1<---(e)(x)---->s2--(e)-->s3 .....*/ // create s3
    			list.add("sn_sn_en");
    		
    			/*...   s1--(e)-->s2<---(e)(x)---->s3--(e)-->s4 ...*/ // create s1
    			if(Final.size()==2){
    				list.add(0,"sn_sn_e1");
    			}else{
    				list.add(m+1,"sn_sn_e"+(m+1));
    			}
    			Final.set((Final.size()-1),(list.size()-1));
			
    			/* shift data of list between s2 and s4 */
    			shiftList(m+1);

    			/*.... s1----(e)--->s4 ....*/
    			if(Final.size()==2){    			
    				list.set(m,list.get(m)+"e"+Final.getLast());  
    			}else{
    				list.set(m+1,list.get(m+1)+"e"+Final.getLast());  
    			}
    			
			
			}else if(Re.charAt(i)=='+'){
    			n= Final.getLast();
    			m = Final.get(Final.size()-2);
    			String t = list.getLast();
    			
    			/*........   S2--(e)-->S3 ................*/
    			/*........   S1<--(e)-- S2  ..............*/
    			for(int j=0; j< list.get(n).length() ;j++){
    				if(t.charAt(j)=='e'){
    					if(t.charAt(j+1)== 'n'){
    						
    						if(Final.size() ==2){
    							list.set(n,list.getLast().substring(0,(j+1)) + (n+1)+"e"+(m));  // snsnen > snsne5
    						}else{
    							list.set(n,list.getLast().substring(0,(j+1)) + (n+1)+"e"+(m+1)); 
    						}
    					
    						
    					}else{
    						if(Final.size() ==2){   						
    							list.set(n,list.getLast()+"e"+(n+1)+"e"+(m)); // snsne2 > snsne2e5    							
    						}else{
    							list.set(n,list.getLast()+"e"+(n+1)+"e"+(m+1)); // snsne2 > snsne2e5
    						}
    					}
    					break;
    				}
    			}
    			/*....  s1<---(e)(x)---->s2--(e)-->s3 .....*/ // create s3
    			list.add("sn_sn_en");
    		
    			/*...   s1--(e)-->s2<---(e)(x)---->s3--(e)-->s4 ...*/ // create s1
    			if(Final.size()==2){
    				list.add(0,"sn_sn_e1");
    			}else{
    				list.add(m+1,"sn_sn_e"+(m+1));
    			}
    			Final.set((Final.size()-1),(list.size()-1));
			
    			/* shift data of list between s2 and s4 */
    			shiftList(m+1);

    		
			 
			
    		}else if(Re.charAt(i)=='*'){
    			n= Final.getLast();
    			m = Final.get(Final.size()-2);
    			String t = list.getLast();
    			
    			/*........   S2--(e)-->S3 ................*/
    			/*........   S1<--(e)-- S2  ..............*/
    			for(int j=0; j< list.get(n).length() ;j++){
    				if(t.charAt(j)=='e'){
    					if(t.charAt(j+1)== 'n'){
    						if(Final.size() ==2){
    							list.set(n,list.getLast().substring(0,(j+1)) + (n+1)+"e"+(m));  // snsnen > snsne5
    						}else{
    							list.set(n,list.getLast().substring(0,(j+1)) + (n+1)+"e"+(m+1)); 
    						}
    					
    						
    					}else{
    						if(Final.size() ==2){   						
    							list.set(n,list.getLast()+"e"+(n+1)+"e"+(m)); // snsne2 > snsne2e5    							
    						}else{
    							list.set(n,list.getLast()+"e"+(n+1)+"e"+(m+1)); // snsne2 > snsne2e5
    						}
    					}
    					break;
    				}
    			}
    			/*....  s1<---(e)(x)---->s2--(e)-->s3 .....*/ // create s3
    			list.add("sn_sn_en");
    		
    			/*...   s1--(e)-->s2<---(e)(x)---->s3--(e)-->s4 ...*/ // create s1
    			if(Final.size()==2){
    				list.add(0,"sn_sn_e1");
    			}else{
    				list.add(m+1,"sn_sn_e"+(m+1));
    			}
    			Final.set((Final.size()-1),(list.size()-1));
			
    			/* shift data of list between s2 and s4 */
    			shiftList(m+1);

    			/*.... s1----(e)--->s4 ....*/
    			if(Final.size()==2){    			
    				list.set(m,list.get(m)+"e"+Final.getLast());  
    			}else{
    				list.set(m+1,list.get(m+1)+"e"+Final.getLast());  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -