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

📄 dfa.java

📁 自己写的一个用java实现的一个语法分析器
💻 JAVA
字号:
package Syntax;

public class DFA {
	private int max=20;//当前最多闭包个数
	private int increment=5;
	private int current=0;//当前闭包个数
	private int snum=0;//记录产生式个数
   // private int cnum=0;//记录字符个数
	String info="";
	private Closure[] I; 
	private Sentences ss;
	private Characters cs;
	public DFA()
	{
		this.I=new Closure[max];
	}
	private void increase()
	{
		int temp=max;
		max+=increment;
		Closure[] c=new Closure[max];
		for(int i=0;i<temp;i++)
		{
			c[i]=I[i];
		}
		I=c;
	}
	public void add(Closure c)
	{
		if(current==max)increase();
		I[current++]=c;
	}
	private void clear()
	{
		current=0;
		I=new Closure[max];
	}
	
	public String initialize(Sentences ss,Characters cs)
	{
		String error_info="";
		Sentence s;
		int i=0;
		int temp;
		this.ss=ss;
		this.cs=cs;
		int partition=cs.partition;//终结符与非终结符分界
		snum=ss.getCurrent();
		I[0]=new Closure();
		I[0].addItem(0);
		I[0].c_queue.insert(partition+1);
		current++;
		///////开始计算I[0]的闭包//////
		computer_closure();
		
		/*while(i<current)
		{
			while(!I[i].c_queue.isEmpty())//产生下一个闭包
			{
				temp=I[i].c_queue.remove();
				Closure c=go(I[i],temp);
			}
		}
		//s=sentences.getSentences(i);*/
		return error_info;
	}
	public Closure go(Closure I,int index)
	{
		Closure c=new Closure();
		return c;
	}
	public void computer_closure()
	{
		int c=current-1;//当前闭包序号
		int partition=cs.partition;//终结符与非终结符分界
		int i=0;//当前闭包中的第一个产生式
		int index;//产生式索引
		int d;//加点处
		int right;
		int temp;
		Queue q;
		int num=I[c].nitem;
		while(i<num)//<=闭包中的产生式个数
		{
			index=I[c].items[i].s_index;//当前闭包的第i个产生式的索引
			d=I[c].items[i].dot_at;
			right=ss.sentences[index].getRight(d);
			if(right==-1)I[c].items[i].shift=false;//标记为归约项
			else 
			{
				if(!I[c].c_queue.find(right))I[c].c_queue.insert(right);
				if(right>partition)
				{
					q=ss.findSentence(right);
					while(!q.isEmpty())
					{
						temp=q.remove();//info+=temp;
						if(!I[c].findItem(temp, 0))I[c].addItem(temp);
					}
				}
			}
			num=I[c].nitem;//info+=I[c].nitem;
			i++;//info+=I[c].nitem+""+i;
		}
	}
	public String show_dfa()
	{
		for(int i=0;i<current;i++)
		{
			info+=" I["+i+"]:\n";
			for(int j=0;j<I[i].nitem;j++)
			{
				int s=I[i].items[j].s_index;
				int d=I[i].items[j].dot_at;
				info+=ss.showSingle(s,d);
			}
			for(int k=0;k<I[i].c_queue.size();k++)
			{
				info+=cs.getCharacter(I[i].c_queue.peek(k))+",";
			}
			info+="\n";
		}
		return info;
	}

}

⌨️ 快捷键说明

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