import java.io.*;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;



class Parsing_entities
{
	public static void main(String args[])
	{
		try
		{
		FileInputStream f=new FileInputStream("Schema_Parse_Entities.txt");
		//FileInputStream f1=new FileInputStream("Schema_Parse_Types.txt");
		FileInputStream f2=new FileInputStream("ship_schema.exp");
		FileInputStream f3=new FileInputStream("param.txt");
		DataInputStream bf3=new DataInputStream(f3);
		
		FileOutputStream fo=new FileOutputStream("entities_in_types2.txt");
		FileOutputStream fow=new FileOutputStream("test2.txt");
		PrintStream dow=new PrintStream(fow);
		DataInputStream bf=new DataInputStream(f);
		//DataInputStream bf1=new DataInputStream(f1);
		DataInputStream bf2=new DataInputStream(f2);
		PrintStream ds=new PrintStream(fo);
		
		ArrayList<String> arr_list_entity=new ArrayList<String>();
		ArrayList<ent_list> xy=new ArrayList<ent_list>();
		ArrayList<String> arr_list_type=new ArrayList<String>();
		ArrayList<String> param_list=new ArrayList<String>();
		
		boolean type=false;
		boolean end_type=false;
		
		String str_tmp=" ";
		//ArrayList<Integer> arr_list1=new ArrayList<Integer>();
		//PrintStream ds=new PrintStream(fo);
		
		while(bf.available()>0)
		{
			
			String str=bf.readLine();
			str.trim();
			arr_list_entity.add(str);
		
		}
		while(bf3.available()>0)
		{
			
			String str=bf3.readLine();
			str=str.trim();
			param_list.add(str);
		
		}
		//while(bf1.available()>0)
		//{
			
			//String str=bf1.readLine();
			//str.trim();
			//arr_list_type.add(str);
		
	//	}
			
			while(bf2.available()>0)
			{
				String str=bf2.readLine();				
				Pattern pattern = Pattern.compile("^*ENTITY");
				Pattern pattern2 = Pattern.compile("^*END_ENTITY");
				Matcher matcher = pattern.matcher(str);
				Matcher matcher2=pattern2.matcher(str);
				
				if(matcher.find())
				{
					type=true;
				}
				
				if(matcher2.find())
				{
					type=false;
					end_type=false;
				}
				
				if(type&!end_type)
				{
					str_tmp=str_tmp+str;
					
				}
				else
				{
					str_tmp=str_tmp.trim();
						
					//str_tmp=" ";
					System.out.println(str_tmp);
					
					String raavi=" ";
					
					if(str_tmp.indexOf("SUBTYPE OF")>0)
					{
						ent_list ko=new ent_list();
						int pos=str_tmp.indexOf("SUBTYPE OF")+"SUBTYPE OF".length()+1;
						int enti_index=str_tmp.indexOf("ENTITY")+"ENTITY".length();
						if(str_tmp.indexOf("SUPERTYPE OF")>0)
						{
							int super_pos=str_tmp.indexOf("SUPERTYPE OF");
							
							System.out.println("***"+str_tmp.substring(enti_index,super_pos));
							ko.setname(str_tmp.substring(enti_index,super_pos));
							raavi=str_tmp.substring(enti_index,super_pos);
						}
						else
						{
							//if(str_tmp)
						System.out.println("***"+str_tmp.substring(enti_index,str_tmp.indexOf("SUBTYPE OF")));
						ko.setname(str_tmp.substring(enti_index,str_tmp.indexOf("SUBTYPE OF")));
						raavi=str_tmp.substring(enti_index,str_tmp.indexOf("SUBTYPE OF"));
						}
						int poslas=str_tmp.indexOf(';');
						//System.out.println(str_tmp.substring(pos,poslas));
						String qw1=str_tmp.substring(pos+1,poslas-1);
						StringTokenizer str_ghj=new StringTokenizer(qw1,",");
						
						ko.setcas("SUBTYPE OF");
						while(str_ghj.hasMoreTokens())
						{
							//System.out.println(str_ghj.nextToken());
							String vb=str_ghj.nextToken().trim();
							//System.out.println(vb);
							//System.out.println(param_list.indexOf(vb));
							ko.addele(vb);
							
						}
						xy.add(ko);
						}
					
					if(str_tmp.indexOf("SUPERTYPE OF")>0)
					{
						ent_list ko=new ent_list();
						int enti_index=str_tmp.indexOf("ENTITY")+"ENTITY".length();
						int super_pos=str_tmp.indexOf("SUPERTYPE OF");
						System.out.println("***"+str_tmp.substring(enti_index,super_pos));
						raavi=str_tmp.substring(enti_index,super_pos);
						String temp_super=" ";
						int pos_last=str_tmp.indexOf("SUBTYPE OF");
						System.out.println("The name s "+raavi);
						dow.println(raavi);
						ko.setname(raavi);
						if(pos_last>0)
						{
						int pos_init=str_tmp.indexOf("SUPERTYPE OF")+"SUPERTYPE OF".length()+1;
						//System.out.println(str_tmp.substring(pos_init,pos_last));
						String xv=str_tmp.substring(pos_init,pos_last);
						xv=xv.trim();
						//String temp_super=xv.substring(1, xv.length()-2);
						temp_super=xv.substring(1, (xv.length()-1));
						if(xv.indexOf("ONEOF")>0)
						{
							//System.out.println("The Index is"+xv.indexOf("ONEOF"));
							int one_index=xv.indexOf("ONEOF")+"ONEOF".length();
							int one_last_index=xv.indexOf(')');
							temp_super=xv.substring(one_index+2,one_last_index);
						}
						System.out.println("The super is: "+temp_super);
						
						}
						
						else
						{
							int pos_init=str_tmp.indexOf("SUPERTYPE OF")+"SUPERTYPE OF".length()+1;
							int post=str_tmp.indexOf(';');
							//System.out.println(str_tmp.substring(pos_init,post));
							String xv=str_tmp.substring(pos_init,post);
							temp_super=str_tmp.substring(pos_init+1,post-1);
							if(xv.indexOf("ONEOF")>0)
							{
								//System.out.println("The Index is"+xv.indexOf("ONEOF"));
								int one_index=xv.indexOf("ONEOF")+"ONEOF".length();
								int one_last_index=xv.indexOf(')');
								 temp_super=xv.substring(one_index+2,one_last_index);
							}
							//String qw2=str_tmp.substring(pos_init+1,post-1);
							System.out.println("The super is"+temp_super);
						}
						StringTokenizer str_ghj=new StringTokenizer(temp_super,",");
						
						ko.setcas("SUPERTYPE OF");
						while(str_ghj.hasMoreTokens())
						{
							//System.out.println(str_ghj.nextToken());
							String vb=str_ghj.nextToken().trim();
							//System.out.println(vb);
							//System.out.println(param_list.indexOf(vb));
							vb=vb.trim();
							ko.addele(vb);
							
						}
						xy.add(ko);
						
					}
					str_tmp=" ";
				
				//System.out.println("I am here");
				}
				}
			System.out.println(arr_list_entity.size());
			System.out.println("the array size is"+xy.size());
			for(int k=0;k<xy.size();k++)
			{
				//ds.println("");
				//ds.println(xy.get(k).name+":"+xy.get(k).cas);
				System.out.println(xy.get(k).name.trim());
				int p1_index=param_list.indexOf(xy.get(k).name.trim())+8;
				for(int j=0;j<xy.get(k).getsize();j++)
				{
					if(xy.get(k).cas=="SUBTYPE OF")
					{
					ds.println("e,6,"+p1_index+","+(param_list.indexOf(xy.get(k).getele(j).trim())+8));
					}
					if(xy.get(k).cas=="SUPERTYPE OF")
					{
					ds.println("e,5,"+p1_index+","+(param_list.indexOf(xy.get(k).getele(j).trim())+8));
					}
					//ds.print(xy.get(k).getele(j)+" ");
				}
				//ds.println("");
			}
			//for(int i=0;i<arr_list.size();i++)
			//{
				//System.out.println(arr_list.get(i));
			//}
			
			dow.close();
		}catch(Exception e)		
		{
			System.err.println(e);
		}
	
}
		}
		