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

📄 npro.java

📁 我写的词法语法分析器
💻 JAVA
字号:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

public class Npro extends JFrame implements ActionListener
{
	
	JButton bu1;
	JTextArea ta1;
	JTextArea ta2;
	String Keyword[]={"char","short","int","unsigned","long",
				"float","double","struct","union","void ",
				"enum","signed","const","volatile","typedef",
				"auto","register","static","extem","break",
				"extem ","break","case ","continue","default",
				"do","while","else","for","goto","if",
				"return","switch","while","sizeof"};
	String D[]={"E","e","T","t","F"};
	String O[]={"i","+","*","(",")","$"} ;



    			String DO[][]= {{"Te","Q","Q","Te","Q","Q"},
					 {"Q","+Te","Q","Q","&","&"},
					 {"Ft","Q","Q","Ft","Q","Q"},
					 {"Q","&","*Ft","Q","&","&"},
					 {"i","Q","Q","(E)","Q","Q"}};


/*
String D[]={"S","Z","W","Y","V","U","E","A","T","B","F","X","C","M"};
String O[]=
{"+","-","*","/","%","=","a","n";"i","e","w","d","f",";","(",")","{","}","r","$"};
String DO[][]= {
{"Q",   "Q", "Q",  "Q",  "Q", "Q",  "Z;", "Q",   "W",    "Q",    "Y",   "V;",    "U",     "Q",  "Q",  "Q", "Q", "Q", "Q", "Q"},
{"Q",   "Q", "Q",  "Q",  "Q", "Q", "a=E", "Q",   "Q",    "Q",    "Q",   "Q",     "Q",     "Q",  "Q",  "Q", "Q", "Q", "Q", "Q"},	
{"Q",   "Q", "Q",  "Q",  "Q", "Q",  "Q",  "Q", "i(M)XC", "Q",    "Q",   "Q",     "Q",     "Q",  "Q",  "Q", "Q", "Q", "Q", "Q"},
{"Q",   "Q", "Q",  "Q",  "Q", "Q",  "Q",  "Q",   "Q",    "Q",  "w(M)X", "Q",     "Q",     "Q",  "Q",  "Q", "Q", "Q", "Q", "Q"},
{"Q",   "Q", "Q",  "Q",  "Q", "Q",  "Q",  "Q",   "Q",    "Q",    "Q",  "dXw",    "Q",     "Q",  "Q",  "Q", "Q", "Q", "Q", "Q"},
{"Q",   "Q", "Q",  "Q",  "Q", "Q",  "Q",  "Q",   "Q",    "Q",    "Q",   "Q", "f(Z;M;Z)X", "Q",  "Q",  "Q", "Q", "Q", "Q", "Q"},
{"Q",   "Q", "Q",  "Q",  "Q", "Q",  "TA", "TA",  "Q",    "Q",    "Q",   "Q",     "Q",     "Q",  "TA", "Q", "Q", "Q", "Q ","Q"},
{"+TA","-TA","Q",  "Q",  "Q", "Q ", "Q",  "Q",   "Q",    "Q",    "Q",   "Q",     "Q",     "&",  "Q",  "&", "Q", "Q", "&", "Q"},
{"Q",   "Q", "Q",  "Q",  "Q", "Q",  "FB", "FB",  "Q",    "Q",    "Q",   "Q",     "Q",     "Q",  "Q",  "FB","Q", "Q", "Q", "Q"},
{"&",   "&","*FB","/FB","%FB","Q",  "Q",  "Q",   "Q",    "Q",    "Q",   "Q",     "Q",     "&",  "Q",  "&", "Q", "Q", "&", "Q"},
{"Q",   "Q", "Q",  "Q",  "Q", "Q",  "a",  "n",   "Q",    "Q",    "Q",   "Q",     "Q",     "Q", "(E)", "Q", "Q", "Q", "Q", "Q"},
{Q ","Q ","Q ","Q ","Q"," Q ","Q   "," Q "," Q "," & "," &  ","    Q ","Q ","Q ","Q ","Q ","{S}"," & ","Q ","&},
{Q"," Q ","Q"," Q ","Q ","Q ","Q   "," Q  ","Q "," eX ","Q     "," Q"," Q"," Q ","Q"," Q"," Q ","& ","Q ","&},
{Q ","Q"," Q"," Q ","Q ","Q"," ErE"," ErE "," Q "," Q "," Q ","    Q"," Q ","&"," ErE"," &"," Q"," Q ","Q"," Q}
}

*/




/*   +  -  *  /  %  =  a  n  i  e  w  d  f  ;  (  )  {  }  r  # 
 S                    Z;     W     Y  V;  U                      
 Z                    a=E                                        
 W                          i(M)XC                                  
 Y                                w(M)X                            
 V                                   dXw                         
 U                                      f(Z;M;Z)X                      
 E                    TA  TA                    TA                
 A  +TA  -TA                                   @     @        @    
 T                    FB  FB                    FB                
 B  @  @  *FB  /FB  %FB                          @     @        @    
 F                    a  n                    (E)                
 X                             @  @                 {S}  @     @ 
 C                             eX                       @     @ 
 M                    ErE  ErE                 @  ErE  @ 


*/            

	
	
	
int yugaochao(String s)				// 保留字
	{	    
		int key;
		int i;
		for(i=0;i<35;i++)
		{
			if(s.equals(Keyword[i]))
			{	key=1;
				return  key;
				}
          }
         key=0;
		return key;
	}

 void analyze(String s1)
	{
	int i;
	int n;
	char[] ch1;	  //ch1 是用来存储s1的数组的形式
	int STATE=0;
	int key=0;
	String s2=new String("");
	ch1=new char[10000];
	ch1=s1.toCharArray();
	STATE=0;
	n=0;
	

while(n<s1.length())
	{
	//System.out.println(s1.length()+"|"+n+"|"+ch1[n]+"|"+STATE);
	//System.out.println(n+ ""+ch1[n]);
	//System.out.println(STATE);
	switch(STATE)
		{
			case 0://System.out.println(n);

				if((ch1[n]==' ')||(ch1[n]=='\t')||(ch1[1]=='\n'||ch1[n]=='\r'))
				{
					STATE=0;
					n++;break;
				}
					
				else if (Character.isDigit(ch1[n]))
					{
					if(Character.isDigit(ch1[n+1])||ch1[n+1]=='E'||ch1[n+1]=='e'||ch1[n+1]=='.')
						{STATE=2;
						n++;break;}
					else
						{
						write('i');
						STATE=0;
						n++;break;
						}
					}
			    else if (Character.isLetter(ch1[n]))
			{		
					if(Character.isLetter(ch1[n+1])||Character.isDigit(ch1[n+1]))
						{	STATE=8;
					//System.out.println(STATE);
					key=n;
						n++;break;}
					else
						{
						write('i');
						STATE=0;
						n++;break;
						}

			}
				else if (ch1[n]=='+')
				{		
					write(ch1[n]);
					STATE=0;
					n++;break;
				}

				
				else if (ch1[n]=='-')
				{		
					write(ch1[n]);
					STATE=0;
					n++;break;
				}
				else if (ch1[n]=='*')
				{		
					write(ch1[n]);
					STATE=0;
					n++;break;
				}
				else if (ch1[n]=='/')
				{		
					write(ch1[n]);
					STATE=0;
					n++;
					break;
				}
				else if (ch1[n]==';')
				{		
					write('\n');
					STATE=0;
					n++;break;
				}
				else if (ch1[n]=='#')
				{		
					System.out.println("jfdslkajf");
				}
				else 
			{System.out.println("错误1");break;}
			case 1://System.out.println(n);
				if(Character.isDigit(ch1[n]))
					
			{
				STATE=2;
				n++;break;
			}
				else 
			{STATE=151;break;}
			case 2://System.out.println(n);
				if(Character.isDigit(ch1[n]))
					{	if(Character.isDigit(ch1[n+1]))
						{n++;
						STATE=2;break;
						}
						
						else if (ch1[n]=='E'||ch1[n]=='e')
							{
							if(ch1[n+1]=='+'||ch1[n+1]=='-'||Character.isDigit(ch1[n+1]))
								{STATE=5;
								n++;break;
								}
								else 
								{System.out.println("错误2");
									break;}
								}
						else if(ch1[n]=='.')
							{	
							if (Character.isDigit(ch1[n+1]))
							{
							
							STATE=3;
								n++;break;}
							else 
									{
								System.out.println("错误3");
									break;}

						
						
						}
						else
						{
							write('i');
							n++;
							STATE=0;break;}
					}
				
			case 3:
				//System.out.println(n);
				if(Character.isDigit(ch1[n]))
			{
				STATE=4;
				n++;break;}
				else 
			{System.out.println("错误4");
					break;}
			case 4:
				//System.out.println(n);
				if(Character.isDigit(ch1[n+1]))
			{
				STATE=4;
				n++;
				break;


			}
				else if (ch1[n]=='E'||ch1[n]=='e')
					{	
						STATE=5;
						n++;
						break;
					}
				else 
					{
							write('i');
							n++;
							STATE=0;break;
					}
				
case 5://System.out.println(n);
				if (ch1[n]=='+'||ch1[n]=='-')
					{STATE=6;
					n++;break;
					}
				else if(Character.isDigit(ch1[n]))
			{		if(Character.isDigit(ch1[n+1]))
					{STATE=7;
						n++;break;
						}
					else
						{
						write('i');
						STATE=0;
						n++;break;
						}

			}
				else 
		{System.out.println("错误5");
				break;}
			case 6://System.out.println(n);
				if(Character.isDigit(ch1[n]))
		{
				if(Character.isDigit(ch1[n+1]))
			{STATE=7;
				n++;break;}
				else
					
						{
						write('i');
						STATE=0;
						n++;break;
						}
		}
				else 
		{System.out.println("错误6");
					break;}
			case 7://System.out.println(n);
							if(Character.isDigit(ch1[n]))
					{if(Character.isDigit(ch1[n+1]))
						{STATE=7;
						n++;break;
						}
							else
								
									{
									write('i');
									STATE=0;
									n++;break;
									}
					}
				else 
		{System.out.println("错误7");
					break;}
			case 8://System.out.println(n);
				if(Character.isLetter(ch1[n])||Character.isDigit(ch1[n]))
					{
				
					if(Character.isLetter(ch1[n+1]))
							{STATE=8;
							n++;break;
							}
						else
					
						{
							//判断是不是关键字
							
							s2=new String(ch1,key,n+1-key);
							//System.out.println(s2+"|"+key+"|"+n);
								if(yugaochao(s2)==0)
									write('i');
								else
									write('c');
								STATE=0;
								n++;break;
						}
					}
				else
				{System.out.println("错误8");
					break;}
			
			
			default:
					{System.out.println("错误9");
			n++;
					break;
					}
				}
		}
				
	}



void syntax(String yugaochao)
	{
						  
		
		int i=0;
		int j=yugaochao.length();
	
		String  X;
		int keydo,keyto,key;
		String a;
		Stack Xo=new Stack();
		Stack To=new Stack();
		Xo.push("$");
		Xo.push("$");
		Xo.push("E");
		To.push("$");
		To.push("$");
		keydo=0;
		keyto=0;
		for(i=j-1;i>=0;i--)
		 {  String go=yugaochao.substring(i,i+1);
			
		
			To.push(go);
		 }
		ta1.setText(ta1.getText()+"\n"+"    "+Xo+"                   "+To+"       ");
		ta2.setText(ta2.getText()+"\n\n"+"化简的结果"+"\n"+yugaochao);
		do{
		X=(String)Xo.peek();

		a=(String)To.peek();

		if(X.equals("i")||X.equals("+")||X.equals("*")||X.equals("(")||X.equals(")")||X.equals("$"))
			{
			
			
			if(X.equals(a))
				{Xo.pop();
					To.pop();
					a=(String)To.peek();
					ta1.setText(ta1.getText()+"\n"+"    "+Xo+"                   "+To+"       ");
				
					
				}
			else {
				System.out.println("error");
				break;
				}
			}
	else {
			for(i=0;i<5;i++)
				{
				if(X.equals(D[i]))
					{	keydo=i;
					}
		
				}
			for(i=0;i<6;i++)
				{if(a.equals(O[i]))
					{keyto=i;
		
					}
				}
			if(!DO[keydo][keyto].equals("Q"))
				{
				Xo.pop();
				key=DO[keydo][keyto].length();
				if(!X.equals("&"))
					{for(i=key;i>0;--i)
				{	Xo.push(DO[keydo][keyto].substring(i-1,i));
					}
					ta1.setText(ta1.getText()+"\n"+"    "+Xo+"              "+To+"               "+X+"------>"+DO[keydo][keyto]);
					}
					
							
						}
			else 
				{
				ta1.setText(ta1.getText()+"\n"+"匹配错误");
				System.out.println("匹配错误");
			break;
			}
			}
		}while(!X.equals("$"));		
	}
	
public Npro(){
		super("新建的文件集");
		Container C = getContentPane();
		C.setLayout(new BorderLayout());
		bu1= new JButton("确定");
		bu1.setLocation(150,50);
		bu1.addActionListener(this);
		C.add("North",bu1);
		ta1=new JTextArea();
		JScrollPane scrollPane2 = new JScrollPane(ta1);
		C.add("Center",scrollPane2 );
		JPanel pan1 = new JPanel();
		pan1.setLayout(new BorderLayout());
		C.add("East",pan1);
		ta2=new JTextArea(5,20);
        JScrollPane scrollPane = new JScrollPane(ta2);
		pan1.add("Center",scrollPane);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(600,500);
		setVisible(true);

}

public static void main(String[] args) {
		Npro frame=new Npro();
	}


public void actionPerformed(ActionEvent e) {
	char buffer[]= new char[2048];
	char buffer1[]= new char[2048];
	FileReader rd1;
	FileReader rd2;
	String str1="";
	String str2="";
	String str3="";
	ta1.setText("");
	try{
		rd1 = new FileReader("432.txt");
		int len1 = rd1.read(buffer);
		rd1.close();
		str1=new String(buffer,0,len1);
		analyze(str1);
		
		rd2 = new FileReader("234.txt");

		BufferedReader br1=new BufferedReader(rd2);
		while((str3=br1.readLine())!=null)


		/*int len2 = rd2.read(buffer1);
		rd2.close();
		str3=new String(buffer1,0,len2);*/
		

		syntax(str3);
		
		
	}catch(IOException e1)
	{return 
		;
	}
}
void write(char ch2)
	{
	try{
	//FileWriter	rd1=new FileWriter("234.txt");
	
	RandomAccessFile in= new RandomAccessFile("234.txt","rw");
	in.seek(in.length());
	in.write(ch2);
	in.close();
	
	//rd1.write(ch2);
	//rd1.close();
	}catch(IOException e1)
		{return 
		;
		}
	
	}
}

⌨️ 快捷键说明

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